Index: trunk/src/org/openstreetmap/josm/command/UndeletePrimitivesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/UndeletePrimitivesCommand.java	(revision 2971)
+++ trunk/src/org/openstreetmap/josm/command/UndeletePrimitivesCommand.java	(revision 2972)
@@ -6,6 +6,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
-import java.util.logging.Logger;
+import java.util.ListIterator;
 
 import javax.swing.JLabel;
@@ -13,5 +14,10 @@
 import javax.swing.tree.MutableTreeNode;
 
+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.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -23,8 +29,10 @@
  */
 public class UndeletePrimitivesCommand extends ConflictResolveCommand {
-    static private final Logger logger = Logger.getLogger(UndeletePrimitivesCommand.class.getName());
+    //static private final Logger logger = Logger.getLogger(UndeletePrimitivesCommand.class.getName());
 
     /** the node to undelete */
     private final List<OsmPrimitive> toUndelete = new ArrayList<OsmPrimitive>();
+    /** primitives that replaced undeleted primitives */
+    private final List<OsmPrimitive> replacedPrimitives = new ArrayList<OsmPrimitive>();
 
     /**
@@ -51,5 +59,4 @@
      */
     public UndeletePrimitivesCommand(Collection<OsmPrimitive> toUndelete) {
-        this();
         this.toUndelete.addAll(toUndelete);
     }
@@ -70,4 +77,5 @@
         super.executeCommand();
 
+        replacedPrimitives.clear();
         for(OsmPrimitive primitive: toUndelete) {
             if(getLayer().getConflicts().hasConflictForMy(primitive)) {
@@ -75,7 +83,56 @@
                 getLayer().getConflicts().remove(primitive);
             }
-            primitive.clearOsmId();
+            OsmPrimitive prim;
+            switch (primitive.getType()) {
+            case NODE:
+                prim = new Node((Node)primitive, true);
+                break;
+            case WAY:
+                prim = new Way((Way)primitive, true);
+                break;
+            case RELATION:
+                prim = new Relation((Relation)primitive, true);
+                break;
+            default:
+                throw new AssertionError();
+            }
+            replacedPrimitives.add(prim);
+            replacePrimitive(getLayer().data, primitive, prim);
         }
         return true;
+    }
+
+    private void replacePrimitive(DataSet dataSet, OsmPrimitive oldPrim, OsmPrimitive newPrim) {
+        dataSet.addPrimitive(newPrim);
+        for (OsmPrimitive referrer: oldPrim.getReferrers()) {
+            if (referrer instanceof Way) {
+                Way w = (Way)referrer;
+                List<Node> nodes = w.getNodes();
+                Collections.replaceAll(nodes, (Node)oldPrim, (Node)newPrim);
+                w.setNodes(nodes);
+                w.setModified(true);
+            } else if (referrer instanceof Relation) {
+                Relation r = (Relation)referrer;
+                List<RelationMember> members = r.getMembers();
+                ListIterator<RelationMember> it = members.listIterator();
+                while (it.hasNext()) {
+                    RelationMember rm = it.next();
+                    if (rm.getMember() == oldPrim) {
+                        it.set(new RelationMember(rm.getRole(), newPrim));
+                    }
+                }
+                r.setMembers(members);
+                r.setModified(true);
+            }
+        }
+        dataSet.removePrimitive(oldPrim);
+    }
+
+    @Override
+    public void undoCommand() {
+        for (int i=0; i<toUndelete.size(); i++) {
+            replacePrimitive(getLayer().data, replacedPrimitives.get(i), toUndelete.get(i));
+        }
+        super.undoCommand();
     }
 
@@ -83,5 +140,4 @@
     public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
             Collection<OsmPrimitive> added) {
-        modified.addAll(toUndelete);
     }
 }
