Index: /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 8899)
+++ /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 8900)
@@ -43,4 +43,7 @@
 public class AutoScaleAction extends JosmAction {
 
+    /**
+     * A list of things we can zoom to. The zoom target is given depending on the mode.
+     */
     public static final Collection<String> MODES = Collections.unmodifiableList(Arrays.asList(
         marktr(/* ICON(dialogs/autoscale/) */ "data"),
@@ -53,4 +56,7 @@
         marktr(/* ICON(dialogs/autoscale/) */ "next")));
 
+    /**
+     * One of {@link #MODES}. Defines what we are zooming to.
+     */
     private final String mode;
 
@@ -83,8 +89,12 @@
     }
 
+    /**
+     * Zooms the view to display the given set of primitives.
+     * @param sel The primitives to zoom to, e.g. the current selection.
+     */
     public static void zoomTo(Collection<OsmPrimitive> sel) {
         BoundingXYVisitor bboxCalculator = new BoundingXYVisitor();
         bboxCalculator.computeBoundingBox(sel);
-        // increase bbox by 0.001 degrees on each side. this is required
+        // increase bbox. This is required
         // especially if the bbox contains one single node, but helpful
         // in most other cases as well.
@@ -95,4 +105,8 @@
     }
 
+    /**
+     * Performs the auto scale operation of the given mode without the need to create a new action.
+     * @param mode One of {@link #MODES}.
+     */
     public static void autoScale(String mode) {
         new AutoScaleAction(mode, false).autoScale();
@@ -172,4 +186,7 @@
     }
 
+    /**
+     * Performs this auto scale operation for the mode this action is in.
+     */
     public void autoScale() {
         if (Main.isDisplayingMapView()) {
Index: /trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 8899)
+++ /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 8900)
@@ -33,4 +33,6 @@
 import java.util.List;
 import java.util.TreeSet;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
 
 import javax.swing.AbstractAction;
@@ -348,4 +350,8 @@
         private MapFrame parent;
 
+        private BlockingQueue<MouseState> incommingMouseState = new LinkedBlockingQueue<>();
+
+        private Point lastMousePos;
+
         Collector(MapFrame parent) {
             this.parent = parent;
@@ -360,26 +366,14 @@
             try {
                 for (;;) {
-
-                    final MouseState ms = new MouseState();
-                    synchronized (this) {
-                        // TODO Would be better if the timeout wasn't necessary
-                        try {
-                            wait(1000);
-                        } catch (InterruptedException e) {
-                            // Occurs frequently during JOSM shutdown, log set to trace only
-                            Main.trace("InterruptedException in "+MapStatus.class.getSimpleName());
+                    try {
+                        final MouseState ms = incommingMouseState.take();
+                        if (parent != Main.map)
+                            return; // exit, if new parent.
+
+                        // Do nothing, if required data is missing
+                        if (ms.mousePos == null || mv.center == null) {
+                            continue;
                         }
-                        ms.modifiers = mouseState.modifiers;
-                        ms.mousePos = mouseState.mousePos;
-                    }
-                    if (parent != Main.map)
-                        return; // exit, if new parent.
-
-                    // Do nothing, if required data is missing
-                    if (ms.mousePos == null || mv.center == null) {
-                        continue;
-                    }
-
-                    try {
+
                         EventQueue.invokeAndWait(new CollectorWorker(ms));
                     } catch (InterruptedException e) {
@@ -650,4 +644,21 @@
             return l;
         }
+
+        /**
+         * Called whenever the mouse position or modifiers changed.
+         * @param mousePos The new mouse position. <code>null</code> if it did not change.
+         * @param modifiers The new modifiers.
+         */
+        public synchronized void updateMousePosition(Point mousePos, int modifiers) {
+            MouseState ms = new MouseState();
+            if (mousePos == null) {
+                ms.mousePos = lastMousePos;
+            } else {
+                lastMousePos = mousePos;
+            }
+            // remove mouse states that are in the queue. Our mouse state is newer.
+            incommingMouseState.clear();
+            incommingMouseState.offer(ms);
+        }
     }
 
@@ -660,8 +671,4 @@
         private int modifiers;
     }
-    /**
-     * The last sent mouse movement event.
-     */
-    private transient MouseState mouseState = new MouseState();
 
     private transient AWTEventListener awtListener = new AWTEventListener() {
@@ -671,9 +678,10 @@
                     ((InputEvent) event).getComponent() == mv) {
                 synchronized (collector) {
-                    mouseState.modifiers = ((InputEvent) event).getModifiersEx();
+                    int modifiers = ((InputEvent) event).getModifiersEx();
+                    Point mousePos = null;
                     if (event instanceof MouseEvent) {
-                        mouseState.mousePos = ((MouseEvent) event).getPoint();
+                        mousePos = ((MouseEvent) event).getPoint();
                     }
-                    collector.notifyAll();
+                    collector.updateMousePosition(mousePos, modifiers);
                 }
             }
@@ -685,7 +693,5 @@
         public void mouseMoved(MouseEvent e) {
             synchronized (collector) {
-                mouseState.modifiers = e.getModifiersEx();
-                mouseState.mousePos = e.getPoint();
-                collector.notifyAll();
+                collector.updateMousePosition(e.getPoint(), e.getModifiersEx());
             }
         }
@@ -700,6 +706,5 @@
         @Override public void keyPressed(KeyEvent e) {
             synchronized (collector) {
-                mouseState.modifiers = e.getModifiersEx();
-                collector.notifyAll();
+                collector.updateMousePosition(null, e.getModifiersEx());
             }
         }
