Index: trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 2586)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 2587)
@@ -150,5 +150,5 @@
             if (n.isIncomplete()) return;
         }
-        myWay.setIncomplete(false);
+        myWay.setHasIncompleteNodes(false);
     }
 
@@ -168,16 +168,18 @@
             throw new RuntimeException(tr("Missing merge target for node with id {0}", other.getUniqueId()));
         if (myNode.isIncomplete() || myNode.isDeleted() || !myNode.isVisible()) return;
-        wayloop: for (Way w: OsmPrimitive.getFilteredList(myNode.getReferrers(), Way.class)) {
-            if (w.isDeleted() || ! w.isVisible() || ! w.isIncomplete()) {
-                continue;
-            }
-            for (Node n: w.getNodes()) {
-                if (n.isIncomplete()) {
-                    continue wayloop;
+
+        wayloop:
+            for (Way w: OsmPrimitive.getFilteredList(myNode.getReferrers(), Way.class)) {
+                if (w.isDeleted() || ! w.isVisible() || ! w.isIncomplete()) {
+                    continue;
                 }
-            }
-            // all nodes are complete - set the way complete too
-            w.setIncomplete(false);
-        }
+                for (Node n: w.getNodes()) {
+                    if (n.isIncomplete()) {
+                        continue wayloop;
+                    }
+                }
+                // all nodes are complete - set the way complete too
+                w.setHasIncompleteNodes(false);
+            }
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2586)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2587)
@@ -1155,4 +1155,5 @@
     }
 
+    //TODO This method should not be necessary, incomplete state should be handled internally by OsmPrimitive
     public void setIncomplete(boolean incomplete) {
         this.incomplete = incomplete;
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2586)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2587)
@@ -26,4 +26,5 @@
     private Node[] nodes = new Node[0];
     private BBox bbox;
+    private boolean hasIncompleteNodes;
 
     /**
@@ -375,3 +376,17 @@
         bbox = new BBox(this);
     }
+
+    //TODO This method should not be necessary. hasIncomplete state should be updated automatically when incomplete state of nodes change
+    public void setHasIncompleteNodes(boolean hasIncompleteNodes) {
+        this.hasIncompleteNodes = hasIncompleteNodes;
+    }
+
+    public boolean hasIncompleteNodes() {
+        return hasIncompleteNodes;
+    }
+
+    @Override
+    public boolean isUsable() {
+        return super.isUsable() && !hasIncompleteNodes();
+    }
 }
Index: trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 2586)
+++ trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 2587)
@@ -418,5 +418,5 @@
         for (Long externalWayId: ways.keySet()) {
             Way w = (Way)externalIdMap.get("w" + externalWayId);
-            boolean incomplete = false;
+            boolean hasIncompleteNodes = false;
             List<Node> wayNodes = new ArrayList<Node>();
             for (long id : ways.get(externalWayId)) {
@@ -438,18 +438,18 @@
                         ds.addPrimitive(n);
                     }
-                    incomplete = true;
+                    hasIncompleteNodes = true;
                 }
                 wayNodes.add(n);
             }
             w.setNodes(wayNodes);
-            if (incomplete) {
+            if (hasIncompleteNodes) {
                 if (logger.isLoggable(Level.FINE)) {
                     logger.fine(tr("Marked way {0} with {1} nodes incomplete because at least one node was missing in the " +
                             "loaded data and is therefore incomplete too.", externalWayId, w.getNodesCount()));
                 }
-                w.setIncomplete(true);
+                w.setHasIncompleteNodes(true);
                 ds.addPrimitive(w);
             } else {
-                w.setIncomplete(false);
+                w.setHasIncompleteNodes(false);
                 ds.addPrimitive(w);
             }
