Index: trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 2405)
@@ -32,5 +32,5 @@
 
         for (int i=0; i<createdPrimitives.size(); i++) {
-            createdPrimitives.get(i).load(data.get(i), getLayer().data);
+            createdPrimitives.get(i).load(data.get(i));
         }
         getLayer().data.setSelected(createdPrimitives);
Index: trunk/src/org/openstreetmap/josm/command/Command.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/Command.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/command/Command.java	(revision 2405)
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.command;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.util.Collection;
-import static org.openstreetmap.josm.tools.I18n.tr;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -92,5 +93,5 @@
     public void undoCommand() {
         for (Entry<OsmPrimitive, PrimitiveData> e : cloneMap.entrySet()) {
-            e.getKey().load(e.getValue(), layer.data);
+            e.getKey().load(e.getValue());
         }
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2405)
@@ -190,4 +190,5 @@
         }
         allPrimitives.add(primitive);
+        primitive.setDataset(this);
     }
 
@@ -195,11 +196,13 @@
         OsmPrimitive result;
         if (data instanceof NodeData) {
-            result = new Node((NodeData)data, this);
+            result = new Node();
         } else if (data instanceof WayData) {
-            result = new Way((WayData)data, this);
+            result = new Way();
         } else if (data instanceof RelationData) {
-            result = new Relation((RelationData)data, this);
+            result = new Relation();
         } else
             throw new AssertionError();
+        result.setDataset(this);
+        result.load(data);
         addPrimitive(result);
         return result;
@@ -228,4 +231,5 @@
         selectedPrimitives.remove(primitive);
         allPrimitives.remove(primitive);
+        primitive.setDataset(null);
     }
 
@@ -797,4 +801,5 @@
                 selectedPrimitives.remove(primitive);
                 allPrimitives.remove(primitive);
+                primitive.setDataset(null);
                 changed = true;
                 it.remove();
@@ -811,4 +816,7 @@
     public void clear() {
         clearSelection();
+        for (OsmPrimitive primitive:allPrimitives) {
+            primitive.setDataset(null);
+        }
         nodes.clear();
         ways.clear();
Index: trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 2405)
@@ -85,9 +85,4 @@
     }
 
-    public Node(NodeData data, DataSet dataSet) {
-        super(data);
-        load(data, dataSet);
-    }
-
     @Override public void visit(Visitor visitor) {
         visitor.visit(this);
@@ -99,6 +94,6 @@
     }
 
-    @Override public void load(PrimitiveData data, DataSet dataSet) {
-        super.load(data, dataSet);
+    @Override public void load(PrimitiveData data) {
+        super.load(data);
         setCoor(((NodeData)data).getCoor());
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/NodeData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/NodeData.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/NodeData.java	(revision 2405)
@@ -50,9 +50,4 @@
 
     @Override
-    public Node makePrimitive(DataSet dataSet) {
-        return new Node(this, dataSet);
-    }
-
-    @Override
     public String toString() {
         return super.toString() + " NODE " + coor;
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2405)
@@ -131,4 +131,27 @@
      */
     private long id = 0;
+
+    private DataSet dataSet;
+
+    /**
+     * This method should never ever by called from somewhere else than Dataset.addPrimitive or removePrimitive methods
+     * @param dataSet
+     */
+    void setDataset(DataSet dataSet) {
+        if (this.dataSet != null && dataSet != null && this.dataSet != dataSet)
+            throw new DataIntegrityProblemException("Primitive cannot be included in more than one Dataset");
+        this.dataSet = dataSet;
+    }
+
+    /**
+     * 
+     * @return DataSet this primitive is part of.
+     * @throws DataIntegrityProblemException when primitive is not part of any dataset
+     */
+    public DataSet getDataSet() {
+        if (dataSet == null)
+            throw new DataIntegrityProblemException("Primitive must be part of the dataset");
+        return dataSet;
+    }
 
     private volatile byte flags = FLAG_VISIBLE;   // visible per default
@@ -798,8 +821,6 @@
      * Loads (clone) this primitive from provided PrimitiveData
      * @param data
-     * @param dataSet Dataset this primitive is part of. This parameter is used only
-     * temporarily. OsmPrimitive will have final field dataset in future
-     */
-    public void load(PrimitiveData data, DataSet dataSet) {
+     */
+    public void load(PrimitiveData data) {
         setKeys(data.getKeys());
         timestamp = data.getTimestamp();
Index: trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 2405)
@@ -99,6 +99,4 @@
     public abstract PrimitiveData makeCopy();
 
-    public abstract OsmPrimitive makePrimitive(DataSet dataSet);
-
     @Override
     public String toString() {
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2405)
@@ -136,10 +136,4 @@
         super(id, false);
     }
-
-    public Relation(RelationData data, DataSet dataSet) {
-        super(data);
-        load(data, dataSet);
-    }
-
 
     @Override public void cloneFrom(OsmPrimitive osm) {
@@ -153,6 +147,6 @@
     }
 
-    @Override public void load(PrimitiveData data, DataSet dataSet) {
-        super.load(data, dataSet);
+    @Override public void load(PrimitiveData data) {
+        super.load(data);
 
         RelationData relationData = (RelationData) data;
@@ -160,5 +154,5 @@
         List<RelationMember> newMembers = new ArrayList<RelationMember>();
         for (RelationMemberData member : relationData.getMembers()) {
-            OsmPrimitive primitive = dataSet.getPrimitiveById(member);
+            OsmPrimitive primitive = getDataSet().getPrimitiveById(member);
             if (primitive == null)
                 throw new AssertionError("Data consistency problem - relation with missing member detected");
Index: trunk/src/org/openstreetmap/josm/data/osm/RelationData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/RelationData.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/RelationData.java	(revision 2405)
@@ -28,9 +28,4 @@
 
     @Override
-    public Relation makePrimitive(DataSet dataSet) {
-        return new Relation(this, dataSet);
-    }
-
-    @Override
     public String toString() {
         return super.toString() + " REL " + members;
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2405)
@@ -161,17 +161,11 @@
     }
 
-    public Way(WayData data, DataSet dataSet) {
-        super(data);
-        load(data, dataSet);
-    }
-
     /**
      *
      * @param data
-     * @param dataSet Dataset this way is part of. This parameter will be removed in future
      */
     @Override
-    public void load(PrimitiveData data, DataSet dataSet) {
-        super.load(data, dataSet);
+    public void load(PrimitiveData data) {
+        super.load(data);
 
         WayData wayData = (WayData) data;
@@ -179,5 +173,5 @@
         List<Node> newNodes = new ArrayList<Node>(wayData.getNodes().size());
         for (Long nodeId : wayData.getNodes()) {
-            Node node = (Node)dataSet.getPrimitiveById(nodeId, OsmPrimitiveType.NODE);
+            Node node = (Node)getDataSet().getPrimitiveById(nodeId, OsmPrimitiveType.NODE);
             if (node != null) {
                 newNodes.add(node);
Index: trunk/src/org/openstreetmap/josm/data/osm/WayData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/WayData.java	(revision 2404)
+++ trunk/src/org/openstreetmap/josm/data/osm/WayData.java	(revision 2405)
@@ -28,9 +28,4 @@
 
     @Override
-    public OsmPrimitive makePrimitive(DataSet dataSet) {
-        return new Way(this, dataSet);
-    }
-
-    @Override
     public String toString() {
         return super.toString() + " WAY" + nodes.toString();
