Index: trunk/src/org/openstreetmap/josm/data/APIDataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/APIDataSet.java	(revision 13160)
+++ trunk/src/org/openstreetmap/josm/data/APIDataSet.java	(revision 13161)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -40,4 +41,33 @@
 
     /**
+     * The type of operation we can perform with OSM API on a primitive.
+     * @since 13161
+     */
+    public enum APIOperation {
+        /** Add a new primitive */
+        ADD,
+        /** Update an existing primitive */
+        UPDATE,
+        /** Delete an existing primitive */
+        DELETE;
+
+        /**
+         * Determines the API operation to perform on a primitive.
+         * @param osm OSM primitive
+         * @return the API operation to perform on {@code osm}
+         */
+        public static APIOperation of(OsmPrimitive osm) {
+            if (osm.isNewOrUndeleted() && !osm.isDeleted()) {
+                return ADD;
+            } else if (osm.isModified() && !osm.isDeleted()) {
+                return UPDATE;
+            } else if (osm.isDeleted() && !osm.isNew() && osm.isModified() && osm.isVisible()) {
+                return DELETE;
+            }
+            return null;
+        }
+    }
+
+    /**
      * creates a new empty data set
      */
@@ -69,10 +99,9 @@
 
         for (OsmPrimitive osm :primitives) {
-            if (osm.isNewOrUndeleted() && !osm.isDeleted()) {
-                toAdd.add(osm);
-            } else if (osm.isModified() && !osm.isDeleted()) {
-                toUpdate.add(osm);
-            } else if (osm.isDeleted() && !osm.isNew() && osm.isModified() && osm.isVisible()) {
-                toDelete.add(osm);
+            switch (APIOperation.of(osm)) {
+                case ADD: toAdd.add(osm); break;
+                case UPDATE: toUpdate.add(osm); break;
+                case DELETE: toDelete.add(osm); break;
+                default: Logging.trace("Ignored primitive {0}", osm);
             }
         }
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 13160)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 13161)
@@ -25,4 +25,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.APIDataSet.APIOperation;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Data;
@@ -1136,4 +1137,17 @@
 
     /**
+     * Replies true if there is at least one primitive in this dataset which requires to be uploaded to server.
+     * @return true if there is at least one primitive in this dataset which requires to be uploaded to server
+     * @since 13161
+     */
+    public boolean requiresUploadToServer() {
+        for (OsmPrimitive p: allPrimitives) {
+            if (APIOperation.of(p) != null)
+                return true;
+        }
+        return false;
+    }
+
+    /**
      * Adds a new data set listener.
      * @param dsl The data set listener to add
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 13160)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 13161)
@@ -997,5 +997,5 @@
         invalidate();
         setRequiresSaveToFile(true);
-        setRequiresUploadToServer(true);
+        setRequiresUploadToServer(event.getDataset().requiresUploadToServer());
     }
 
