Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 1453)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 1454)
@@ -197,5 +197,5 @@
 
             Main.main.undoRedo.add(new SequenceCommand(text, virtualCmds));
-            selectPrims(Collections.singleton((OsmPrimitive)virtualNode), false, false);
+            selectPrims(Collections.singleton((OsmPrimitive)virtualNode), false, false, false);
             virtualWays.clear();
             virtualNode = null;
@@ -333,5 +333,5 @@
 
         if (ctrl && shift) {
-            if (Main.ds.getSelected().isEmpty()) selectPrims(osmColl, true, false);
+            if (Main.ds.getSelected().isEmpty()) selectPrims(osmColl, true, false, false);
             mode = Mode.rotate;
             setCursor(ImageProvider.getCursor("rotate", null));
@@ -343,5 +343,5 @@
             selectPrims(osmColl,
                 shift || Main.ds.getSelected().containsAll(osmColl),
-                ctrl);
+                ctrl, false);
             mode = Mode.move;
         } else {
@@ -391,5 +391,5 @@
                 selectPrims(
                     Main.map.mapView.getNearestCollection(e.getPoint()),
-                    shift, ctrl);
+                    shift, ctrl, true);
 
                 // If the user double-clicked a node, change to draw mode
@@ -433,9 +433,9 @@
 
     public void selectionEnded(Rectangle r, boolean alt, boolean shift, boolean ctrl) {
-        selectPrims(selectionManager.getObjectsInRectangle(r, alt), shift, ctrl);
-    }
-
-    public void selectPrims(Collection<OsmPrimitive> selectionList, boolean shift, boolean ctrl) {
-        if (shift && ctrl)
+        selectPrims(selectionManager.getObjectsInRectangle(r, alt), shift, ctrl, false);
+    }
+
+    public void selectPrims(Collection<OsmPrimitive> selectionList, boolean shift, boolean ctrl, boolean released) {
+        if ((shift && ctrl) || (ctrl && !released))
             return; // not allowed together
 
@@ -447,8 +447,15 @@
 
         for (OsmPrimitive osm : selectionList)
+        {
             if (ctrl)
-                curSel.remove(osm);
+            {
+                if(curSel.contains(osm))
+                    curSel.remove(osm);
+                else
+                    curSel.add(osm);
+            }
             else
                 curSel.add(osm);
+        }
         Main.ds.setSelected(curSel);
         Main.map.mapView.repaint();
@@ -463,5 +470,5 @@
             return tr("Release the mouse button to stop rotating.");
         } else {
-            return tr("Move objects by dragging; Shift to add to selection (Ctrl to remove); Shift-Ctrl to rotate selected; or change selection");
+            return tr("Move objects by dragging; Shift to add to selection (Ctrl to toggle); Shift-Ctrl to rotate selected; or change selection");
         }
     }
