Index: src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 16434)
+++ src/org/openstreetmap/josm/data/UndoRedoHandler.java	(working copy)
@@ -2,9 +2,10 @@
 package org.openstreetmap.josm.data;
 
 import java.util.EventObject;
-import java.util.Iterator;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import org.openstreetmap.josm.command.Command;
@@ -22,25 +23,21 @@
 public final class UndoRedoHandler {
 
     /**
-     * All commands that were made on the dataset. Don't write from outside!
-     *
-     * @see #getLastCommand()
-     * @see #getUndoCommands()
+     * All commands that were made on the dataset.
      */
-    public final LinkedList<Command> commands = new LinkedList<>();
+    private final LinkedList<Command> commands = new LinkedList<>();
 
     /**
      * The stack for redoing commands
-
-     * @see #getRedoCommands()
      */
-    public final LinkedList<Command> redoCommands = new LinkedList<>();
+    private final LinkedList<Command> redoCommands = new LinkedList<>();
 
     private final LinkedList<CommandQueueListener> listenerCommands = new LinkedList<>();
     private final LinkedList<CommandQueuePreciseListener> preciseListenerCommands = new LinkedList<>();
 
     private static class InstanceHolder {
-        static final UndoRedoHandler INSTANCE = new UndoRedoHandler();
+        static final UndoRedoHandler NO_DATA_SET_INSTANCE = new UndoRedoHandler();
+        static final Map<DataSet, UndoRedoHandler> map = new HashMap<>();
     }
 
     /**
@@ -49,7 +46,11 @@
      * @since 14134
      */
     public static UndoRedoHandler getInstance() {
-        return InstanceHolder.INSTANCE;
+        DataSet ds = OsmDataManager.getInstance().getEditDataSet();
+        if (ds == null)
+            return InstanceHolder.NO_DATA_SET_INSTANCE;
+        else
+            return InstanceHolder.map.computeIfAbsent(ds, k -> new UndoRedoHandler());
     }
 
     /**
@@ -426,6 +427,12 @@
         for (final CommandQueueListener l : listenerCommands) {
             l.commandChanged(commands.size(), redoCommands.size());
         }
+        if (getInstance() != InstanceHolder.NO_DATA_SET_INSTANCE) {
+            for (final CommandQueueListener l : InstanceHolder.NO_DATA_SET_INSTANCE.listenerCommands) {
+                l.commandChanged(commands.size(), redoCommands.size());
+            }
+
+        }
     }
 
     private void fireEvent(CommandQueueEvent e) {
@@ -450,23 +457,8 @@
     public synchronized void clean(DataSet dataSet) {
         if (dataSet == null)
             return;
-        boolean changed = false;
-        for (Iterator<Command> it = commands.iterator(); it.hasNext();) {
-            if (it.next().getAffectedDataSet() == dataSet) {
-                it.remove();
-                changed = true;
-            }
-        }
-        for (Iterator<Command> it = redoCommands.iterator(); it.hasNext();) {
-            if (it.next().getAffectedDataSet() == dataSet) {
-                it.remove();
-                changed = true;
-            }
-        }
-        if (changed) {
-            fireEvent(new CommandQueueCleanedEvent(this, dataSet));
-            fireCommandsChanged();
-        }
+        clean();
+        InstanceHolder.map.remove(dataSet);
     }
 
     /**
Index: src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 16434)
+++ src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(working copy)
@@ -50,6 +50,8 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.GBC;
@@ -62,7 +64,7 @@
  * Dialog displaying list of all executed commands (undo/redo buffer).
  * @since 94
  */
-public class CommandStackDialog extends ToggleDialog implements CommandQueuePreciseListener {
+public class CommandStackDialog extends ToggleDialog implements CommandQueuePreciseListener, ActiveLayerChangeListener {
 
     private final DefaultTreeModel undoTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
     private final DefaultTreeModel redoTreeModel = new DefaultTreeModel(new DefaultMutableTreeNode());
@@ -144,6 +146,7 @@
 
         InputMapUtils.addEnterAction(undoTree, selectAndZoomAction);
         InputMapUtils.addEnterAction(redoTree, selectAndZoomAction);
+        MainApplication.getLayerManager().addAndFireActiveLayerChangeListener(this);
     }
 
     private static class CommandCellRenderer extends DefaultTreeCellRenderer {
@@ -550,4 +553,10 @@
             add(selectAndZoomAction);
         }
     }
+
+    @Override
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        hideNotify();
+        showNotify();
+    }
 }
Index: test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java	(revision 16434)
+++ test/unit/org/openstreetmap/josm/gui/dialogs/CommandStackDialogTest.java	(working copy)
@@ -27,7 +27,7 @@
      */
     @Rule
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().main().projection();
+    public JOSMTestRules test = new JOSMTestRules().main().projection().preferences();
 
     /**
      * Unit test of {@link CommandStackDialog} class - empty case.
