Index: /src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java	(revision 223)
+++ /src/org/openstreetmap/josm/actions/DownloadIncompleteAction.java	(revision 224)
@@ -48,5 +48,5 @@
 
 		@Override protected void finish() {
-			MergeVisitor merger = new MergeVisitor(Main.ds);
+			MergeVisitor merger = new MergeVisitor(Main.ds, reader.data);
 			for (OsmPrimitive osm : reader.data.allPrimitives())
 				osm.visit(merger);
Index: /src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 223)
+++ /src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 224)
@@ -29,4 +29,5 @@
 
 	private final DataSet ds;
+	private final DataSet mergeds;
 
 	/**
@@ -43,6 +44,7 @@
 	private final Map<Segment, Segment> mergedSegments = new HashMap<Segment, Segment>();
 
-	public MergeVisitor(DataSet ds) {
+	public MergeVisitor(DataSet ds, DataSet mergeds) {
 		this.ds = ds;
+		this.mergeds = mergeds;
 	}
 
@@ -57,5 +59,5 @@
 		Node my = null;
 		for (Node n : ds.nodes) {
-			if (match(n, other)) {
+			if (match(n, other) && ((mergeds == null) || (!mergeds.nodes.contains(n)))) {
 				my = n;
 				break;
@@ -87,9 +89,10 @@
 		Segment my = null;
 		for (Segment ls : ds.segments) {
-			if (match(other, ls)) {
+			if (match(other, ls) && ((mergeds == null) || (!mergeds.segments.contains(ls)))) {
 				my = ls;
 				break;
 			}
 		}
+		
 		if (my == null)
 			ds.segments.add(other);
@@ -145,5 +148,5 @@
 		Way my = null;
 		for (Way w : ds.ways) {
-			if (match(other, w)) {
+			if (match(other, w) && ((mergeds == null) || (!mergeds.ways.contains(w)))) {
 				my = w;
 				break;
@@ -291,4 +294,5 @@
 		else
 			my.keys.putAll(other.keys);
+		
 		my.modified = true;
 	}
Index: /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 223)
+++ /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 224)
@@ -157,5 +157,5 @@
 
 	@Override public void mergeFrom(final Layer from) {
-		final MergeVisitor visitor = new MergeVisitor(data);
+		final MergeVisitor visitor = new MergeVisitor(data,((OsmDataLayer)from).data);
 		for (final OsmPrimitive osm : ((OsmDataLayer)from).data.allPrimitives())
 			osm.visit(visitor);
Index: /src/org/openstreetmap/josm/io/IncompleteDownloader.java
===================================================================
--- /src/org/openstreetmap/josm/io/IncompleteDownloader.java	(revision 223)
+++ /src/org/openstreetmap/josm/io/IncompleteDownloader.java	(revision 224)
@@ -44,5 +44,5 @@
 	 */
 	private final Collection<Way> toDownload;
-	private MergeVisitor merger = new MergeVisitor(data);
+	private MergeVisitor merger = new MergeVisitor(data, null);
 
 	public IncompleteDownloader(Collection<Way> toDownload) {
Index: /test/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java
===================================================================
--- /test/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java	(revision 223)
+++ /test/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java	(revision 224)
@@ -25,5 +25,5 @@
 		ds = new DataSet();
 		dsNode = DataSetTestCaseHelper.createNode(ds);
-		v = new MergeVisitor(ds);
+		v = new MergeVisitor(ds, null);
 		n = DataSetTestCaseHelper.createNode(null);
 	}
@@ -235,5 +235,5 @@
 
 		Segment ls2 = DataSetTestCaseHelper.createSegment(ds, n2[0], n2[1]);
-		v = new MergeVisitor(ds);
+		v = new MergeVisitor(ds, null);
 		for (OsmPrimitive osm : ds2.allPrimitives())
 			osm.visit(v);
@@ -249,5 +249,5 @@
 		Segment s = DataSetTestCaseHelper.createSegment(ds, n[0], n[1]);
 		Way w = DataSetTestCaseHelper.createWay(ds, s);
-		MergeVisitor v = new MergeVisitor(ds);
+		MergeVisitor v = new MergeVisitor(ds, null);
 		v.visit(n[0]);
 		v.visit(n[1]);
@@ -281,5 +281,5 @@
 		w.id = 42;
 		// merge both
-		MergeVisitor v = new MergeVisitor(ds);
+		MergeVisitor v = new MergeVisitor(ds, null);
 		v.visit(w);
 		v.fixReferences();
@@ -299,5 +299,5 @@
 		s.timestamp = new Date(new Date().getTime()+1);
 		
-		MergeVisitor v = new MergeVisitor(ds);
+		MergeVisitor v = new MergeVisitor(ds, null);
 		v.visit(s);
 		v.fixReferences();
@@ -308,5 +308,5 @@
 	public void testMergeIncompleteSegmentsAddToDataSet() throws Exception {
 		DataSet ds = new DataSet();
-		MergeVisitor v = new MergeVisitor(ds);
+		MergeVisitor v = new MergeVisitor(ds, null);
 		v.visit(createSegment(null, true, false, 1));
 		assertEquals(1, ds.segments.size());
@@ -330,5 +330,5 @@
 		newNode.timestamp = new Date(date.getTime());
 		
-		MergeVisitor v = new MergeVisitor(ds);
+		MergeVisitor v = new MergeVisitor(ds, null);
 		v.visit(newNode);
 
@@ -343,5 +343,5 @@
 		Segment s2 = new Segment(42);
 		
-		MergeVisitor v = new MergeVisitor(ds);
+		MergeVisitor v = new MergeVisitor(ds, null);
 		v.visit(s1);
 		v.visit(s2);
