Index: trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 2758)
+++ trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 2759)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -226,4 +227,8 @@
                 setEnabled(true);
             }
+        } else if ("previous".equals(mode)) {
+            setEnabled(Main.map != null && Main.map.mapView != null && Main.map.mapView.hasZoomUndoEntries());
+        } else if ("next".equals(mode)) {
+            setEnabled(Main.map != null && Main.map.mapView != null && Main.map.mapView.hasZoomRedoEntries());
         } else {
             setEnabled(
@@ -240,3 +245,25 @@
         }
     }
+
+    @Override
+    protected void installAdapters() {
+        super.installAdapters();
+        // make this action listen to zoom change events
+        //
+        zoomChangeAdapter = new ZoomChangeAdapter();
+        MapView.addZoomChangeListener(zoomChangeAdapter);
+        initEnabledState();
+    }
+
+    /**
+     * Adapter for selection change events
+     *
+     */
+    private class ZoomChangeAdapter implements MapView.ZoomChangeListener {
+        public void zoomChanged() {
+            updateEnabledState();
+        }
+    }
+
+    private ZoomChangeAdapter zoomChangeAdapter;
 }
Index: trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 2758)
+++ trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 2759)
@@ -139,5 +139,5 @@
     }
 
-    private void installAdapters() {
+    protected void installAdapters() {
         // make this action listen to layer change and selection change events
         //
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 2758)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 2759)
@@ -13,4 +13,5 @@
 import java.util.List;
 import java.util.TreeMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.JComponent;
@@ -38,4 +39,43 @@
  */
 public class NavigatableComponent extends JComponent implements Helpful {
+
+    /**
+     * Interface to notify listeners of the change of the zoom area.
+     */
+    public interface ZoomChangeListener {
+        void zoomChanged();
+    }
+
+    /**
+     * the zoom listeners
+     */
+    private static final CopyOnWriteArrayList<ZoomChangeListener> zoomChangeListeners = new CopyOnWriteArrayList<ZoomChangeListener>();
+
+    /**
+     * Removes a zoom change listener
+     *
+     * @param listener the listener. Ignored if null or already absent
+     */
+    public static void removeZoomChangeListener(NavigatableComponent.ZoomChangeListener listener) {
+        zoomChangeListeners.remove(listener);
+    }
+
+    /**
+     * Adds a zoom change listener
+     *
+     * @param listener the listener. Ignored if null or already registered.
+     */
+    public static void addZoomChangeListener(NavigatableComponent.ZoomChangeListener listener) {
+        if (listener != null) {
+            zoomChangeListeners.addIfAbsent(listener);
+        }
+    }
+
+    protected static void fireZoomChanged() {
+        for (ZoomChangeListener l : zoomChangeListeners) {
+            l.zoomChanged();
+        }
+    }
+
 
     public static final int snapDistance = Main.pref.getInteger("node.snap-distance", 10);
@@ -267,4 +307,5 @@
 
         repaint();
+        fireZoomChanged();
     }
 
@@ -367,4 +408,12 @@
             zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale());
         }
+    }
+
+    public boolean hasZoomUndoEntries() {
+        return !zoomUndoBuffer.isEmpty();
+    }
+
+    public boolean hasZoomRedoEntries() {
+        return !zoomRedoBuffer.isEmpty();
     }
 
