diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index dce2e5a..df82f56 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -266,7 +266,7 @@ abstract public class Main {
         panel.add(gettingStarted, BorderLayout.CENTER);
         menu = new MainMenu();
 
-        undoRedo.listenerCommands.add(redoUndoListener);
+        undoRedo.addCommandQueueListener(redoUndoListener);
 
         // creating toolbar
         contentPanePrivate.add(toolbar.control, BorderLayout.NORTH);
diff --git a/src/org/openstreetmap/josm/actions/RedoAction.java b/src/org/openstreetmap/josm/actions/RedoAction.java
index 25a734d..dd90fe2 100644
--- a/src/org/openstreetmap/josm/actions/RedoAction.java
+++ b/src/org/openstreetmap/josm/actions/RedoAction.java
@@ -8,6 +8,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -15,7 +16,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  *
  * @author imi
  */
-public class RedoAction extends JosmAction {
+public class RedoAction extends JosmAction implements OsmDataLayer.CommandQueueListener {
 
     /**
      * Construct the action with "Redo" as label.
@@ -38,4 +39,13 @@ public class RedoAction extends JosmAction {
     protected void updateEnabledState() {
         setEnabled(Main.main != null && !Main.main.undoRedo.redoCommands.isEmpty());
     }
+
+    @Override
+    public void commandChanged(int queueSize, int redoSize) {
+        if (Main.main.undoRedo.redoCommands.isEmpty()) {
+            putValue(NAME, tr("Redo"));
+        } else {
+            putValue(NAME, tr("Redo {0}", Main.main.undoRedo.redoCommands.getFirst().getDescrpitionText()));
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/actions/UndoAction.java b/src/org/openstreetmap/josm/actions/UndoAction.java
index 1c70de2..82a3b7c 100644
--- a/src/org/openstreetmap/josm/actions/UndoAction.java
+++ b/src/org/openstreetmap/josm/actions/UndoAction.java
@@ -8,6 +8,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -15,7 +16,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  *
  * @author imi
  */
-public class UndoAction extends JosmAction {
+public class UndoAction extends JosmAction implements OsmDataLayer.CommandQueueListener {
 
     /**
      * Construct the action with "Undo" as label.
@@ -39,4 +40,12 @@ public class UndoAction extends JosmAction {
         setEnabled(Main.main != null && !Main.main.undoRedo.commands.isEmpty());
     }
 
+    @Override
+    public void commandChanged(int queueSize, int redoSize) {
+        if (Main.main.undoRedo.commands.isEmpty()) {
+            putValue(NAME, tr("Undo"));
+        } else {
+            putValue(NAME, tr("Undo {0}", Main.main.undoRedo.commands.getFirst().getDescrpitionText()));
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/command/Command.java b/src/org/openstreetmap/josm/command/Command.java
index 083623f..4f2d521 100644
--- a/src/org/openstreetmap/josm/command/Command.java
+++ b/src/org/openstreetmap/josm/command/Command.java
@@ -170,6 +170,15 @@ abstract public class Command extends PseudoCommand {
         return ((DefaultMutableTreeNode) description()).getUserObject();
     }
 
+    public String getDescrpitionText() {
+        Object o = getDescription();
+        if (o instanceof JLabel) {
+            return ((JLabel) o).getText();
+        } else {
+            return o.toString();
+        }
+    }
+
     /**
      * @deprecated use getDescription() and getChildren() instead
      */
diff --git a/src/org/openstreetmap/josm/data/UndoRedoHandler.java b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
index 85ad126..b948b40 100644
--- a/src/org/openstreetmap/josm/data/UndoRedoHandler.java
+++ b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
@@ -23,7 +23,7 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
      */
     public final LinkedList<Command> redoCommands = new LinkedList<Command>();
 
-    public final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<CommandQueueListener>();
+    private final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<CommandQueueListener>();
 
     public UndoRedoHandler() {
         MapView.addLayerChangeListener(this);
@@ -162,4 +162,12 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
 
     public void layerAdded(Layer newLayer) {}
     public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
+
+    public void removeCommandQueueListener(CommandQueueListener l) {
+        listenerCommands.remove(l);
+    }
+
+    public boolean addCommandQueueListener(CommandQueueListener l) {
+        return listenerCommands.add(l);
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index ecbec2f..e8cfe74 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -400,7 +400,9 @@ public class MainMenu extends JMenuBar {
         add(fileMenu, exit);
 
         add(editMenu, undo);
+        Main.main.undoRedo.addCommandQueueListener(undo);
         add(editMenu, redo);
+        Main.main.undoRedo.addCommandQueueListener(redo);
         editMenu.addSeparator();
         add(editMenu, copy);
         add(editMenu, copyCoordinates, true);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java b/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
index a153cfc..5cfbd1f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
@@ -202,7 +202,7 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
         for (IEnabledStateUpdating listener : showNotifyListener) {
             listener.updateEnabledState();
         }
-        Main.main.undoRedo.listenerCommands.add(this);
+        Main.main.undoRedo.addCommandQueueListener(this);
     }
 
     /**
@@ -218,7 +218,7 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
     public void hideNotify() {
         undoTreeModel.setRoot(new DefaultMutableTreeNode());
         redoTreeModel.setRoot(new DefaultMutableTreeNode());
-        Main.main.undoRedo.listenerCommands.remove(this);
+        Main.main.undoRedo.removeCommandQueueListener(this);
     }
 
     /**
