Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 1693)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java	(revision 1694)
@@ -6,5 +6,4 @@
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
@@ -103,5 +102,5 @@
                 return;
         } else {
-            // try to merge onto a primitive with which has no id assigned
+            // try to merge onto a primitive  which has no id assigned
             // yet but which is equal in its semantic attributes
             //
@@ -235,4 +234,15 @@
                     //
                     conflicts.put(my,other);
+                } else if (my.incomplete) {
+                    // my is incomplete, other completes it
+                    // => merge other onto my
+                    //
+                    my.incomplete = false;
+                    my.cloneFrom(other);
+                    merged.put(other, my);
+                } else if (my.deleted != other.deleted) {
+                    // differences in deleted state have to be resolved manually
+                    //
+                    conflicts.put(my,other);
                 } else if (! my.modified && other.modified) {
                     // my not modified. We can assume that other is the most recent version.
@@ -245,7 +255,12 @@
                     my.cloneFrom(other);
                     merged.put(other, my);
-                } else if (! my.modified && !other.modified) {
+                } else if (! my.modified && !other.modified && my.version == other.version) {
                     // both not modified. Keep mine
                     //
+                    merged.put(other,my);
+                } else if (! my.modified && !other.modified && my.version < other.version) {
+                    // my not modified but other is newer. clone other onto mine.
+                    //
+                    my.cloneFrom(other);
                     merged.put(other,my);
                 } else if (my.modified && ! other.modified && my.version == other.version) {
@@ -253,9 +268,4 @@
                     // => keep mine
                     merged.put(other, my);
-                } else if (my.deleted != other.deleted) {
-                    // if we get here my is modified. Differences in deleted state
-                    // have to be resolved manually
-                    //
-                    conflicts.put(my,other);
                 } else if (! my.hasEqualSemanticAttributes(other)) {
                     // my is modified and is not semantically equal with other. Can't automatically
