Index: src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Way.java	(revision 3592)
+++ src/org/openstreetmap/josm/data/osm/Way.java	(working copy)
@@ -5,8 +5,8 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
@@ -293,14 +293,35 @@
         }
     }
 
-    public void removeNodes(Collection<? extends OsmPrimitive> selection) {
+    public void removeNodes(Set<? extends OsmPrimitive> selection) {
         if (isIncomplete()) return;
         boolean locked = writeLock();
         try {
-            for(OsmPrimitive p : selection) {
-                if (p instanceof Node) {
-                    removeNode((Node)p);
+
+            //test if there is anything to remove
+            int nodesToRemove = 0;
+            for (Node n: nodes) {
+                nodesToRemove ++;
+            }
+
+            if (nodesToRemove > 0) {
+
+                boolean closed = (lastNode() == firstNode() && selection.contains(lastNode()));
+                List<Node> copy = new ArrayList<Node>(this.getNodesCount() - nodesToRemove);
+
+                for (Node n: nodes) {
+                    if (!selection.contains(n)) {
+                        copy.add(n);
+                    }
                 }
+
+                int i = copy.size();
+                if (closed && i > 2) {
+                    copy.add(copy.get(0));
+                } else if (i >= 2 && i <= 3 && copy.get(0) == copy.get(i-1)) {
+                    copy.remove(i-1);
+                }
+                setNodes(copy);
             }
         } finally {
             writeUnlock(locked);
