Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 371)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 372)
@@ -11,4 +11,5 @@
 import java.awt.event.ActionEvent;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 
@@ -177,15 +178,17 @@
 			return;
 		boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
+		boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;
+		boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
 
 		Collection<OsmPrimitive> sel = Main.ds.getSelected();
 		OsmPrimitive osm = Main.map.mapView.getNearest(e.getPoint());
-		if (ctrl) {
-			if (osm != null && !sel.contains(osm)) Main.ds.setSelected(osm);
-
+		Collection osmColl = osm == null
+			? Collections.emptyList() : Collections.singleton(osm);
+		if (ctrl && shift) {
+			selectPrims(osmColl, true, false);
 			mode = Mode.rotate;
 			setCursor(ImageProvider.getCursor("rotate", null));
 		} else if (osm != null) {
-			if (!sel.contains(osm)) Main.ds.setSelected(osm);
-
+			selectPrims(osmColl, shift, ctrl);
 			mode = Mode.move;
 		} else {
@@ -213,4 +216,8 @@
 
 	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)
 			return; // not allowed together
@@ -222,5 +229,4 @@
 			curSel = Main.ds.getSelected();
 
-		Collection<OsmPrimitive> selectionList = selectionManager.getObjectsInRectangle(r,alt);
 		for (OsmPrimitive osm : selectionList)
 			if (ctrl)
