Index: /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 21674)
+++ /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 21675)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.ChangesetDataSet;
@@ -25,4 +26,5 @@
 import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetDataSetEntry;
 import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetModificationType;
+import org.openstreetmap.josm.data.osm.history.HistoryNode;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
 import org.openstreetmap.josm.data.osm.history.HistoryRelation;
@@ -129,11 +131,13 @@
             } else throw new AssertionError();
         }
-        
-        /* Create list of objects that created or modified my the changeset but
-         * doesn't present in the current dataset. 
-         */
-        missing.clear();
+    }
+    public void checkMissingCreated() {
         addMissingHistoryIds(created);
+    }
+    public void checkMissingUpdated() {
         addMissingHistoryIds(updated);
+    }
+    public void checkMissingDeleted() {
+        addMissingHistoryIds(deleted);
     }
 
@@ -166,4 +170,5 @@
     
     public void downloadMissingPrimitives(ProgressMonitor monitor) throws OsmTransferException {
+        if (!hasMissingObjects()) return;
         MultiFetchServerObjectReader rdr = new MultiFetchServerObjectReader();
         for (PrimitiveId id : missing) {
@@ -204,4 +209,35 @@
     }
     
+    private static boolean hasEqualSemanticAttributes(OsmPrimitive current,HistoryOsmPrimitive history) {
+        if (!current.getKeys().equals(history.getTags())) return false;
+        switch (current.getType()) {
+        case NODE:
+            return new LatLon(((Node)current).getCoor()).equals(((HistoryNode)history).getCoords());
+        case WAY:
+            List<Node> currentNodes = ((Way)current).getNodes();
+            List<Long> historyNodes = ((HistoryWay)history).getNodes();
+            if (currentNodes.size() != historyNodes.size()) return false;
+            for (int i = 0; i < currentNodes.size(); i++) {
+                if (currentNodes.get(i).getId() != historyNodes.get(i)) return false;
+            }
+            return true;
+        case RELATION:
+            List<org.openstreetmap.josm.data.osm.RelationMember> currentMembers = 
+                ((Relation)current).getMembers();
+            List<RelationMember> historyMembers = ((HistoryRelation)history).getMembers();
+            if (currentMembers.size() != historyMembers.size()) return false;
+            for (int i = 0; i < currentMembers.size(); i++) {
+                org.openstreetmap.josm.data.osm.RelationMember currentMember = 
+                    currentMembers.get(i);
+                RelationMember historyMember = historyMembers.get(i);
+                if (!currentMember.getRole().equals(historyMember.getRole())) return false;
+                if (currentMember.getMember().getPrimitiveId().equals(new SimplePrimitiveId(
+                        historyMember.getPrimitiveId(),historyMember.getPrimitiveType()))) return false;
+            }
+            return true;
+        default: throw new AssertionError();
+        }
+    }
+    
     /**
      * Builds a list of commands that will revert the changeset
@@ -220,5 +256,5 @@
 
         HashSet<OsmPrimitive> toDelete = new HashSet<OsmPrimitive>();
-        // Mark objects that have visible=false to be deleted
+        // Mark objects that has visible=false to be deleted
         for (OsmPrimitive p : nds.allPrimitives()) {
             if (!p.isVisible()) {
@@ -249,9 +285,16 @@
             HistoryOsmPrimitive hp = entry.getPrimitive();
             OsmPrimitive dp = ds.getPrimitiveById(hp.getPrimitiveId());
-            if (dp == null)
+            if (dp == null || dp.isIncomplete())
                 throw new IllegalStateException(tr("Missing merge target for {0} with id {1}",
                         hp.getType(), hp.getId()));
+            
             if (hp.getVersion() != dp.getVersion()
-                    && (hp.isVisible() || dp.isVisible())) {
+                    && (hp.isVisible() || dp.isVisible()) &&
+                    /* Don't create conflict if changeset object and dataset object
+                     * has same semantic attributes(but different versions)
+                     */
+                    !hasEqualSemanticAttributes(dp,hp)) {
+                
+                
                 cmds.add(new ConflictAddCommand(layer,CreateConflict(dp, 
                         entry.getModificationType() == ChangesetModificationType.CREATED)));
@@ -293,5 +336,5 @@
         return cmds;
     }
-    public boolean haveMissingObjects() {
+    public boolean hasMissingObjects() {
         return !missing.isEmpty();
     }
Index: /applications/editors/josm/plugins/reverter/src/reverter/RevertChangesetAction.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/RevertChangesetAction.java	(revision 21674)
+++ /applications/editors/josm/plugins/reverter/src/reverter/RevertChangesetAction.java	(revision 21675)
@@ -50,5 +50,5 @@
             
             private boolean checkMissing() throws OsmTransferException {
-                if (!rev.haveMissingObjects()) return true;
+                if (!rev.hasMissingObjects()) return true;
                 if (!downloadConfirmed) {
                     downloadConfirmed = JOptionPane.showConfirmDialog(Main.parent,
@@ -73,4 +73,9 @@
                 rev = new ChangesetReverter(changesetId, NullProgressMonitor.INSTANCE);
                 if (progressMonitor.isCancelled()) return;
+                rev.checkMissingDeleted();
+                // Don't ask user to download primitives going to be undeleted
+                rev.downloadMissingPrimitives(NullProgressMonitor.INSTANCE);
+                rev.checkMissingCreated();
+                rev.checkMissingUpdated();
                 if (!checkMissing()) return;
                 rev.downloadObjectsHistory(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
