Index: /applications/editors/josm/plugins/reverter/src/reverter/DataSetCommandMerger.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/DataSetCommandMerger.java	(revision 30007)
+++ /applications/editors/josm/plugins/reverter/src/reverter/DataSetCommandMerger.java	(revision 30008)
@@ -4,7 +4,9 @@
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
@@ -32,5 +34,5 @@
 
     private final List<Command> cmds = new LinkedList<Command>();
-    private final List<OsmPrimitive> undeletedPrimitives = new LinkedList<OsmPrimitive>();
+    private final List<OsmPrimitive> nominalRevertedPrimitives = new LinkedList<OsmPrimitive>();
 
     /**
@@ -43,8 +45,11 @@
     }
     
-    private void addChangeCommandIfNotEquals(OsmPrimitive target, OsmPrimitive newTarget) {
+    private void addChangeCommandIfNotEquals(OsmPrimitive target, OsmPrimitive newTarget, boolean nominal) {
         if (!target.hasEqualSemanticAttributes(newTarget)) {
             cmds.add(new ChangeCommand(target,newTarget));
-            undeletedPrimitives.add(target);
+            if (nominal) {
+                nominalRevertedPrimitives.add(target);
+            }
+            Main.debug("Reverting "+target+" to "+newTarget);
         }
     }
@@ -77,5 +82,5 @@
         Node newTarget = new Node(target);
         mergePrimitive(source, target, newTarget);
-        addChangeCommandIfNotEquals(target,newTarget);
+        addChangeCommandIfNotEquals(target,newTarget,true);
     }
 
@@ -92,16 +97,18 @@
         if (!source.isVisible()) return;
         Way target = (Way)getMergeTarget(source);
+        
+        Collection<Conflict<OsmPrimitive>> localConflicts = new ArrayList<Conflict<OsmPrimitive>>();
 
         List<Node> newNodes = new ArrayList<Node>(source.getNodesCount());
         for (Node sourceNode : source.getNodes()) {
             Node targetNode = (Node)getMergeTarget(sourceNode);
-            if (!targetNode.isDeleted() || undeletedPrimitives.contains(targetNode)) {
+            // Target node is not deleted or it will be undeleted when running existing commands
+            if (!targetNode.isDeleted() || nominalRevertedPrimitives.contains(targetNode)) {
                 newNodes.add(targetNode);
-            } else if (sourceNode.isIncomplete()
-                    && !conflicts.hasConflictForMy(targetNode)) {
-                conflicts.add(new Conflict<OsmPrimitive>(targetNode, sourceNode, true));
-                Node undeletedTargetNode = new Node(targetNode);
-                undeletedTargetNode.setDeleted(false);
-                addChangeCommandIfNotEquals(targetNode,undeletedTargetNode);
+            // Target node has been deleted by a more recent changeset -> conflict
+            } else if (sourceNode.isIncomplete() && !conflicts.hasConflictForMy(targetNode)) {
+                localConflicts.add(new Conflict<OsmPrimitive>(targetNode, sourceNode, true));
+            } else {
+                Main.info("Skipping target node "+targetNode+" for source node "+sourceNode+" while reverting way "+source);
             }
         }
@@ -109,5 +116,17 @@
         mergePrimitive(source, target, newTarget);
         newTarget.setNodes(newNodes);
-        addChangeCommandIfNotEquals(target,newTarget);
+        if (newNodes.isEmpty()) {
+            Main.error("Unable to revert "+source+" as it produces 0 nodes way "+newTarget);
+        } else {
+            for (Conflict<OsmPrimitive> c : localConflicts) {
+                Main.warn("New conflict: "+c);
+                conflicts.add(c);
+                Node targetNode = (Node)c.getTheir();
+                Node undeletedTargetNode = new Node(targetNode);
+                undeletedTargetNode.setDeleted(false);
+                addChangeCommandIfNotEquals(targetNode,undeletedTargetNode,false);
+            }
+            addChangeCommandIfNotEquals(target,newTarget,true);
+        }
     }
 
@@ -137,5 +156,5 @@
                 }
                 undeletedTargetMember.setDeleted(false);
-                addChangeCommandIfNotEquals(targetMember,undeletedTargetMember);
+                addChangeCommandIfNotEquals(targetMember,undeletedTargetMember,false);
             }
             newMembers.add(new RelationMember(sourceMember.getRole(), targetMember));
@@ -144,5 +163,5 @@
         mergePrimitive(source, target, newRelation);
         newRelation.setMembers(newMembers);
-        addChangeCommandIfNotEquals(target,newRelation);
+        addChangeCommandIfNotEquals(target,newRelation,true);
     }
     
