Index: trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 10332)
@@ -12,8 +12,9 @@
 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;
 
 /**
@@ -26,5 +27,5 @@
  *
  */
-public class DatasetEventManager implements MapView.EditLayerChangeListener, Listener {
+public class DatasetEventManager implements ActiveLayerChangeListener, Listener {
 
     private static final DatasetEventManager instance = new DatasetEventManager();
@@ -146,5 +147,5 @@
      */
     public DatasetEventManager() {
-        MapView.addEditLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
@@ -171,15 +172,15 @@
 
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (oldLayer != null) {
-            oldLayer.data.removeDataSetListener(myListener);
-        }
-
-        if (newLayer != null) {
-            newLayer.data.addDataSetListener(myListener);
-            processDatasetEvent(new DataChangedEvent(newLayer.data));
-        } else {
-            processDatasetEvent(new DataChangedEvent(null));
-        }
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        DataSet oldData = e.getPreviousEditDataSet();
+        if (oldData != null) {
+            oldData.removeDataSetListener(myListener);
+        }
+
+        DataSet newData = e.getSource().getEditDataSet();
+        if (newData != null) {
+            newData.addDataSetListener(myListener);
+        }
+        processDatasetEvent(new DataChangedEvent(newData));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 10332)
@@ -396,5 +396,9 @@
             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;
         }
@@ -414,6 +418,10 @@
     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));
+            }
         }
     }
@@ -484,5 +492,5 @@
         initialViewport = viewportData;
         layerManager.addLayerChangeListener(this);
-        layerManager.addActiveLayerChangeListener(this, false);
+        layerManager.addActiveLayerChangeListener(this);
         Main.pref.addPreferenceChangeListener(this);
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 10332)
@@ -43,5 +43,4 @@
 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;
@@ -115,5 +114,5 @@
         // 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);
 
@@ -121,5 +120,5 @@
         // 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) {
@@ -134,5 +133,5 @@
         //
         ChangesetCache.getInstance().removeChangesetCacheListener(inActiveDataLayerModel);
-        MapView.removeEditLayerChangeListener(inActiveDataLayerModel);
+        Main.getLayerManager().removeActiveLayerChangeListener(inActiveDataLayerModel);
         OsmDataLayer editLayer = Main.main.getEditLayer();
         if (editLayer != null) {
@@ -143,5 +142,5 @@
         // listener
         //
-        MapView.removeEditLayerChangeListener(inSelectionModel);
+        Main.getLayerManager().removeActiveLayerChangeListener(inSelectionModel);
         DataSet.removeSelectionListener(inSelectionModel);
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 10332)
@@ -55,5 +55,4 @@
 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;
@@ -62,4 +61,6 @@
 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;
@@ -73,5 +74,5 @@
  * @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 */
@@ -170,5 +171,5 @@
     public void showNotify() {
         DataSet.addSelectionListener(this);
-        MapView.addEditLayerChangeListener(this, true);
+        Main.getLayerManager().addAndFireActiveLayerChangeListener(this);
         refreshView();
     }
@@ -176,5 +177,5 @@
     @Override
     public void hideNotify() {
-        MapView.removeEditLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         DataSet.removeSelectionListener(this);
     }
@@ -279,8 +280,10 @@
 
     @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);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10332)
@@ -332,5 +332,5 @@
         MapView.addLayerChangeListener(activateLayerAction);
         layerManager.addLayerChangeListener(model);
-        layerManager.addActiveLayerChangeListener(model, true);
+        layerManager.addAndFireActiveLayerChangeListener(model);
         model.populate();
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 10332)
@@ -46,4 +46,5 @@
 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;
@@ -65,6 +66,4 @@
 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;
@@ -72,4 +71,6 @@
 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;
@@ -177,15 +178,10 @@
     @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();
     }
@@ -193,6 +189,6 @@
     @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);
@@ -296,5 +292,5 @@
      * Launches the search dialog
      */
-    static class SearchAction extends AbstractAction implements EditLayerChangeListener {
+    static class SearchAction extends AbstractAction implements ActiveLayerChangeListener {
         /**
          * Constructs a new {@code SearchAction}.
@@ -318,5 +314,5 @@
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
@@ -480,5 +476,5 @@
      */
     private static class SelectionListModel extends AbstractListModel<OsmPrimitive>
-    implements EditLayerChangeListener, SelectionChangedListener, DataSetListener {
+    implements ActiveLayerChangeListener, SelectionChangedListener, DataSetListener {
 
         private static final int SELECTION_HISTORY_SIZE = 10;
@@ -672,14 +668,15 @@
 
         /* ------------------------------------------------------------------------ */
-        /* 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());
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java	(revision 10332)
@@ -42,10 +42,10 @@
 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;
@@ -54,4 +54,5 @@
 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;
 
@@ -90,9 +91,9 @@
         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(
@@ -102,6 +103,10 @@
                         // 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.");
+                        }
                     }
                 }
@@ -325,5 +330,5 @@
     }
 
-    abstract class SelectionBasedAction extends AbstractAction implements ListSelectionListener, EditLayerChangeListener {
+    abstract class SelectionBasedAction extends AbstractAction implements ListSelectionListener, ActiveLayerChangeListener {
 
         protected Set<OsmPrimitive> getTarget() {
@@ -356,5 +361,5 @@
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 10332)
@@ -35,7 +35,7 @@
 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;
@@ -86,8 +86,8 @@
 
         tb.add(actSelectInCurrentLayer);
-        MapView.addEditLayerChangeListener(actSelectInCurrentLayer);
+        Main.getLayerManager().addActiveLayerChangeListener(actSelectInCurrentLayer);
 
         tb.add(actZoomInCurrentLayerAction);
-        MapView.addEditLayerChangeListener(actZoomInCurrentLayerAction);
+        Main.getLayerManager().addActiveLayerChangeListener(actZoomInCurrentLayerAction);
 
         addComponentListener(
@@ -97,6 +97,6 @@
                         // 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);
                     }
                 }
@@ -318,5 +318,5 @@
      *
      */
-    class SelectInCurrentLayerAction extends AbstractAction implements EditLayerChangeListener {
+    class SelectInCurrentLayerAction extends AbstractAction implements ActiveLayerChangeListener {
 
         SelectInCurrentLayerAction() {
@@ -369,5 +369,5 @@
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
@@ -379,5 +379,5 @@
      *
      */
-    class ZoomInCurrentLayerAction extends AbstractAction implements EditLayerChangeListener {
+    class ZoomInCurrentLayerAction extends AbstractAction implements ActiveLayerChangeListener {
 
         ZoomInCurrentLayerAction() {
@@ -431,5 +431,5 @@
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java	(revision 10332)
@@ -7,9 +7,10 @@
 
 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) {
@@ -29,9 +30,10 @@
     /* ---------------------------------------------------------------------------- */
     @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());
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 10332)
@@ -13,5 +13,6 @@
 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;
 
@@ -20,5 +21,5 @@
  *
  */
-public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener, EditLayerChangeListener {
+public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener, ActiveLayerChangeListener {
 
     public ChangesetsInActiveDataLayerListModel(DefaultListSelectionModel selectionModel) {
@@ -70,12 +71,13 @@
 
     /* ------------------------------------------------------------------------------ */
-    /* 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);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 10332)
@@ -85,5 +85,4 @@
 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;
@@ -91,9 +90,9 @@
 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;
@@ -130,5 +129,5 @@
  */
 public class PropertiesDialog extends ToggleDialog
-implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetListenerAdapter.Listener {
+implements SelectionChangedListener, ActiveLayerChangeListener, DataSetListenerAdapter.Listener {
 
     /**
@@ -590,5 +589,5 @@
         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);
@@ -601,5 +600,5 @@
         DatasetEventManager.getInstance().removeDatasetListener(dataChangedAdapter);
         SelectionEventManager.getInstance().removeSelectionListener(this);
-        MapView.removeEditLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         for (JosmAction action : josmActions) {
             Main.unregisterActionShortcut(action);
@@ -770,15 +769,13 @@
 
     /* ---------------------------------------------------------------------------------- */
-    /* 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();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(revision 10325)
+++ trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(revision 10332)
@@ -76,4 +76,16 @@
         }
 
+        /**
+         * 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() {
@@ -98,15 +110,36 @@
      *
      * @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));
     }
 
