diff --git a/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java b/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
index 9570667..90c3176 100644
--- a/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
+++ b/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
@@ -11,10 +11,11 @@ import java.util.concurrent.LinkedBlockingQueue;
 
 import javax.swing.SwingUtilities;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 
 /**
  * This class allows to add DatasetListener to currently active dataset. If active
@@ -25,7 +26,7 @@ import org.openstreetmap.josm.gui.layer.OsmDataLayer;
  * Events in EDT are supported, see {@link #addDatasetListener(DataSetListener, FireMode)}
  *
  */
-public class DatasetEventManager implements MapView.EditLayerChangeListener, Listener {
+public class DatasetEventManager implements ActiveLayerChangeListener, Listener {
 
     private static final DatasetEventManager instance = new DatasetEventManager();
 
@@ -145,7 +146,7 @@ public class DatasetEventManager implements MapView.EditLayerChangeListener, Lis
      * Constructs a new {@code DatasetEventManager}.
      */
     public DatasetEventManager() {
-        MapView.addEditLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
     /**
@@ -170,17 +171,17 @@ public class DatasetEventManager implements MapView.EditLayerChangeListener, Lis
     }
 
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (oldLayer != null) {
-            oldLayer.data.removeDataSetListener(myListener);
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        DataSet oldData = e.getPreviousEditDataSet();
+        if (oldData != null) {
+            oldData.removeDataSetListener(myListener);
         }
 
-        if (newLayer != null) {
-            newLayer.data.addDataSetListener(myListener);
-            processDatasetEvent(new DataChangedEvent(newLayer.data));
-        } else {
-            processDatasetEvent(new DataChangedEvent(null));
+        DataSet newData = e.getSource().getEditDataSet();
+        if (newData != null) {
+            newData.addDataSetListener(myListener);
         }
+        processDatasetEvent(new DataChangedEvent(newData));
     }
 
     private static void fireEvents(List<ListenerInfo> listeners, AbstractDatasetChangedEvent event) {
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index d32dc94..e692fa3 100644
--- a/src/org/openstreetmap/josm/gui/MapView.java
+++ b/src/org/openstreetmap/josm/gui/MapView.java
@@ -395,7 +395,11 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
 
             LayerChangeAdapter adapter = new LayerChangeAdapter(listener, initialFire);
             Main.getLayerManager().addLayerChangeListener(adapter, false);
-            Main.getLayerManager().addActiveLayerChangeListener(adapter, initialFire);
+            if (initialFire) {
+                Main.getLayerManager().addAndFireActiveLayerChangeListener(adapter);
+            } else {
+                Main.getLayerManager().addActiveLayerChangeListener(adapter);
+            }
             adapter.receiveOneInitialFire = false;
         }
     }
@@ -413,8 +417,12 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     @Deprecated
     public static void addEditLayerChangeListener(EditLayerChangeListener listener, boolean initialFire) {
         if (listener != null) {
-            Main.getLayerManager().addActiveLayerChangeListener(new EditLayerChangeAdapter(listener),
-                    initialFire && Main.isDisplayingMapView() && Main.map.mapView.getEditLayer() != null);
+            boolean doFire = initialFire && Main.isDisplayingMapView() && Main.map.mapView.getEditLayer() != null;
+            if (doFire) {
+                Main.getLayerManager().addAndFireActiveLayerChangeListener(new EditLayerChangeAdapter(listener));
+            } else {
+                Main.getLayerManager().addActiveLayerChangeListener(new EditLayerChangeAdapter(listener));
+            }
         }
     }
 
@@ -483,7 +491,7 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
         this.layerManager = layerManager;
         initialViewport = viewportData;
         layerManager.addLayerChangeListener(this);
-        layerManager.addActiveLayerChangeListener(this, false);
+        layerManager.addActiveLayerChangeListener(this);
         Main.pref.addPreferenceChangeListener(this);
 
         addComponentListener(new ComponentAdapter() {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
index d137cb3..c5b5b2b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
@@ -42,7 +42,6 @@ import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetInSelectionListModel;
@@ -114,13 +113,13 @@ public class ChangesetDialog extends ToggleDialog {
     protected void registerAsListener() {
         // let the model for changesets in the current selection listen to various events
         ChangesetCache.getInstance().addChangesetCacheListener(inSelectionModel);
-        MapView.addEditLayerChangeListener(inSelectionModel);
+        Main.getLayerManager().addActiveLayerChangeListener(inSelectionModel);
         DataSet.addSelectionListener(inSelectionModel);
 
         // let the model for changesets in the current layer listen to various
         // events and bootstrap it's content
         ChangesetCache.getInstance().addChangesetCacheListener(inActiveDataLayerModel);
-        MapView.addEditLayerChangeListener(inActiveDataLayerModel);
+        Main.getLayerManager().addActiveLayerChangeListener(inActiveDataLayerModel);
         OsmDataLayer editLayer = Main.main.getEditLayer();
         if (editLayer != null) {
             editLayer.data.addDataSetListener(inActiveDataLayerModel);
@@ -133,7 +132,7 @@ public class ChangesetDialog extends ToggleDialog {
         // remove the list model for the current edit layer as listener
         //
         ChangesetCache.getInstance().removeChangesetCacheListener(inActiveDataLayerModel);
-        MapView.removeEditLayerChangeListener(inActiveDataLayerModel);
+        Main.getLayerManager().removeActiveLayerChangeListener(inActiveDataLayerModel);
         OsmDataLayer editLayer = Main.main.getEditLayer();
         if (editLayer != null) {
             editLayer.data.removeDataSetListener(inActiveDataLayerModel);
@@ -142,7 +141,7 @@ public class ChangesetDialog extends ToggleDialog {
         // remove the list model for the changesets in the current selection as
         // listener
         //
-        MapView.removeEditLayerChangeListener(inSelectionModel);
+        Main.getLayerManager().removeActiveLayerChangeListener(inSelectionModel);
         DataSet.removeSelectionListener(inSelectionModel);
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
index 0b3bb7e..7f2e256 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
@@ -54,13 +54,14 @@ import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.conflict.pair.ConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+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.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
@@ -72,7 +73,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  * dialog on the right of the main frame.
  * @since 86
  */
-public final class ConflictDialog extends ToggleDialog implements MapView.EditLayerChangeListener, IConflictListener, SelectionChangedListener {
+public final class ConflictDialog extends ToggleDialog implements ActiveLayerChangeListener, IConflictListener, SelectionChangedListener {
 
     /** the collection of conflicts displayed by this conflict dialog */
     private transient ConflictCollection conflicts;
@@ -169,13 +170,13 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
     @Override
     public void showNotify() {
         DataSet.addSelectionListener(this);
-        MapView.addEditLayerChangeListener(this, true);
+        Main.getLayerManager().addAndFireActiveLayerChangeListener(this);
         refreshView();
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeEditLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         DataSet.removeSelectionListener(this);
     }
 
@@ -278,10 +279,12 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
     }
 
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        OsmDataLayer oldLayer = e.getPreviousEditLayer();
         if (oldLayer != null) {
             oldLayer.getConflicts().removeConflictListener(this);
         }
+        OsmDataLayer newLayer = e.getSource().getEditLayer();
         if (newLayer != null) {
             newLayer.getConflicts().addConflictListener(this);
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
index d1917bd..84ee5e8 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
@@ -331,7 +331,7 @@ public class LayerListDialog extends ToggleDialog {
     public void showNotify() {
         MapView.addLayerChangeListener(activateLayerAction);
         layerManager.addLayerChangeListener(model);
-        layerManager.addActiveLayerChangeListener(model, true);
+        layerManager.addAndFireActiveLayerChangeListener(model);
         model.populate();
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
index 2b5cc22..97e3142 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
@@ -45,6 +45,7 @@ import org.openstreetmap.josm.actions.relation.SelectInRelationListAction;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
@@ -64,13 +65,13 @@ import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
+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.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
@@ -176,24 +177,19 @@ public class SelectionListDialog extends ToggleDialog  {
 
     @Override
     public void showNotify() {
-        MapView.addEditLayerChangeListener(model);
         SelectionEventManager.getInstance().addSelectionListener(actShowHistory, FireMode.IN_EDT_CONSOLIDATED);
         SelectionEventManager.getInstance().addSelectionListener(model, FireMode.IN_EDT_CONSOLIDATED);
         DatasetEventManager.getInstance().addDatasetListener(model, FireMode.IN_EDT);
-        MapView.addEditLayerChangeListener(actSearch);
-        // editLayerChanged also gets the selection history of the level
-        OsmDataLayer editLayer = Main.main.getEditLayer();
-        model.editLayerChanged(null, editLayer);
-        if (editLayer != null) {
-            model.setJOSMSelection(editLayer.data.getAllSelected());
-        }
+        Main.getLayerManager().addActiveLayerChangeListener(actSearch);
+        // editLayerChanged also gets the selection history of the level. Listener calls setJOSMSelection when fired.
+        Main.getLayerManager().addAndFireActiveLayerChangeListener(model);
         actSearch.updateEnabledState();
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeEditLayerChangeListener(actSearch);
-        MapView.removeEditLayerChangeListener(model);
+        Main.getLayerManager().removeActiveLayerChangeListener(actSearch);
+        Main.getLayerManager().removeActiveLayerChangeListener(model);
         SelectionEventManager.getInstance().removeSelectionListener(actShowHistory);
         SelectionEventManager.getInstance().removeSelectionListener(model);
         DatasetEventManager.getInstance().removeDatasetListener(model);
@@ -295,7 +291,7 @@ public class SelectionListDialog extends ToggleDialog  {
     /**
      * Launches the search dialog
      */
-    static class SearchAction extends AbstractAction implements EditLayerChangeListener {
+    static class SearchAction extends AbstractAction implements ActiveLayerChangeListener {
         /**
          * Constructs a new {@code SearchAction}.
          */
@@ -317,7 +313,7 @@ public class SelectionListDialog extends ToggleDialog  {
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
     }
@@ -479,7 +475,7 @@ public class SelectionListDialog extends ToggleDialog  {
      *
      */
     private static class SelectionListModel extends AbstractListModel<OsmPrimitive>
-    implements EditLayerChangeListener, SelectionChangedListener, DataSetListener {
+    implements ActiveLayerChangeListener, SelectionChangedListener, DataSetListener {
 
         private static final int SELECTION_HISTORY_SIZE = 10;
 
@@ -671,16 +667,17 @@ public class SelectionListDialog extends ToggleDialog  {
         }
 
         /* ------------------------------------------------------------------------ */
-        /* interface EditLayerChangeListener                                        */
+        /* interface ActiveLayerChangeListener                                      */
         /* ------------------------------------------------------------------------ */
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-            if (newLayer == null) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            DataSet newData = e.getSource().getEditDataSet();
+            if (newData == null) {
                 setJOSMSelection(null);
                 history = null;
             } else {
-                history = newLayer.data.getSelectionHistory();
-                setJOSMSelection(newLayer.data.getAllSelected());
+                history = newData.getSelectionHistory();
+                setJOSMSelection(newData.getAllSelected());
             }
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
index 046c011..149b7b9 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
@@ -41,18 +41,19 @@ import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
 import org.openstreetmap.josm.gui.history.HistoryLoadTask;
 import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
+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.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
+import org.openstreetmap.josm.tools.bugreport.BugReport;
 import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
 
 /**
@@ -89,11 +90,11 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
 
         actSelectInCurrentLayerAction = new SelectInCurrentLayerAction();
         model.getSelectionModel().addListSelectionListener(actSelectInCurrentLayerAction);
-        MapView.addEditLayerChangeListener(actSelectInCurrentLayerAction);
+        Main.getLayerManager().addActiveLayerChangeListener(actSelectInCurrentLayerAction);
 
         actZoomInCurrentLayerAction = new ZoomInCurrentLayerAction();
         model.getSelectionModel().addListSelectionListener(actZoomInCurrentLayerAction);
-        MapView.addEditLayerChangeListener(actZoomInCurrentLayerAction);
+        Main.getLayerManager().addActiveLayerChangeListener(actZoomInCurrentLayerAction);
 
         addComponentListener(
                 new ComponentAdapter() {
@@ -101,8 +102,12 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
                     public void componentHidden(ComponentEvent e) {
                         // make sure the listener is unregistered when the panel becomes
                         // invisible
-                        MapView.removeEditLayerChangeListener(actSelectInCurrentLayerAction);
-                        MapView.removeEditLayerChangeListener(actZoomInCurrentLayerAction);
+                        try {
+                            Main.getLayerManager().removeActiveLayerChangeListener(actSelectInCurrentLayerAction);
+                            Main.getLayerManager().removeActiveLayerChangeListener(actZoomInCurrentLayerAction);
+                        } catch (IllegalArgumentException t) {
+                            throw BugReport.intercept(t).put("hint", "This Component can only be hidden once.");
+                        }
                     }
                 }
         );
@@ -324,7 +329,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
         }
     }
 
-    abstract class SelectionBasedAction extends AbstractAction implements ListSelectionListener, EditLayerChangeListener {
+    abstract class SelectionBasedAction extends AbstractAction implements ListSelectionListener, ActiveLayerChangeListener {
 
         protected Set<OsmPrimitive> getTarget() {
             if (!isEnabled() || Main.main == null || !Main.main.hasEditLayer()) {
@@ -355,7 +360,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
index 2f7c434..6bca3cc 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
@@ -34,9 +34,9 @@ import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.ChangesetCache;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+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.JosmTextArea;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
@@ -85,10 +85,10 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         actDownloadChangesetContent.initProperties();
 
         tb.add(actSelectInCurrentLayer);
-        MapView.addEditLayerChangeListener(actSelectInCurrentLayer);
+        Main.getLayerManager().addActiveLayerChangeListener(actSelectInCurrentLayer);
 
         tb.add(actZoomInCurrentLayerAction);
-        MapView.addEditLayerChangeListener(actZoomInCurrentLayerAction);
+        Main.getLayerManager().addActiveLayerChangeListener(actZoomInCurrentLayerAction);
 
         addComponentListener(
                 new ComponentAdapter() {
@@ -96,8 +96,8 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
                     public void componentHidden(ComponentEvent e) {
                         // make sure the listener is unregistered when the panel becomes
                         // invisible
-                        MapView.removeEditLayerChangeListener(actSelectInCurrentLayer);
-                        MapView.removeEditLayerChangeListener(actZoomInCurrentLayerAction);
+                        Main.getLayerManager().removeActiveLayerChangeListener(actSelectInCurrentLayer);
+                        Main.getLayerManager().removeActiveLayerChangeListener(actZoomInCurrentLayerAction);
                     }
                 }
         );
@@ -317,7 +317,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
      * Selects the primitives in the content of this changeset in the current data layer.
      *
      */
-    class SelectInCurrentLayerAction extends AbstractAction implements EditLayerChangeListener {
+    class SelectInCurrentLayerAction extends AbstractAction implements ActiveLayerChangeListener {
 
         SelectInCurrentLayerAction() {
             putValue(NAME, tr("Select in layer"));
@@ -368,7 +368,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
     }
@@ -378,7 +378,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
      * data layer.
      *
      */
-    class ZoomInCurrentLayerAction extends AbstractAction implements EditLayerChangeListener {
+    class ZoomInCurrentLayerAction extends AbstractAction implements ActiveLayerChangeListener {
 
         ZoomInCurrentLayerAction() {
             putValue(NAME, tr("Zoom to in layer"));
@@ -430,7 +430,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
index 6f9c22e..006f122 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
@@ -6,11 +6,12 @@ import java.util.Collection;
 import javax.swing.DefaultListSelectionModel;
 
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 
-public class ChangesetInSelectionListModel extends ChangesetListModel implements SelectionChangedListener, EditLayerChangeListener {
+public class ChangesetInSelectionListModel extends ChangesetListModel implements SelectionChangedListener, ActiveLayerChangeListener {
 
     public ChangesetInSelectionListModel(DefaultListSelectionModel selectionModel) {
         super(selectionModel);
@@ -28,11 +29,12 @@ public class ChangesetInSelectionListModel extends ChangesetListModel implements
     /* Interface LayerChangeListener                                                */
     /* ---------------------------------------------------------------------------- */
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (newLayer == null) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        DataSet newData = e.getSource().getEditDataSet();
+        if (newData == null) {
             setChangesets(null);
         } else {
-            initFromPrimitives((newLayer).data.getAllSelected());
+            initFromPrimitives(newData.getAllSelected());
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
index 8c92208..e5c4c3f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
@@ -12,14 +12,15 @@ import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
 import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
  * This is the list model for the list of changeset in the current edit layer.
  *
  */
-public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener, EditLayerChangeListener {
+public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener, ActiveLayerChangeListener {
 
     public ChangesetsInActiveDataLayerListModel(DefaultListSelectionModel selectionModel) {
         super(selectionModel);
@@ -69,14 +70,15 @@ public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel imp
     }
 
     /* ------------------------------------------------------------------------------ */
-    /* interface EditLayerListener                                                    */
+    /* interface ActiveLayerChangeListener                                                    */
     /* ------------------------------------------------------------------------------ */
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         // just init the model content. Don't register as DataSetListener. The mode
         // is already registered to receive DataChangedEvents from the current edit layer
-        if (newLayer != null) {
-            initFromDataSet(newLayer.data);
+        OsmDataLayer editLayer = e.getSource().getEditLayer();
+        if (editLayer != null) {
+            initFromDataSet(editLayer.data);
         } else {
             initFromDataSet(null);
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
index d3af238..527a72a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
@@ -84,17 +84,16 @@ import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.help.HelpUtil;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
@@ -129,7 +128,7 @@ import org.openstreetmap.josm.tools.Utils;
  * @author imi
  */
 public class PropertiesDialog extends ToggleDialog
-implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetListenerAdapter.Listener {
+implements SelectionChangedListener, ActiveLayerChangeListener, DataSetListenerAdapter.Listener {
 
     /**
      * hook for roadsigns plugin to display a small button in the upper right corner of this dialog
@@ -589,7 +588,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     public void showNotify() {
         DatasetEventManager.getInstance().addDatasetListener(dataChangedAdapter, FireMode.IN_EDT_CONSOLIDATED);
         SelectionEventManager.getInstance().addSelectionListener(this, FireMode.IN_EDT_CONSOLIDATED);
-        MapView.addEditLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
         for (JosmAction action : josmActions) {
             Main.registerActionShortcut(action);
         }
@@ -600,7 +599,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     public void hideNotify() {
         DatasetEventManager.getInstance().removeDatasetListener(dataChangedAdapter);
         SelectionEventManager.getInstance().removeSelectionListener(this);
-        MapView.removeEditLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         for (JosmAction action : josmActions) {
             Main.unregisterActionShortcut(action);
         }
@@ -769,17 +768,15 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     }
 
     /* ---------------------------------------------------------------------------------- */
-    /* EditLayerChangeListener                                                            */
+    /* ActiveLayerChangeListener                                                          */
     /* ---------------------------------------------------------------------------------- */
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (newLayer == null) editHelper.saveTagsIfNeeded();
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        if (e.getSource().getEditLayer() != null) {
+            editHelper.saveTagsIfNeeded();
+        }
         // it is time to save history of tags
-        GuiHelper.runInEDT(new Runnable() {
-            @Override public void run() {
-                updateSelection();
-            }
-        });
+        updateSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
index e07d845..cf7418a 100644
--- a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
@@ -75,6 +75,18 @@ public class MainLayerManager extends LayerManager {
             return previousActiveLayer;
         }
 
+        /**
+         * Gets the data set that was previously used.
+         * @return The data set of {@link #getPreviousEditLayer()}.
+         */
+        public DataSet getPreviousEditDataSet() {
+            if (previousEditLayer != null) {
+                return previousEditLayer.data;
+            } else {
+                return null;
+            }
+        }
+
         @Override
         public MainLayerManager getSource() {
             return (MainLayerManager) super.getSource();
@@ -97,17 +109,38 @@ public class MainLayerManager extends LayerManager {
      * Adds a active/edit layer change listener
      *
      * @param listener the listener.
-     * @param initialFire fire a fake active-layer-changed-event right after adding
-     * the listener. The previous layers will be null. The listener is notified in the current thread.
+     * @param initialFire use {@link #addAndFireActiveLayerChangeListener(ActiveLayerChangeListener)} instead.
+     * @deprecated Do not use the second parameter. To be removed in a few weeks.
      */
+    @Deprecated
     public synchronized void addActiveLayerChangeListener(ActiveLayerChangeListener listener, boolean initialFire) {
+        if (initialFire) {
+            addAndFireActiveLayerChangeListener(listener);
+        } else {
+            addActiveLayerChangeListener(listener);
+        }
+    }
+
+    /**
+     * Adds a active/edit layer change listener
+     *
+     * @param listener the listener.
+     */
+    public synchronized void addActiveLayerChangeListener(ActiveLayerChangeListener listener) {
         if (activeLayerChangeListeners.contains(listener)) {
             throw new IllegalArgumentException("Attempted to add listener that was already in list: " + listener);
         }
         activeLayerChangeListeners.add(listener);
-        if (initialFire) {
-            listener.activeOrEditLayerChanged(new ActiveLayerChangeEvent(this, null, null));
-        }
+    }
+
+    /**
+     * Adds a active/edit layer change listener. Fire a fake active-layer-changed-event right after adding
+     * the listener. The previous layers will be null. The listener is notified in the current thread.
+     * @param listener the listener.
+     */
+    public synchronized void addAndFireActiveLayerChangeListener(ActiveLayerChangeListener listener) {
+        addActiveLayerChangeListener(listener);
+        listener.activeOrEditLayerChanged(new ActiveLayerChangeEvent(this, null, null));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
index 297423d..afc1c2e 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
@@ -109,6 +109,10 @@ public class MainLayerManagerTest extends LayerManagerTest {
         assertNull(layerManagerWithActive.getEditLayer());
     }
 
+    /**
+     * Test {@link MainLayerManager#addActiveLayerChangeListener(ActiveLayerChangeListener)} and
+     * {@link MainLayerManager#addAndFireActiveLayerChangeListener(ActiveLayerChangeListener)}
+     */
     @Test
     public void testAddActiveLayerChangeListener() {
         AbstractTestLayer layer1 = new AbstractTestLayer();
@@ -117,11 +121,11 @@ public class MainLayerManagerTest extends LayerManagerTest {
         layerManagerWithActive.addLayer(layer2);
 
         CapturingActiveLayerChangeListener listener = new CapturingThreadCheckingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
         assertNull(listener.lastEvent);
 
         CapturingActiveLayerChangeListener listener2 = new CapturingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener2, true);
+        layerManagerWithActive.addAndFireActiveLayerChangeListener(listener2);
         assertSame(listener2.lastEvent.getPreviousActiveLayer(), null);
         assertSame(listener2.lastEvent.getPreviousEditLayer(), null);
 
@@ -140,8 +144,8 @@ public class MainLayerManagerTest extends LayerManagerTest {
     @Test(expected = IllegalArgumentException.class)
     public void testAddActiveLayerChangeListenerTwice() {
         CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
     }
 
     /**
@@ -155,7 +159,7 @@ public class MainLayerManagerTest extends LayerManagerTest {
         layerManagerWithActive.addLayer(layer2);
 
         CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
         layerManagerWithActive.removeActiveLayerChangeListener(listener);
 
         layerManagerWithActive.setActiveLayer(layer2);
