Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 364)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 365)
@@ -9,4 +9,5 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.awt.event.ActionEvent;
 import java.util.Collection;
 import java.util.LinkedList;
@@ -38,18 +39,8 @@
  */
 public class SelectAction extends MapMode implements SelectionEnded {
-	
-	enum Mode {move, rotate}
-	private final Mode mode;
-
-	public static class SelectGroup extends GroupAction {
-		public SelectGroup(MapFrame mf) {
-			super(KeyEvent.VK_S,0);
-			putValue("help", "Action/Move");
-			actions.add(new SelectAction(mf, tr("Select/Move"), Mode.move, tr("Select and move around objects that are under the mouse or selected.")));
-			actions.add(new SelectAction(mf, tr("Rotate"), Mode.rotate, tr("Rotate selected nodes around centre")));
-			setCurrent(0);
-		}
-	}
-	
+
+	enum Mode { move, rotate, select }
+	private Mode mode = null;
+
 	/**
 	 * The old cursor before the user pressed the mouse button.
@@ -61,5 +52,4 @@
 	private Point mousePos;
 	private SelectionManager selectionManager;
-	private boolean selectionMode = false;
 
 	/**
@@ -67,18 +57,37 @@
 	 * @param mapFrame The MapFrame, this action belongs to.
 	 */
-	public SelectAction(MapFrame mapFrame, String name, Mode mode, String desc) {
-		super(name, "move/"+mode, desc, mapFrame, getCursor());
-		this.mode = mode;
-		putValue("help", "Action/Move/"+Character.toUpperCase(mode.toString().charAt(0))+mode.toString().substring(1));
+	public SelectAction(MapFrame mapFrame) {
+		super(tr("Select"), "move/move", tr("Select, move and rotate objects"),
+			KeyEvent.VK_S, mapFrame,
+			getCursor("normal", "selection", Cursor.DEFAULT_CURSOR));
+		putValue("help", "Action/Move/Move");
 		selectionManager = new SelectionManager(this, false, mapFrame.mapView);
 	}
 
-	private static Cursor getCursor() {
+	private static Cursor getCursor(String name, String mod, int def) {
 		try {
-	        return ImageProvider.getCursor("crosshair", null);
+	        return ImageProvider.getCursor(name, mod);
         } catch (Exception e) {
         }
-	    return Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
+	    return Cursor.getPredefinedCursor(def);
     }
+
+	private static Cursor getCursor(String name, int def) {
+		return getCursor(name, null, def);
+	}
+
+	private void setCursor(Cursor c) {
+		if (oldCursor == null) {
+			oldCursor = Main.map.mapView.getCursor();
+			Main.map.mapView.setCursor(c);
+		}
+	}
+
+	private void restoreCursor() {
+		if (oldCursor != null) {
+			Main.map.mapView.setCursor(oldCursor);
+			oldCursor = null;
+		}
+	}
 	
 	@Override public void enterMode() {
@@ -100,12 +109,16 @@
 	 */
 	@Override public void mouseDragged(MouseEvent e) {
+		if (mode == Mode.select) return;
+
 		if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == 0)
 			return;
 
-		if (selectionMode)
-			return;
-
-		if (mousePos == null)
+		if (mode == Mode.move) {
+			setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+		}
+
+		if (mousePos == null) {
 			mousePos = e.getPoint();
+		}
 		
 		EastNorth mouseEN = Main.map.mapView.getEastNorth(e.getX(), e.getY());
@@ -127,9 +140,11 @@
 		for (OsmPrimitive osm : affectedNodes) {
 			if (osm instanceof Node && ((Node)osm).coor.isOutSideWorld()) {
-				JOptionPane.showMessageDialog(Main.parent,tr("Cannot move objects outside of the world."));
+				JOptionPane.showMessageDialog(Main.parent,
+					tr("Cannot move objects outside of the world."));
 				return;
 			}
 		}
-		Command c = !Main.main.undoRedo.commands.isEmpty() ? Main.main.undoRedo.commands.getLast() : null;
+		Command c = !Main.main.undoRedo.commands.isEmpty()
+			? Main.main.undoRedo.commands.getLast() : null;
 
 		if (mode == Mode.move) {
@@ -161,19 +176,20 @@
 		if (e.getButton() != MouseEvent.BUTTON1)
 			return;
+		boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
 
 		Collection<OsmPrimitive> sel = Main.ds.getSelected();
 		OsmPrimitive osm = Main.map.mapView.getNearest(e.getPoint());
-		if (osm != null) {
-			if (!sel.contains(osm))
-				Main.ds.setSelected(osm);
+		if (ctrl) {
+			if (osm != null && !sel.contains(osm)) Main.ds.setSelected(osm);
+
+			mode = Mode.rotate;
+			setCursor(ImageProvider.getCursor("rotate", null));
+		} else if (osm != null) {
+			if (!sel.contains(osm)) Main.ds.setSelected(osm);
+
+			mode = Mode.move;
+		} else {
+			mode = Mode.select;
 			oldCursor = Main.map.mapView.getCursor();
-			
-			if (mode == Mode.move) {
-				Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
-			} else {
-				Main.map.mapView.setCursor(ImageProvider.getCursor("rotate", null));
-			}
-		} else {
-			selectionMode = true;
 			selectionManager.register(Main.map.mapView);
 			selectionManager.mousePressed(e);
@@ -189,18 +205,12 @@
 	 */
 	@Override public void mouseReleased(MouseEvent e) {
-		if (selectionMode) {
+		if (mode == Mode.select) {
 			selectionManager.unregister(Main.map.mapView);
-			selectionMode = false;
-		} else
-			Main.map.mapView.setCursor(oldCursor);
+		}
+		restoreCursor();
+		mode = null;
 	}
 
 	public void selectionEnded(Rectangle r, boolean alt, boolean shift, boolean ctrl) {
-		selectEverythingInRectangle(selectionManager, r, alt, shift, ctrl);
-	}
-
-	public static void selectEverythingInRectangle(
-			SelectionManager selectionManager, Rectangle r,
-			boolean alt, boolean shift, boolean ctrl) {
 	    if (shift && ctrl)
 			return; // not allowed together
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 364)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 365)
@@ -18,5 +18,5 @@
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.actions.mapmode.ZoomAction;
-import org.openstreetmap.josm.actions.mapmode.SelectAction.SelectGroup;
+import org.openstreetmap.josm.actions.mapmode.SelectAction;
 import org.openstreetmap.josm.gui.dialogs.CommandStackDialog;
 import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
@@ -78,5 +78,5 @@
 		toolBarActions.setFloatable(false);
 		toolBarActions.add(new IconToggleButton(new ZoomAction(this)));
-		toolBarActions.add(new IconToggleButton(new SelectGroup(this)));
+		toolBarActions.add(new IconToggleButton(new SelectAction(this)));
 		toolBarActions.add(new IconToggleButton(new DrawAction(this)));
 		toolBarActions.add(new IconToggleButton(new DeleteAction(this)));
