Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 17344)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 17347)
@@ -4,6 +4,8 @@
 import java.util.Collections;
 import java.util.EventObject;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
@@ -11,4 +13,6 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmDataManager;
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -41,5 +45,7 @@
 
     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<>();
+
     }
 
@@ -50,5 +56,11 @@
      */
     public static UndoRedoHandler getInstance() {
-        return InstanceHolder.INSTANCE;
+        OsmDataLayer editLayer = MainApplication.getLayerManager().getEditLayer();
+        if (editLayer != null) {
+            if (editLayer == MainApplication.getLayerManager().getActiveLayer()) {
+                return InstanceHolder.map.computeIfAbsent(editLayer.data, k -> new UndoRedoHandler());
+            }
+        }
+        return InstanceHolder.NO_DATA_SET_INSTANCE;
     }
 
@@ -433,4 +445,10 @@
             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());
+            }
+
+        }
     }
 
@@ -457,8 +475,7 @@
         if (dataSet == null)
             return;
-        boolean changed = false;
-        changed |= commands.removeIf(c -> c.getAffectedDataSet() == dataSet);
-        changed |= redoCommands.removeIf(c -> c.getAffectedDataSet() == dataSet);
-        if (changed) {
+        if (InstanceHolder.map.remove(dataSet) != null) {
+            redoCommands.clear();
+            commands.clear();
             fireEvent(new CommandQueueCleanedEvent(this, dataSet));
             fireCommandsChanged();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 17344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 17347)
@@ -51,4 +51,6 @@
 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;
@@ -63,5 +65,5 @@
  * @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());
@@ -145,4 +147,5 @@
         InputMapUtils.addEnterAction(undoTree, selectAndZoomAction);
         InputMapUtils.addEnterAction(redoTree, selectAndZoomAction);
+        MainApplication.getLayerManager().addActiveLayerChangeListener(this);
     }
 
@@ -553,3 +556,9 @@
         }
     }
+
+    @Override
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        hideNotify();
+        showNotify();
+    }
 }
