Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 852)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 853)
@@ -51,4 +51,7 @@
 	private long mouseDownTime = 0;
 	private boolean didMove = false;
+	Node virtualNode = null;
+	WaySegment virtualWay = null;
+	SequenceCommand virtualCmds = null;
 
 	/**
@@ -133,5 +136,5 @@
 	@Override public void mouseDragged(MouseEvent e) {
 		if (mode == Mode.select) return;
-		
+
 		// do not count anything as a move if it lasts less than 100 milliseconds.
 		if ((mode == Mode.move) && (System.currentTimeMillis() - mouseDownTime < initialMoveDelay)) return;
@@ -164,4 +167,19 @@
 			return;
 
+		if(virtualWay != null)
+		{
+			Collection<Command> virtualCmds = new LinkedList<Command>();
+			virtualCmds.add(new AddCommand(virtualNode));
+			Way w = virtualWay.way;
+			Way wnew = new Way(w);
+			wnew.nodes.add(virtualWay.lowerIndex+1, virtualNode);
+			virtualCmds.add(new ChangeCommand(w, wnew));
+			virtualCmds.add(new MoveCommand(virtualNode, dx, dy));
+			Main.main.undoRedo.add(new SequenceCommand(tr("Add and move a virtual new node to way"), virtualCmds));
+			selectPrims(Collections.singleton((OsmPrimitive)virtualNode), false, false);
+			virtualWay = null;
+			virtualNode = null;
+		}
+
 		Collection<OsmPrimitive> selection = Main.ds.getSelected();
 		Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(selection);
@@ -173,4 +191,6 @@
 		Command c = !Main.main.undoRedo.commands.isEmpty()
 			? Main.main.undoRedo.commands.getLast() : null;
+		if(c instanceof SequenceCommand)
+			c = ((SequenceCommand)c).getLastCommand();
 
 		if (mode == Mode.move) {
@@ -227,13 +247,7 @@
 						if(p.distanceSq(pc) < snapDistance)
 						{
-							Collection<Command> cmds = new LinkedList<Command>();
-							Node n = new Node(Main.map.mapView.getLatLon(pc.x, pc.y));
-							cmds.add(new AddCommand(n));
-
-							Way wnew = new Way(w);
-							wnew.nodes.add(nearestWaySeg.lowerIndex+1, n);
-							cmds.add(new ChangeCommand(w, wnew));
-							Main.main.undoRedo.add(new SequenceCommand(tr("Add a new node to an existing way"), cmds));
-							osm = n;
+							virtualWay = nearestWaySeg;
+							virtualNode = new Node(Main.map.mapView.getLatLon(pc.x, pc.y));
+							osm = w;
 						}
 					}
@@ -287,4 +301,9 @@
 			selectionManager.register(Main.map.mapView);
 			selectionManager.mousePressed(e);
+		}
+		if(mode != Mode.move || shift || ctrl)
+		{
+			virtualNode = null;
+			virtualWay = null;
 		}
 
Index: /trunk/src/org/openstreetmap/josm/command/SequenceCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 852)
+++ /trunk/src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 853)
@@ -61,4 +61,9 @@
 	}
 
+	public Command getLastCommand() {
+		if(sequence.length == 0)
+			return null;
+		return sequence[sequence.length-1];
+	}
 	private void undoCommands(int start) {
 		// We probably aborted this halfway though the
