Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 4908)
@@ -268,5 +268,5 @@
         menu = new MainMenu();
 
-        undoRedo.listenerCommands.add(redoUndoListener);
+        undoRedo.addCommandQueueListener(redoUndoListener);
 
         // creating toolbar
Index: /trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 4908)
@@ -74,5 +74,5 @@
             Main.registerActionShortcut(this, sc);
         }
-        putValue(SHORT_DESCRIPTION, Main.platform.makeTooltip(tooltip, sc));
+        setTooltip(tooltip);
         if (getValue("toolbar") == null) {
             putValue("toolbar", toolbarId == null ? iconName : toolbarId);
@@ -119,4 +119,8 @@
         }
         putValue("help", helpId);
+    }
+
+    public void setTooltip(String tooltip) {
+        putValue(SHORT_DESCRIPTION, Main.platform.makeTooltip(tooltip, sc));
     }
 
Index: /trunk/src/org/openstreetmap/josm/actions/RedoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 4908)
@@ -9,4 +9,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -16,5 +17,5 @@
  * @author imi
  */
-public class RedoAction extends JosmAction {
+public class RedoAction extends JosmAction implements OsmDataLayer.CommandQueueListener {
 
     /**
@@ -39,3 +40,15 @@
         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"));
+            setTooltip(tr("Redo the last undone action."));
+        } else {
+            putValue(NAME, tr("Redo ..."));
+            setTooltip(tr("Redo {0}",
+                    Main.main.undoRedo.redoCommands.getFirst().getDescrpitionText()));
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/UndoAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 4908)
@@ -9,4 +9,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -16,5 +17,5 @@
  * @author imi
  */
-public class UndoAction extends JosmAction {
+public class UndoAction extends JosmAction implements OsmDataLayer.CommandQueueListener {
 
     /**
@@ -40,3 +41,14 @@
     }
 
+    @Override
+    public void commandChanged(int queueSize, int redoSize) {
+        if (Main.main.undoRedo.commands.isEmpty()) {
+            putValue(NAME, tr("Undo"));
+            setTooltip(tr("Undo the last action."));
+        } else {
+            putValue(NAME, tr("Undo ..."));
+            setTooltip(tr("Undo {0}",
+                    Main.main.undoRedo.commands.getFirst().getDescrpitionText()));
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/command/Command.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/Command.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/command/Command.java	(revision 4908)
@@ -160,4 +160,13 @@
     @Override public Collection<? extends OsmPrimitive> getParticipatingPrimitives() {
         return cloneMap.keySet();
+    }
+
+    public String getDescrpitionText() {
+        Object o = getDescription();
+        if (o instanceof JLabel) {
+            return ((JLabel) o).getText();
+        } else {
+            return o.toString();
+        }
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 4908)
@@ -24,5 +24,5 @@
     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() {
@@ -163,3 +163,11 @@
     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);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 4908)
@@ -401,5 +401,7 @@
 
         add(editMenu, undo);
+        Main.main.undoRedo.addCommandQueueListener(undo);
         add(editMenu, redo);
+        Main.main.undoRedo.addCommandQueueListener(redo);
         editMenu.addSeparator();
         add(editMenu, copy);
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 4907)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 4908)
@@ -203,5 +203,5 @@
             listener.updateEnabledState();
         }
-        Main.main.undoRedo.listenerCommands.add(this);
+        Main.main.undoRedo.addCommandQueueListener(this);
     }
 
@@ -219,5 +219,5 @@
         undoTreeModel.setRoot(new DefaultMutableTreeNode());
         redoTreeModel.setRoot(new DefaultMutableTreeNode());
-        Main.main.undoRedo.listenerCommands.remove(this);
+        Main.main.undoRedo.removeCommandQueueListener(this);
     }
 
