Index: /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 21663)
+++ /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 21664)
@@ -181,5 +181,12 @@
             }
         }
-        layer.mergeFrom(rdr.parseOsm(monitor));
+        DataSet source = rdr.parseOsm(monitor); 
+        for (OsmPrimitive p : source.allPrimitives()) {
+            if (!p.isVisible() && !p.isDeleted()) {
+                p.setDeleted(true);
+                p.setModified(false);
+            }
+        }
+        layer.mergeFrom(source);
         missing.clear();
     }
@@ -205,6 +212,7 @@
         
         //////////////////////////////////////////////////////////////////////////
-        // Create commands to restore/update all affected objects 
-        LinkedList<Command> cmds = new DataSetToCmd(nds,ds).getCommandList();
+        // Create commands to restore/update all affected objects
+        DataSetToCmd merger = new DataSetToCmd(nds,ds);
+        LinkedList<Command> cmds = merger.getCommandList();
 
         //////////////////////////////////////////////////////////////////////////
@@ -230,4 +238,9 @@
         
         HashSet<OsmPrimitive> conflicted = new HashSet<OsmPrimitive>();
+        
+        for (Conflict<? extends OsmPrimitive> conflict : merger.getConflicts()) {
+            cmds.add(new ConflictAddCommand(layer,conflict));
+        }
+        
         // Check objects versions
         Iterator<ChangesetDataSetEntry> iterator = cds.iterator();
@@ -251,4 +264,8 @@
          */
         for (OsmPrimitive p : toDelete.toArray(new OsmPrimitive[0])) {
+            if (p.isDeleted()) {
+                toDelete.remove(p);
+                continue;
+            }
             for (OsmPrimitive referrer : p.getReferrers()) {
                 if (toDelete.contains(referrer)) continue; // object is going to be deleted
Index: /applications/editors/josm/plugins/reverter/src/reverter/DataSetToCmd.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/DataSetToCmd.java	(revision 21663)
+++ /applications/editors/josm/plugins/reverter/src/reverter/DataSetToCmd.java	(revision 21664)
@@ -10,4 +10,6 @@
 import org.openstreetmap.josm.command.ChangeNodesCommand;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.conflict.ConflictCollection;
 import org.openstreetmap.josm.data.osm.*;
 
@@ -19,4 +21,6 @@
 final class DataSetToCmd {
 
+    /** the collection of conflicts created during merging */
+    private final ConflictCollection conflicts = new ConflictCollection();
     /** the source dataset where primitives are merged from */
     private final DataSet sourceDataSet;
@@ -97,4 +101,11 @@
         for (Node sourceNode : source.getNodes()) {
             Node targetNode = (Node)getMergeTarget(sourceNode);
+            if (targetNode.isDeleted() && sourceNode.isIncomplete()
+                    && !conflicts.hasConflictForMy(targetNode)) {
+                conflicts.add(new Conflict<OsmPrimitive>(targetNode, sourceNode, true));
+                Node undeletedTargetNode = new Node(targetNode);
+                undeletedTargetNode.setDeleted(false);
+                cmds.add(new ChangeCommand(targetNode,undeletedTargetNode));
+            }
             newNodes.add(targetNode);
         }
@@ -116,4 +127,17 @@
         for (RelationMember sourceMember : source.getMembers()) {
             OsmPrimitive targetMember = getMergeTarget(sourceMember.getMember());
+            if (targetMember.isDeleted() && sourceMember.getMember().isIncomplete()
+                    && !conflicts.hasConflictForMy(targetMember)) {
+                conflicts.add(new Conflict<OsmPrimitive>(targetMember, sourceMember.getMember(), true));
+                OsmPrimitive undeletedTargetMember;
+                switch(targetMember.getType()) {
+                case NODE: undeletedTargetMember = new Node((Node)targetMember); break;
+                case WAY: undeletedTargetMember = new Way((Way)targetMember); break;
+                case RELATION: undeletedTargetMember = new Relation((Relation)targetMember); break;
+                default: throw new AssertionError();
+                }
+                undeletedTargetMember.setDeleted(false);
+                cmds.add(new ChangeCommand(targetMember,undeletedTargetMember));
+            }
             newMembers.add(new RelationMember(sourceMember.getRole(), targetMember));
         }
@@ -138,3 +162,12 @@
         return cmds;
     }
+
+    /**
+     * replies the map of conflicts
+     *
+     * @return the map of conflicts
+     */
+    public ConflictCollection getConflicts() {
+        return conflicts;
+    }
 }
