Index: src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 56)
+++ src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 57)
@@ -1,5 +1,8 @@
 package org.openstreetmap.josm.data.osm.visitor;
 
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
 
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -20,4 +23,17 @@
 	private final DataSet ds;
 	
+	/**
+	 * A list of all nodes that got replaced with other nodes.
+	 * Key is the node in the other's dataset and the value is the one that is now
+	 * in ds.nodes instead.
+	 */
+	private final Map<Node, Node> mergedNodes = new HashMap<Node, Node>();
+	/**
+	 * A list of all line segments that got replaced with others.
+	 * Key is the segment in the other's dataset and the value is the one that is now
+	 * in ds.lineSegments.
+	 */
+	private final Map<LineSegment, LineSegment> mergedLineSegments = new HashMap<LineSegment, LineSegment>();
+	
 	public MergeVisitor(DataSet ds) {
 		this.ds = ds;
@@ -39,4 +55,5 @@
 			ds.nodes.add(otherNode);
 		else {
+			mergedNodes.put(otherNode, myNode);
 			mergeCommon(myNode, otherNode);
 			if (myNode.modified && !otherNode.modified)
@@ -64,4 +81,5 @@
 			ds.lineSegments.add(otherLs);
 		else {
+			mergedLineSegments.put(otherLs, myLs);
 			mergeCommon(myLs, otherLs);
 			if (myLs.modified && !otherLs.modified)
@@ -99,7 +117,6 @@
 			Iterator<LineSegment> it = otherTrack.segments.iterator();
 			for (LineSegment ls : myTrack.segments) {
-				if (!match(ls, it.next())) {
+				if (!match(ls, it.next()))
 					same = false;
-				}
 			}
 			if (!same) {
@@ -113,4 +130,37 @@
 	public void visit(Key k) {
 		//TODO: Key doesn't really fit the OsmPrimitive concept!
+	}
+	
+	/**
+	 * Postprocess the dataset and fix all merged references to point to the actual
+	 * data.
+	 */
+	public void fixReferences() {
+		for (LineSegment ls : ds.lineSegments) {
+			if (mergedNodes.containsKey(ls.start))
+				ls.start = mergedNodes.get(ls.start);
+			if (mergedNodes.containsKey(ls.end))
+				ls.end = mergedNodes.get(ls.end);
+		}
+		for (Track t : ds.tracks) {
+			boolean replacedSomething = false;
+			LinkedList<LineSegment> newSegments = new LinkedList<LineSegment>();
+			for (LineSegment ls : t.segments) {
+				LineSegment otherLs = mergedLineSegments.get(ls);
+				newSegments.add(otherLs == null ? ls : otherLs);
+				if (otherLs != null)
+					replacedSomething = true;
+			}
+			if (replacedSomething) {
+				t.segments.clear();
+				t.segments.addAll(newSegments);
+			}
+			for (LineSegment ls : t.segments) {
+				if (mergedNodes.containsKey(ls.start))
+					ls.start = mergedNodes.get(ls.start);
+				if (mergedNodes.containsKey(ls.end))
+					ls.end = mergedNodes.get(ls.end);
+			}
+		}
 	}
 	
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 56)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 57)
@@ -136,4 +136,5 @@
 		for (OsmPrimitive osm : ((OsmDataLayer)from).data.allPrimitives())
 			osm.visit(visitor);
+		visitor.fixReferences();
 	}
 
