Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 453)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 454)
@@ -45,4 +45,5 @@
 	private Mode mode = null;
 	private long mouseDownTime = 0;
+	private boolean didMove = false;
 
 	/**
@@ -175,4 +176,6 @@
 		Main.map.mapView.repaint();
 		mousePos = e.getPoint();
+
+		didMove = true;
 	}
 
@@ -194,18 +197,9 @@
 		
 		mouseDownTime = System.currentTimeMillis();
-
-		// find the object that was clicked on.
-		// if the object is not part of the current selection, clear current
-		// selection before proceeding.
-		Collection<OsmPrimitive> osmColl = null;
-		OsmPrimitive osm = Main.map.mapView.getNearest(e.getPoint());
-		if (osm == null) {
-			osmColl = Collections.emptySet();
-			Main.ds.setSelected();
-		} else {
-			osmColl = Collections.singleton(osm);
-			if (!Main.ds.getSelected().contains(osm)) Main.ds.setSelected();
-		}
-		
+		didMove = false;
+
+		Collection<OsmPrimitive> osmColl =
+			Main.map.mapView.getNearestCollection(e.getPoint());
+
 		if (ctrl && shift) {
 			if (Main.ds.getSelected().isEmpty()) selectPrims(osmColl, true, false);
@@ -213,5 +207,7 @@
 			setCursor(ImageProvider.getCursor("rotate", null));
 		} else if (!osmColl.isEmpty()) {
-			if (Main.ds.getSelected().isEmpty()) selectPrims(osmColl, shift, ctrl);
+			// Only add to selection for now, we only do replace and remove in
+			// mouseReleased if the user didn't try to move.
+			selectPrims(osmColl, true, ctrl);
 			mode = Mode.move;
 		} else {
@@ -239,5 +235,10 @@
 		if (mode == Mode.move) {
 			boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
-			if (ctrl) {
+			boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
+			if (!didMove) {
+				selectPrims(
+					Main.map.mapView.getNearestCollection(e.getPoint()),
+					shift, ctrl);
+			} else if (ctrl) {
 				Collection<OsmPrimitive> selection = Main.ds.getSelected();
 				Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(selection);
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 453)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 454)
@@ -4,4 +4,5 @@
 import java.awt.Point;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.TreeMap;
@@ -242,4 +243,16 @@
 			osm = getNearestWay(p);
 		return osm;
+	}
+
+	/**
+	 * Returns a singleton of the nearest object, or else an empty collection.
+	 */
+	public Collection<OsmPrimitive> getNearestCollection(Point p) {
+		OsmPrimitive osm = getNearest(p);
+		if (osm == null) {
+			return Collections.emptySet();
+		} else {
+			return Collections.singleton(osm);
+		}
 	}
 
