Index: trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 14279)
+++ trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 14281)
@@ -569,5 +569,5 @@
             if (addUndoRedo) {
                 UndoRedoHandler.getInstance().undo();
-                UndoRedoHandler.getInstance().redoCommands.clear();
+                UndoRedoHandler.getInstance().getRedoCommands().clear();
             }
         }
@@ -1601,7 +1601,8 @@
         if (addUndoRedo) {
             UndoRedoHandler ur = UndoRedoHandler.getInstance();
-            int i = Math.max(ur.commands.size() - cmdsCount, 0);
-            for (; i < ur.commands.size(); i++) {
-                cmds.add(ur.commands.get(i));
+            List<Command> commands = ur.getUndoCommands();
+            int i = Math.max(commands.size() - cmdsCount, 0);
+            for (; i < commands.size(); i++) {
+                cmds.add(commands.get(i));
             }
 
Index: trunk/src/org/openstreetmap/josm/actions/RedoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 14279)
+++ trunk/src/org/openstreetmap/josm/actions/RedoAction.java	(revision 14281)
@@ -42,10 +42,10 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(!UndoRedoHandler.getInstance().redoCommands.isEmpty());
+        setEnabled(UndoRedoHandler.getInstance().hasRedoCommands());
     }
 
     @Override
     public void commandChanged(int queueSize, int redoSize) {
-        if (UndoRedoHandler.getInstance().redoCommands.isEmpty()) {
+        if (!UndoRedoHandler.getInstance().hasRedoCommands()) {
             putValue(NAME, tr("Redo"));
             setTooltip(tr("Redo the last undone action."));
@@ -53,5 +53,5 @@
             putValue(NAME, tr("Redo ..."));
             setTooltip(tr("Redo {0}",
-                    UndoRedoHandler.getInstance().redoCommands.getFirst().getDescriptionText()));
+                    UndoRedoHandler.getInstance().getRedoCommands().getFirst().getDescriptionText()));
         }
     }
Index: trunk/src/org/openstreetmap/josm/actions/UndoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 14279)
+++ trunk/src/org/openstreetmap/josm/actions/UndoAction.java	(revision 14281)
@@ -42,10 +42,10 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(!UndoRedoHandler.getInstance().commands.isEmpty());
+        setEnabled(UndoRedoHandler.getInstance().hasUndoCommands());
     }
 
     @Override
     public void commandChanged(int queueSize, int redoSize) {
-        if (UndoRedoHandler.getInstance().commands.isEmpty()) {
+        if (!UndoRedoHandler.getInstance().hasUndoCommands()) {
             putValue(NAME, tr("Undo"));
             setTooltip(tr("Undo the last action."));
@@ -53,5 +53,5 @@
             putValue(NAME, tr("Undo ..."));
             setTooltip(tr("Undo {0}",
-                    UndoRedoHandler.getInstance().commands.getLast().getDescriptionText()));
+                    UndoRedoHandler.getInstance().getLastCommand().getDescriptionText()));
         }
     }
Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14279)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 14281)
@@ -25,8 +25,12 @@
      *
      * @see #getLastCommand()
+     * @see #getUndoCommands()
      */
     public final LinkedList<Command> commands = new LinkedList<>();
+
     /**
      * The stack for redoing commands
+
+     * @see #getRedoCommands()
      */
     public final LinkedList<Command> redoCommands = new LinkedList<>();
@@ -232,4 +236,22 @@
 
     /**
+     * Returns all commands that were made on the dataset, that can be undone.
+     * @return all commands that were made on the dataset, that can be undone
+     * @since 14281
+     */
+    public LinkedList<Command> getUndoCommands() {
+        return new LinkedList<>(commands);
+    }
+
+    /**
+     * Returns all commands that were made and undone on the dataset, that can be redone.
+     * @return all commands that were made and undone on the dataset, that can be redone.
+     * @since 14281
+     */
+    public LinkedList<Command> getRedoCommands() {
+        return new LinkedList<>(redoCommands);
+    }
+
+    /**
      * Gets the last command that was executed on the command stack.
      * @return That command or <code>null</code> if there is no such command.
@@ -238,4 +260,22 @@
     public Command getLastCommand() {
         return commands.peekLast();
+    }
+
+    /**
+     * Determines if commands can be undone.
+     * @return {14281 true} if at least a command can be undone
+     * @since xxx
+     */
+    public boolean hasUndoCommands() {
+        return !commands.isEmpty();
+    }
+
+    /**
+     * Determines if commands can be redone.
+     * @return {@code true} if at least a command can be redone
+     * @since 14281
+     */
+    public boolean hasRedoCommands() {
+        return !redoCommands.isEmpty();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 14279)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 14281)
@@ -272,5 +272,5 @@
 
     private void buildUndoTree() {
-        List<Command> undoCommands = UndoRedoHandler.getInstance().commands;
+        List<Command> undoCommands = UndoRedoHandler.getInstance().getUndoCommands();
         undoRoot = new DefaultMutableTreeNode();
         for (int i = 0; i < undoCommands.size(); ++i) {
@@ -281,5 +281,5 @@
 
     private void buildRedoTree() {
-        List<Command> redoCommands = UndoRedoHandler.getInstance().redoCommands;
+        List<Command> redoCommands = UndoRedoHandler.getInstance().getRedoCommands();
         redoRoot = new DefaultMutableTreeNode();
         for (int i = 0; i < redoCommands.size(); ++i) {
@@ -290,6 +290,6 @@
 
     private void ensureTreesConsistency() {
-        List<Command> undoCommands = UndoRedoHandler.getInstance().commands;
-        List<Command> redoCommands = UndoRedoHandler.getInstance().redoCommands;
+        List<Command> undoCommands = UndoRedoHandler.getInstance().getUndoCommands();
+        List<Command> redoCommands = UndoRedoHandler.getInstance().getRedoCommands();
         if (redoTreeModel.getChildCount(redoRoot) > 0) {
             redoTree.scrollRowToVisible(0);
