Index: /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 5904)
+++ /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 5905)
@@ -98,17 +98,21 @@
         // Add referrer, unless the object to purge is not new
         // and the parent is a relation
+        HashSet<OsmPrimitive> toPurgeRecursive = new HashSet<OsmPrimitive>();
         while (!toPurge.isEmpty()) {
-            OsmPrimitive osm = toPurge.iterator().next();
-            for (OsmPrimitive parent: osm.getReferrers()) {
-                if (toPurge.contains(parent) || toPurgeChecked.contains(parent)) {
-                    continue;
-                }
-                if (parent instanceof Way || (parent instanceof Relation && osm.isNew())) {
-                    toPurgeAdditionally.add(parent);
-                    toPurge.add(parent);
-                }
-            }
-            toPurge.remove(osm);
-            toPurgeChecked.add(osm);
+
+            for (OsmPrimitive osm: toPurge) {
+                for (OsmPrimitive parent: osm.getReferrers()) {
+                    if (toPurge.contains(parent) || toPurgeChecked.contains(parent) || toPurgeRecursive.contains(parent)) {
+                        continue;
+                    }
+                    if (parent instanceof Way || (parent instanceof Relation && osm.isNew())) {
+                        toPurgeAdditionally.add(parent);
+                        toPurgeRecursive.add(parent);
+                    }
+                }
+                toPurgeChecked.add(osm);
+            }
+            toPurge = toPurgeRecursive;
+            toPurgeRecursive = new HashSet<OsmPrimitive>();
         }
 
Index: /trunk/src/org/openstreetmap/josm/command/PurgeCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/PurgeCommand.java	(revision 5904)
+++ /trunk/src/org/openstreetmap/josm/command/PurgeCommand.java	(revision 5905)
@@ -133,4 +133,7 @@
         List<OsmPrimitive> out = new ArrayList<OsmPrimitive>(in.size());
 
+        // Nodes not deleted in the first pass
+        Set<OsmPrimitive> remainingNodes = new HashSet<OsmPrimitive>(in.size());
+
         /**
          *  First add nodes that have no way referrer.
@@ -143,4 +146,6 @@
                     for (OsmPrimitive ref : n.getReferrers()) {
                         if (ref instanceof Way && in.contains(ref)) {
+                            it.remove();
+                            remainingNodes.add(n);
                             continue outer;
                         }
@@ -154,22 +159,21 @@
          * Then add all ways, each preceded by its (remaining) nodes.
          */
-        top: while (!in.isEmpty()) {
-            for (Iterator<OsmPrimitive> it = in.iterator(); it.hasNext();) {
-                OsmPrimitive u = it.next();
-                if (u instanceof Way) {
-                    Way w = (Way) u;
-                    it.remove();
-                    for (Node n : w.getNodes()) {
-                        if (in.contains(n)) {
-                            in.remove(n);
-                            out.add(n);
-                        }
-                    }
-                    out.add(w);
-                    continue top;
-                }
-            }
-            break; // no more ways left
-        }
+        for (Iterator<OsmPrimitive> it = in.iterator(); it.hasNext();) {
+            OsmPrimitive u = it.next();
+            if (u instanceof Way) {
+                Way w = (Way) u;
+                it.remove();
+                for (Node n : w.getNodes()) {
+                    if (remainingNodes.contains(n)) {
+                        remainingNodes.remove(n);
+                        out.add(n);
+                    }
+                }
+                out.add(w);
+            }
+        }
+
+        if (!remainingNodes.isEmpty())
+            throw new AssertionError("topo sort algorithm failed (nodes remaining)");
 
         /**
