Index: src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Node.java	(revision 2595)
+++ src/org/openstreetmap/josm/data/osm/Node.java	(working copy)
@@ -135,7 +135,9 @@
     @Override public NodeData save() {
         NodeData data = new NodeData();
         saveCommonAttributes(data);
-        data.setCoor(getCoor());
+        if (!isIncomplete()) {
+            data.setCoor(getCoor());
+        }
         return data;
     }
 
Index: src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2595)
+++ src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(working copy)
@@ -102,6 +102,7 @@
     private static final int FLAG_FILTERED = 1 << 4;
     private static final int FLAG_HAS_DIRECTIONS = 1 << 5;
     private static final int FLAG_TAGGED = 1 << 6;
+    private static final int FLAG_INCOMPLETE = 1 << 7;
 
     /**
      * Replies the sub-collection of {@see OsmPrimitive}s of type <code>type</code> present in
@@ -225,12 +226,6 @@
     private User user = null;
 
     /**
-     * If set to true, this object is incomplete, which means only the id
-     * and type is known (type is the objects instance class)
-     */
-    private boolean incomplete = false;
-
-    /**
      * Contains the version number as returned by the API. Needed to
      * ensure update consistency
      */
@@ -390,6 +385,29 @@
     }
 
     /**
+     * Sets whether this primitive is incomplete (e.g. only id and type are known) or not.
+     *
+     * @param incomplete true, if this primitive is incomplete; false, otherwise
+     */
+    public void setIncomplete(boolean incomplete) {
+        if (incomplete) {
+            flags |= FLAG_INCOMPLETE;
+        } else {
+            flags &= ~FLAG_INCOMPLETE;
+        }
+    }
+
+    /**
+     * Returns <code>true</code>, if the object is incomplete (e.g. only id and type are known).
+     *
+     * @return <code>true</code>, if the object is incomplete.
+     * @see #setDeleted(boolean)
+     */
+    public boolean isIncomplete() {
+        return (flags & FLAG_INCOMPLETE) != 0;
+    }
+
+    /**
      * Replies the version number as returned by the API. The version is 0 if the id is 0 or
      * if this primitive is incomplete.
      *
@@ -915,7 +933,6 @@
         id = osm.id;
         timestamp = osm.timestamp;
         version = osm.version;
-        setIncomplete(osm.isIncomplete());
         flags = osm.flags;
         user= osm.user;
         clearCached();
@@ -942,7 +959,6 @@
         setKeys(other.getKeys());
         timestamp = other.timestamp;
         version = other.version;
-        setIncomplete(other.isIncomplete());
         flags = other.flags;
         user= other.user;
     }
@@ -1095,6 +1111,7 @@
         setDeleted(data.isDeleted());
         setModified(data.isModified());
         setVisible(data.isVisible());
+        setIncomplete(data.isIncomplete());
     }
 
     /**
@@ -1112,6 +1129,7 @@
         data.setDeleted(isDeleted());
         data.setModified(isModified());
         data.setVisible(isVisible());
+        data.setIncomplete(isIncomplete());
     }
 
     protected String getFlagsAsString() {
@@ -1157,12 +1175,12 @@
         return new SimplePrimitiveId(getUniqueId(), getType());
     }
 
-    //TODO This method should not be necessary, incomplete state should be handled internally by OsmPrimitive
-    public void setIncomplete(boolean incomplete) {
-        this.incomplete = incomplete;
-    }
 
-    public boolean isIncomplete() {
-        return incomplete;
-    }
+
+
+
+
+
+
+
 }
Index: src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 2595)
+++ src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(working copy)
@@ -35,12 +35,14 @@
         this.user = data.user;
         this.version = data.version;
         this.timestamp = data.timestamp;
+        this.incomplete = data.incomplete;
     }
 
     private final Map<String, String> keys = new HashMap<String, String>();
     private boolean modified;
     private boolean visible = true;
     private boolean deleted;
+    private boolean incomplete;
     private long id;
     private User user;
     private int version;
@@ -91,6 +93,12 @@
     public Map<String, String> getKeys() {
         return keys;
     }
+    public boolean isIncomplete() {
+        return incomplete;
+    }
+    public void setIncomplete(boolean incomplete) {
+        this.incomplete = incomplete;
+    }
 
     public void clearOsmId() {
         id = OsmPrimitive.generateUniqueId();
@@ -112,6 +120,9 @@
         if (deleted) {
             builder.append("D");
         }
+        if (incomplete) {
+            builder.append("I");
+        }
 
         return builder.toString();
     }
