Index: trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java	(revision 2417)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java	(revision 2433)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSetMerger;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -95,9 +96,10 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
         Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
         assertTrue(visitor.getConflicts().isEmpty());
+        assertTrue(n1 != n2); // make sure we have a clone
         assertEquals(1, n2.getId());
         assertEquals(1, n2.getVersion());
@@ -131,9 +133,11 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
         Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
         assertTrue(visitor.getConflicts().isEmpty());
+        assertTrue(n == n2); // make sure the merged node is still the original node
+        assertTrue(n2.getDataSet() == my);
         assertEquals(1, n2.getId());
         assertEquals(2, n2.getVersion());
@@ -144,5 +148,5 @@
 
     /**
-     * node with same id, my is modified, their has a higher version
+     * Node with same id, my is modified, their has a higher version
      * => results in a conflict
      *
@@ -171,10 +175,12 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
         Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
         assertEquals(1,visitor.getConflicts().size());
-        assertEquals(n, n2);
+        assertTrue(n == n2);
+        assertTrue(n1 != n2);
+        assertTrue(n1.getDataSet() == their);
     }
 
@@ -207,10 +213,12 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
         Node n2 = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
         assertEquals(1,visitor.getConflicts().size());
-        assertEquals(n, n2);
+        assertTrue(n == n2);
+        assertTrue(n1 != n2);
+        assertTrue(n1.getDataSet() == their);
     }
 
@@ -240,5 +248,5 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -246,4 +254,7 @@
         assertEquals(1,visitor.getConflicts().size());
         assertEquals(true, n2.isVisible());
+        assertTrue(n == n2);
+        assertTrue(n1 != n2);
+        assertTrue(n1.getDataSet() == their);
     }
 
@@ -269,5 +280,5 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -275,4 +286,7 @@
         assertEquals(0,visitor.getConflicts().size());
         assertEquals(true, n2.isVisible());
+        assertTrue(n == n2);
+        assertTrue(n.getDataSet() == my);
+        assertTrue(n1.getDataSet() == their);
     }
 
@@ -297,8 +311,10 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
         assertEquals(1,visitor.getConflicts().size());
+        assertTrue(n.getDataSet() == my);
+        assertTrue(n1.getDataSet() == their);
     }
 
@@ -324,8 +340,11 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
-        visitor.merge();
-
-        assertEquals(0,visitor.getConflicts().size());
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        assertEquals(0,visitor.getConflicts().size());
+        Node n2 = (Node)my.getNodes().toArray()[0];
+        assertTrue(n2 == n);
+        assertTrue(n2.isDeleted());
     }
 
@@ -352,10 +371,10 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
         Node n2 = (Node)my.getPrimitiveById(1,OsmPrimitiveType.NODE);
         assertEquals(0,visitor.getConflicts().size());
-        assertEquals(2, my.getNodes().size());
+        assertEquals(1, my.getNodes().size());
         assertEquals(n,n2);
     }
@@ -398,5 +417,5 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -406,4 +425,7 @@
         assertEquals(true, n1.getTimestamp().equals(n2.getTimestamp()));
         assertEquals(theirUser,n2.getUser());
+        assertTrue(n2 == n);
+        assertTrue(n2 != n1);
+        assertTrue(n2.getDataSet() == my);
     }
 
@@ -436,5 +458,5 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -444,4 +466,5 @@
         assertEquals(true, n1.getTimestamp().equals(n2.getTimestamp()));
         assertEquals(false, n2.incomplete);
+        assertTrue(n2 == n);
     }
 
@@ -499,5 +522,5 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -511,5 +534,11 @@
         assertEquals(1,merged.getNode(0).getId());
         assertEquals(2,merged.getNode(1).getId());
-
+        assertTrue(merged == myWay);
+        assertTrue(merged.getDataSet() == my);
+
+        Node mergedNode = (Node)my.getPrimitiveById(1, OsmPrimitiveType.NODE);
+        assertTrue(mergedNode == n1);
+        mergedNode = (Node)my.getPrimitiveById(2, OsmPrimitiveType.NODE);
+        assertTrue(mergedNode == n2);
     }
 
@@ -524,4 +553,5 @@
     public void waySimple_AdditionalNodesAndChangedNodes() {
 
+        // -- my data set
         DataSet my = new DataSet();
         my.setVersion("0.6");
@@ -540,4 +570,6 @@
         myWay.addNode(n2);
         my.addPrimitive(myWay);
+
+        // --- their data set
 
         DataSet their = new DataSet();
@@ -566,6 +598,5 @@
         their.addPrimitive(theirWay);
 
-
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -579,4 +610,8 @@
         assertEquals(2,merged.getNode(2).getId());
         assertEquals("value1",merged.getNode(2).get("key1"));
+
+        assertTrue(merged.getNode(0) == n1);
+        assertTrue(merged.getNode(1) != n5); // must be clone of the original node in their
+        assertTrue(merged.getNode(2) == n2);
     }
 
@@ -636,5 +671,5 @@
 
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -684,5 +719,5 @@
         their.addPrimitive(theirWay);
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -699,10 +734,9 @@
      * their way can be merged on my way. No conflict.
      *
-     *
-     *
      */
     @Test
     public void waySimple_twoWaysWithNoId_NodesWithId() {
 
+        // -- my data set
         DataSet my = new DataSet();
         my.setVersion("0.6");
@@ -721,4 +755,5 @@
         my.addPrimitive(myWay);
 
+        // -- their data set
         DataSet their = new DataSet();
         their.setVersion("0.6");
@@ -739,12 +774,16 @@
         their.addPrimitive(theirWay);
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
-        visitor.merge();
-
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals("their", myWay.getUser().getName());
-        assertEquals(1111, myWay.getUser().getId());
-        assertEquals(1111, myWay.getUser().getId());
-        assertEquals(theirWay.getTimestamp(), myWay.getTimestamp());
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        // -- tests
+        Way merged = (Way)my.getWays().toArray()[0];
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals("their", merged.getUser().getName());
+        assertEquals(1111, merged.getUser().getId());
+        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
+        assertTrue(merged == myWay);
+        assertTrue(merged.getNode(0) == n1);
+        assertTrue(merged.getNode(1) == n2);
     }
 
@@ -758,4 +797,5 @@
     public void waySimple_twoWaysWithNoId_NodesWithoutId() {
 
+        // -- my data set
         DataSet my = new DataSet();
         my.setVersion("0.6");
@@ -772,4 +812,5 @@
         my.addPrimitive(myWay);
 
+        // -- their data set
         DataSet their = new DataSet();
         their.setVersion("0.6");
@@ -789,11 +830,16 @@
         their.addPrimitive(theirWay);
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
-        visitor.merge();
-
-        assertEquals(0,visitor.getConflicts().size());
-        assertEquals("their", myWay.getUser().getName());
-        assertEquals(1111, myWay.getUser().getId());
-        assertEquals(theirWay.getTimestamp(), myWay.getTimestamp());
+        DataSetMerger visitor = new DataSetMerger(my,their);
+        visitor.merge();
+
+        // -- tests
+        Way merged = (Way)my.getWays().toArray()[0];
+        assertEquals(0,visitor.getConflicts().size());
+        assertEquals("their", merged.getUser().getName());
+        assertEquals(1111, merged.getUser().getId());
+        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
+        assertTrue(merged == myWay);
+        assertTrue(merged.getNode(0) == n1);
+        assertTrue(merged.getNode(1) == n2);
     }
 
@@ -810,4 +856,5 @@
     public void wayComplex_mergingADeletedNode() {
 
+        // -- my dataset
         DataSet my = new DataSet();
         my.setVersion("0.6");
@@ -833,5 +880,5 @@
         their.addPrimitive(n5);
 
-
+        // -- their data set
         Way theirWay = new Way();
         theirWay.setOsmId(4,1);
@@ -843,5 +890,5 @@
         their.addPrimitive(theirWay);
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -852,4 +899,5 @@
 
         Node n = (Node)my.getPrimitiveById(1,OsmPrimitiveType.NODE);
+        assertTrue(!myWay.getNodes().contains(n));
         assertTrue(n != null);
     }
@@ -857,5 +905,5 @@
     /**
      * My dataset includes a deleted node.
-     * Their dataset includes a relation with thre nodes, the first one being my node.
+     * Their dataset includes a relation with three nodes, the first one being my node.
      *
      * => the merged relation should include two nodes only. the deleted node should still be
@@ -898,5 +946,5 @@
         their.addPrimitive(theirRelation);
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -934,5 +982,5 @@
         their.setVersion("0.6");
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
@@ -997,5 +1045,5 @@
         my.addPrimitive(w6);
 
-        MergeVisitor visitor = new MergeVisitor(my,their);
+        DataSetMerger visitor = new DataSetMerger(my,their);
         visitor.merge();
 
