Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 19565)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 19566)
@@ -52,4 +52,5 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
+import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.SelectionManager;
 import org.openstreetmap.josm.gui.SelectionManager.SelectionEnded;
@@ -793,5 +794,9 @@
                 if (mode == Mode.ROTATE) {
                     if (c instanceof RotateCommand && affectedNodes.equals(((RotateCommand) c).getTransformedNodes())) {
-                        ((RotateCommand) c).handleEvent(currentEN);
+                        if (didMouseDrag) {
+                            ((RotateCommand) c).handleEvent(currentEN);
+                        } else {
+                            ((RotateCommand) c).handleUpdate(currentEN);
+                        }
                     } else {
                         UndoRedoHandler.getInstance().add(new RotateCommand(selection, currentEN));
@@ -799,5 +804,9 @@
                 } else if (mode == Mode.SCALE) {
                     if (c instanceof ScaleCommand && affectedNodes.equals(((ScaleCommand) c).getTransformedNodes())) {
-                        ((ScaleCommand) c).handleEvent(currentEN);
+                        if (didMouseDrag) {
+                            ((ScaleCommand) c).handleEvent(currentEN);
+                        } else {
+                            ((ScaleCommand) c).handleUpdate(currentEN);
+                        }
                     } else {
                         UndoRedoHandler.getInstance().add(new ScaleCommand(selection, currentEN));
Index: trunk/src/org/openstreetmap/josm/command/RotateCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/RotateCommand.java	(revision 19565)
+++ trunk/src/org/openstreetmap/josm/command/RotateCommand.java	(revision 19566)
@@ -26,5 +26,5 @@
      * angle of rotation starting click to pivot
      */
-    private final double startAngle;
+    private double startAngle;
 
     /**
@@ -32,4 +32,6 @@
      */
     private double rotationAngle;
+
+    private double deltaAngle;
 
     /**
@@ -66,6 +68,16 @@
     public final void handleEvent(EastNorth currentEN) {
         double currentAngle = getAngle(currentEN);
-        rotationAngle = currentAngle - startAngle;
+        rotationAngle = currentAngle - startAngle + deltaAngle;
         transformNodes();
+    }
+
+    /**
+     * Handle a repeated rotation action where the mouse was moved to a different position
+     * see #24695
+     * @param startEN start cursor position of a repeated rotation
+     */
+    public void handleUpdate(EastNorth startEN) {
+        deltaAngle = rotationAngle;
+        startAngle = getAngle(startEN);
     }
 
Index: trunk/src/org/openstreetmap/josm/command/ScaleCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ScaleCommand.java	(revision 19565)
+++ trunk/src/org/openstreetmap/josm/command/ScaleCommand.java	(revision 19566)
@@ -27,7 +27,12 @@
 
     /**
+     * scaling factor applied previously
+     */
+    private double deltaScalingFactor;
+
+    /**
      * World position of the mouse when the user started the command.
      */
-    private final EastNorth startEN;
+    private EastNorth startEN;
 
     /**
@@ -58,10 +63,24 @@
     @Override
     public final void handleEvent(EastNorth currentEN) {
-        double startAngle = Math.atan2(startEN.east()-pivot.east(), startEN.north()-pivot.north());
-        double endAngle = Math.atan2(currentEN.east()-pivot.east(), currentEN.north()-pivot.north());
+        setScalingFactor(deltaScalingFactor + calcScalingFactor(currentEN));
+        transformNodes();
+    }
+
+    /**
+     * Handle a repeated scaling action where the mouse was moved to a different position
+     * see #24695
+     * @param newStartEN start cursor position of a repeated scaling
+     */
+    public void handleUpdate(EastNorth newStartEN) {
+        startEN = newStartEN;
+        deltaScalingFactor = scalingFactor - calcScalingFactor(newStartEN);
+    }
+
+    private double calcScalingFactor(EastNorth currentEN) {
+        double startAngle = Math.atan2(startEN.east() - pivot.east(), startEN.north() - pivot.north());
+        double endAngle = Math.atan2(currentEN.east() - pivot.east(), currentEN.north() - pivot.north());
         double startDistance = pivot.distance(startEN);
         double currentDistance = pivot.distance(currentEN);
-        setScalingFactor(Math.cos(startAngle-endAngle) * currentDistance / startDistance);
-        transformNodes();
+        return Math.cos(startAngle - endAngle) * currentDistance / startDistance;
     }
 
