Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2962)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2963)
@@ -240,4 +240,5 @@
         this(id, allowNegativeId);
         this.version = (id > 0 ? version : 0);
+        setIncomplete(id > 0 && version == 0);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2962)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2963)
@@ -345,6 +345,11 @@
 
     private void fireMembersChanged() {
-        if (getDataSet() != null) {
-            getDataSet().fireRelationMembersChanged(this);
+        DataSet dataSet = getDataSet();
+        if (dataSet != null) {
+            for (RelationMember rm: members) {
+                if (rm.getMember().getDataSet() != dataSet)
+                    throw new DataIntegrityProblemException("Relation member must be part of the same dataset as relation");
+            }
+            dataSet.fireRelationMembersChanged(this);
         }
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java	(revision 2962)
+++ trunk/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java	(revision 2963)
@@ -51,3 +51,8 @@
         return true;
     }
+
+    @Override
+    public String toString() {
+        return type + " " + id;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2962)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2963)
@@ -365,5 +365,10 @@
 
     private void fireNodesChanged() {
-        if (getDataSet() != null) {
+        DataSet dataSet = getDataSet();
+        if (dataSet != null) {
+            for (Node n: nodes) {
+                if (n.getDataSet() != dataSet)
+                    throw new DataIntegrityProblemException("Nodes in way must be in the same dataset");
+            }
             getDataSet().fireWayNodesChanged(this);
         }
