diff --git a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
--- a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
@@ -135,7 +135,11 @@ public class SimplifyWayAction extends JosmAction {
      * in order to simplify the way.
      */
     protected boolean isRequiredNode(Way way, Node node) {
-        boolean isRequired = Collections.frequency(way.getNodes(), node) > 1;
+        int frequency = Collections.frequency(way.getNodes(), node);
+        if ((way.getNode(0) == node) && (way.getNode(way.getNodesCount()-1) == node)) {
+            frequency = frequency - 1; // closed way closing node counted only once
+        }
+        boolean isRequired = frequency > 1;
         if (!isRequired) {
             List<OsmPrimitive> parents = new LinkedList<>();
             parents.addAll(node.getReferrers());
@@ -190,6 +194,22 @@ public class SimplifyWayAction extends JosmAction {
             i++;
         }
 
+        if ((newNodes.size() > 3) && (newNodes.get(0) == newNodes.get(newNodes.size()-1))) {
+            // Closed way, check if the first node could also be simplified ...
+            if ( ! isRequiredNode(w, newNodes.get(0))) {
+                List<Node> l1 = new ArrayList<>(3);
+                l1.add(newNodes.get(newNodes.size()-2));
+                l1.add(newNodes.get(0));
+                l1.add(newNodes.get(1));
+                List<Node> l2 = new ArrayList<>(3);
+                buildSimplifiedNodeList(l1, 0, 2, threshold, l2);
+                if ( ! l2.contains(l1.get(1))) {
+                    newNodes.remove(0); // remove the first node
+                    newNodes.set(newNodes.size()-1, newNodes.get(0)); // close the way
+                }
+            }
+        }
+
         Set<Node> delNodes = new HashSet<>();
         delNodes.addAll(w.getNodes());
         delNodes.removeAll(newNodes);
