Index: src/org/openstreetmap/josm/data/osm/DataSetMerger.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 2605)
+++ src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(working copy)
@@ -144,7 +144,6 @@
         Way myWay = (Way)getMergeTarget(other);
         if (myWay == null)
             throw new RuntimeException(tr("Missing merge target for way with id {0}", other.getUniqueId()));
-        myWay.setHasIncompleteNodes();
     }
 
     /**
@@ -162,10 +161,6 @@
         if (myNode == null)
             throw new RuntimeException(tr("Missing merge target for node with id {0}", other.getUniqueId()));
         if (myNode.isIncomplete() || myNode.isDeleted() || !myNode.isVisible()) return;
-
-        for (Way w: OsmPrimitive.getFilteredList(myNode.getReferrers(), Way.class)) {
-            w.setHasIncompleteNodes();
-        }
     }
 
     /**
Index: src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Way.java	(revision 2605)
+++ src/org/openstreetmap/josm/data/osm/Way.java	(working copy)
@@ -25,7 +25,6 @@
      */
     private Node[] nodes = new Node[0];
     private BBox bbox;
-    private boolean hasIncompleteNodes;
 
     /**
      *
@@ -376,21 +375,14 @@
         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() {
-        hasIncompleteNodes = false;
+    public boolean hasIncompleteNodes() {
         for (Node node:getNodes()) {
-            if (node.isIncomplete()) {
-                hasIncompleteNodes = true;
-                break;
-            }
+            if (node.isIncomplete())
+                return true;
         }
+        return false;
     }
 
-    public boolean hasIncompleteNodes() {
-        return hasIncompleteNodes;
-    }
-
     @Override
     public boolean isUsable() {
         return super.isUsable() && !hasIncompleteNodes();
Index: src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 2605)
+++ src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(working copy)
@@ -192,7 +192,9 @@
                     continue;
                 }
             }
-            appendGeneric(member.getMember());
+            if (!member.getMember().isIncomplete()) {
+                appendGeneric(member.getMember());
+            }
         }
         return this;
     }
@@ -374,7 +376,7 @@
 
     protected void rememberNodesOfIncompleteWaysToLoad(DataSet from) {
         for (Way w: from.getWays()) {
-            if (w.isIncomplete()) {
+            if (w.hasIncompleteNodes()) {
                 for (Node n: w.getNodes()) {
                     if (n.isIncomplete()) {
                         nodes.add(n.getId());
Index: src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmReader.java	(revision 2605)
+++ src/org/openstreetmap/josm/io/OsmReader.java	(working copy)
@@ -481,7 +481,6 @@
                 wayNodes.add(n);
             }
             w.setNodes(wayNodes);
-            w.setHasIncompleteNodes();
             if (w.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 " +
