Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 1947)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 1948)
@@ -150,4 +150,13 @@
     }
 
+    protected void fixIncomplete(Way w) {
+        if (!w.incomplete)return;
+        if (w.incomplete && w.getNodesCount() == 0) return;
+        for (Node n: w.getNodes()) {
+            if (n.incomplete) return;
+        }
+        w.incomplete = false;
+    }
+
     /**
      * Postprocess the dataset and fix all merged references to point to the actual
@@ -157,4 +166,5 @@
         for (Way w : myDataSet.ways) {
             fixWay(w);
+            fixIncomplete(w);
         }
         for (Relation r : myDataSet.relations) {
@@ -243,5 +253,5 @@
                     //
                     conflicts.add(my,other);
-                } else if (my.incomplete) {
+                } else if (my.incomplete && !other.incomplete) {
                     // my is incomplete, other completes it
                     // => merge other onto my
@@ -249,4 +259,14 @@
                     my.incomplete = false;
                     my.cloneFrom(other);
+                    merged.put(other, my);
+                } else if (!my.incomplete && other.incomplete) {
+                    // my is complete and the other is incomplete
+                    // => keep mine, we have more information already
+                    //
+                    merged.put(other, my);
+                } else if (my.incomplete && other.incomplete) {
+                    // my and other are incomplete. Doesn't matter which one to
+                    // take. We take mine.
+                    //
                     merged.put(other, my);
                 } else if (my.deleted && ! other.deleted && my.version == other.version) {
