Index: trunk/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 2402)
@@ -669,5 +669,4 @@
             //
             layer.cleanupAfterUpload(processedPrimitives);
-            layer.data.fireSelectionChanged();
             layer.fireDataChange();
             if (lastException != null) {
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 2402)
@@ -272,5 +272,4 @@
     private void tryAgain(MouseEvent e) {
         getCurrentDataSet().setSelected();
-        Main.main.getCurrentDataSet().fireSelectionChanged();
         mouseClicked(e);
     }
@@ -545,5 +544,4 @@
             newSelection.add(n);
             ds.setSelected(n);
-            ds.fireSelectionChanged();
         } else if (!newNode) {
             title = tr("Connect existing way to node");
@@ -590,5 +588,4 @@
                     (posn0 < selectedWay.getNodesCount()-1) && targetNode.equals(selectedWay.getNode(posn0+1))) {  // next node
                 getCurrentDataSet().setSelected(targetNode);
-                getCurrentDataSet().fireSelectionChanged();
                 lastUsedNode = targetNode;
                 return true;
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 2402)
@@ -520,6 +520,7 @@
 
         // plain clicks with no modifiers clear the selection
-        if (!ctrl && !shift)
+        if (!ctrl && !shift) {
             ds.clearSelection();
+        }
 
         if (ctrl) {
@@ -527,8 +528,9 @@
             // but Ctrl on an *area* just clears those items
             // out of the selection.
-            if (area)
+            if (area) {
                 ds.clearSelection(selectionList);
-            else
+            } else {
                 ds.toggleSelected(selectionList);
+            }
         } else {
             // This is either a plain click (which means we
@@ -538,5 +540,4 @@
             ds.addSelected(selectionList);
         }
-        ds.fireSelectionChanged();
         Main.map.mapView.repaint();
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2402)
@@ -783,15 +783,23 @@
 
     public void clenupDeletedPrimitives() {
-        cleanupDeleted(nodes.iterator());
-        cleanupDeleted(ways.iterator());
-        cleanupDeleted(relations.iterator());
-    }
-
-    private void cleanupDeleted(Iterator<? extends OsmPrimitive> it) {
+        if (cleanupDeleted(nodes.iterator())
+                | cleanupDeleted(ways.iterator())
+                | cleanupDeleted(relations.iterator())) {
+            fireSelectionChanged();
+        }
+    }
+
+    private boolean cleanupDeleted(Iterator<? extends OsmPrimitive> it) {
+        boolean changed = false;
         while (it.hasNext()) {
-            if (it.next().isDeleted()) {
+            OsmPrimitive primitive = it.next();
+            if (primitive.isDeleted()) {
+                selectedPrimitives.remove(primitive);
+                allPrimitives.remove(primitive);
+                changed = true;
                 it.remove();
             }
         }
+        return changed;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 2402)
@@ -333,5 +333,4 @@
                 }
             }
-            ds.fireSelectionChanged();
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2402)
@@ -529,5 +529,4 @@
             if (getCurrentDataSet() != null) {
                 getCurrentDataSet().setSelected();
-                getCurrentDataSet().fireSelectionChanged();
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2402)
@@ -518,5 +518,4 @@
             }
             Main.map.mapView.getEditLayer().data.setSelected(selection);
-            Main.map.mapView.getEditLayer().data.fireSelectionChanged();
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java	(revision 2401)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java	(revision 2402)
@@ -143,5 +143,4 @@
             return;
         layer.cleanupAfterUpload(processedPrimitives);
-        layer.data.fireSelectionChanged();;
         layer.fireDataChange();
         layer.onPostUploadToServer();
