Index: trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 3438)
+++ trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 3440)
@@ -12,4 +12,5 @@
 
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.NodeData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
@@ -23,4 +24,5 @@
     }
 
+    @SuppressWarnings("null")
     @Override public boolean executeCommand() {
 
@@ -28,15 +30,19 @@
 
         for (PrimitiveData pd:data) {
-            createdPrimitives.add(getLayer().data.getPrimitiveById(pd, true));
+            OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
+            boolean created = primitive == null;
+            if (created) {
+                primitive = pd.getType().newInstance(pd.getUniqueId(), true);
+            }
+            if (pd instanceof NodeData) { // Load nodes immediately because they can't be added to dataset without coordinates
+                primitive.load(pd);
+            }
+            if (created) {
+                getLayer().data.addPrimitive(primitive);
+            }
+            createdPrimitives.add(primitive);
         }
 
-        // Load nodes first to prevent ways with null coordinates
-        for (int i=0; i<createdPrimitives.size(); i++) {
-            if (createdPrimitives.get(i) instanceof Node) {
-                createdPrimitives.get(i).load(data.get(i));
-            }
-        }
-
-        // Now load ways and relations
+        //Then load ways and relations
         for (int i=0; i<createdPrimitives.size(); i++) {
             if (!(createdPrimitives.get(i) instanceof Node)) {
@@ -57,5 +63,5 @@
     @Override public JLabel getDescription() {
         return new JLabel(trn("Added {0} object", "Added {0} objects", data.size(), data.size()), null,
-                            JLabel.HORIZONTAL
+                JLabel.HORIZONTAL
         );
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3438)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3440)
@@ -283,5 +283,5 @@
                 success = ways.remove((Way) primitive);
             } else if (primitive instanceof Relation) {
-                success = relations.remove((Relation) primitive);
+                success = relations.remove(primitive);
             }
             if (!success)
@@ -609,11 +609,20 @@
      */
     public OsmPrimitive getPrimitiveById(long id, OsmPrimitiveType type) {
-        return getPrimitiveById(new SimplePrimitiveId(id, type), false);
+        return getPrimitiveById(new SimplePrimitiveId(id, type));
     }
 
     public OsmPrimitive getPrimitiveById(PrimitiveId primitiveId) {
-        return getPrimitiveById(primitiveId, false);
-    }
-
+        return primitivesMap.get(primitiveId);
+    }
+
+    /**
+     *
+     * @param primitiveId
+     * @param createNew
+     * @return
+     * @deprecated This method can created inconsistent dataset when called for node with id < 0 and createNew=true. That will add
+     * complete node without coordinates to dataset which is not allowed.
+     */
+    @Deprecated
     public OsmPrimitive getPrimitiveById(PrimitiveId primitiveId, boolean createNew) {
         OsmPrimitive result = primitivesMap.get(primitiveId);
@@ -734,12 +743,7 @@
      */
     public boolean isModified() {
-        for (Node n: nodes) {
-            if (n.isModified()) return true;
-        }
-        for (Way w: ways) {
-            if (w.isModified()) return true;
-        }
-        for (Relation r: relations) {
-            if (r.isModified()) return true;
+        for (OsmPrimitive p: allPrimitives) {
+            if (p.isModified())
+                return true;
         }
         return false;
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveType.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveType.java	(revision 3438)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveType.java	(revision 3440)
@@ -72,4 +72,17 @@
     }
 
+    public OsmPrimitive newInstance(long uniqueId, boolean allowNegative) {
+        switch (this) {
+        case NODE:
+            return new Node(uniqueId, allowNegative);
+        case WAY:
+            return new Way(uniqueId, allowNegative);
+        case RELATION:
+            return new Relation(uniqueId, allowNegative);
+        default:
+            throw new AssertionError();
+        }
+    }
+
     @Override
     public String toString() {
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 3438)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 3440)
@@ -163,20 +163,20 @@
         // Create all primitives first
         for (PrimitiveData primitive: mappedPrimitives.values()) {
-            hull.getPrimitiveById(primitive, true);
-        }
-        // Then fill nodes with data
-        for (PrimitiveData primitive : mappedPrimitives.values()) {
-            if (primitive instanceof NodeData) {
-                if (!primitive.isIncomplete()) {
-                    hull.getPrimitiveById(primitive).load(primitive);
-                }
+            OsmPrimitive newPrimitive = hull.getPrimitiveById(primitive);
+            boolean created = newPrimitive == null;
+            if (created) {
+                newPrimitive = primitive.getType().newInstance(primitive.getUniqueId(), true);
+            }
+            if (newPrimitive instanceof Node && !primitive.isIncomplete()) {
+                newPrimitive.load(primitive);
+            }
+            if (created) {
+                hull.addPrimitive(newPrimitive);
             }
         }
         // Then ways and relations
         for (PrimitiveData primitive : mappedPrimitives.values()) {
-            if (!(primitive instanceof NodeData)) {
-                if (!primitive.isIncomplete()) {
-                    hull.getPrimitiveById(primitive).load(primitive);
-                }
+            if (!(primitive instanceof NodeData) && !primitive.isIncomplete()) {
+                hull.getPrimitiveById(primitive).load(primitive);
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 3438)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 3440)
@@ -1481,5 +1481,7 @@
                         toAdd.add(primitiveInDs);
                     } else if (!primitive.isNew()) {
-                        toAdd.add(ds.getPrimitiveById(primitive, true));
+                        OsmPrimitive p = primitive.getType().newInstance(primitive.getUniqueId(), true);
+                        ds.addPrimitive(p);
+                        toAdd.add(p);
                     } else {
                         hasNewInOtherLayer = true;
