Index: src/reverter/ChangesetReverter.java
===================================================================
--- src/reverter/ChangesetReverter.java	(revision 35555)
+++ src/reverter/ChangesetReverter.java	(working copy)
@@ -14,6 +14,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
@@ -27,6 +28,7 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -444,10 +446,12 @@
         /* Check referrers for deleted objects: if object is referred by another object that
          * isn't going to be deleted or modified, create a conflict.
          */
-        for (Iterator<OsmPrimitive> it = toDelete.iterator(); it.hasNext();) {
-            OsmPrimitive p = it.next();
+		List<OsmPrimitive> delSorted = toDelete.stream()
+				.sorted(OsmPrimitiveComparator.orderingRelationsWaysNodes())
+				.collect(Collectors.toList());
+        for (OsmPrimitive p : delSorted) {
             if (p.isDeleted()) {
-                it.remove();
+                toDelete.remove(p);
                 continue;
             }
             for (OsmPrimitive referrer : p.getReferrers()) {
@@ -460,7 +464,7 @@
                     cmds.add(new ConflictAddCommand(layer.data, createConflict(p, true)));
                     conflicted.add(p);
                 }
-                it.remove();
+                toDelete.remove(p);
                 break;
             }
         }
