Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 10345)
@@ -108,5 +108,5 @@
                 FileExporter exporter = exporterClass.getConstructor().newInstance();
                 exporters.add(exporter);
-                MapView.addLayerChangeListener(exporter);
+                Main.getLayerManager().addAndFireActiveLayerChangeListener(exporter);
             } catch (ReflectiveOperationException e) {
                 if (Main.isDebugEnabled()) {
Index: trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 10345)
@@ -16,10 +16,9 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+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.progress.PleaseWaitProgressMonitor;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -184,5 +183,7 @@
             Main.unregisterActionShortcut(this);
         }
-        MapView.removeLayerChangeListener(layerChangeAdapter);
+        if (layerChangeAdapter != null) {
+            Main.getLayerManager().removeActiveLayerChangeListener(layerChangeAdapter);
+        }
         DataSet.removeSelectionListener(selectionChangeAdapter);
     }
@@ -226,8 +227,7 @@
     protected void installAdapters() {
         // make this action listen to layer change and selection change events
-        //
         layerChangeAdapter = new LayerChangeAdapter();
         selectionChangeAdapter = new SelectionChangeAdapter();
-        MapView.addLayerChangeListener(layerChangeAdapter);
+        Main.getLayerManager().addActiveLayerChangeListener(layerChangeAdapter);
         DataSet.addSelectionListener(selectionChangeAdapter);
         initEnabledState();
@@ -291,34 +291,20 @@
 
     /**
-     * Adapter for layer change events
-     *
-     */
-    protected class LayerChangeAdapter implements MapView.LayerChangeListener {
-        private void updateEnabledStateInEDT() {
-            GuiHelper.runInEDT(new Runnable() {
-                @Override public void run() {
-                    updateEnabledState();
-                }
-            });
-        }
-
+     * Adapter for layer change events. Runs updateEnabledState() whenever the active layer changed.
+     */
+    protected class LayerChangeAdapter implements ActiveLayerChangeListener {
         @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-            updateEnabledStateInEDT();
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            updateEnabledState();
         }
 
         @Override
-        public void layerAdded(Layer newLayer) {
-            updateEnabledStateInEDT();
-        }
-
-        @Override
-        public void layerRemoved(Layer oldLayer) {
-            updateEnabledStateInEDT();
-        }
-    }
-
-    /**
-     * Adapter for selection change events
+        public String toString() {
+            return "LayerChangeAdapter [" + JosmAction.this.toString() + ']';
+        }
+    }
+
+    /**
+     * Adapter for selection change events. Runs updateEnabledState() whenever the selection changed.
      */
     protected class SelectionChangeAdapter implements SelectionChangedListener {
@@ -327,4 +313,9 @@
             updateEnabledState(newSelection);
         }
+
+        @Override
+        public String toString() {
+            return "SelectionChangeAdapter [" + JosmAction.this.toString() + ']';
+        }
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java	(revision 10345)
@@ -21,8 +21,12 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+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.layer.OsmDataLayer.CommandQueueListener;
@@ -33,5 +37,5 @@
  * Action for accessing recent relations.
  */
-public class RecentRelationsAction implements ActionListener, CommandQueueListener, LayerChangeListener {
+public class RecentRelationsAction implements ActionListener, CommandQueueListener, LayerChangeListener, ActiveLayerChangeListener {
 
     private final SideButton editButton;
@@ -48,5 +52,6 @@
         arrow.setToolTipText(tr("List of recent relations"));
         Main.main.undoRedo.addCommandQueueListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
         enableArrow();
         shortcut = Shortcut.registerShortcut(
@@ -109,15 +114,20 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         enableArrow();
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
         enableArrow();
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        enableArrow();
+    }
+
+    @Override
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         enableArrow();
     }
@@ -182,3 +192,4 @@
         }
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 10345)
@@ -10,10 +10,13 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class UndoRedoHandler implements MapView.LayerChangeListener {
+public class UndoRedoHandler implements LayerChangeListener {
 
     /**
@@ -32,5 +35,5 @@
      */
     public UndoRedoHandler() {
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
@@ -170,15 +173,15 @@
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        clean(oldLayer);
+    public void layerRemoving(LayerRemoveEvent e) {
+        clean(e.getRemovedLayer());
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // Do nothing
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         // Do nothing
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java	(revision 10345)
@@ -28,8 +28,9 @@
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NavigatableComponent;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
@@ -51,5 +52,5 @@
         Main.addProjectionChangeListener(this);
         DataSet.addSelectionListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
@@ -286,17 +287,17 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // Do nothing
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         // Do nothing
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof OsmDataLayer) {
-            clear(((OsmDataLayer) oldLayer).data);
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof OsmDataLayer) {
+            clear(((OsmDataLayer) e.getRemovedLayer()).data);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java	(revision 10345)
@@ -33,7 +33,9 @@
 import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
 import org.openstreetmap.josm.data.imagery.Shape;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -111,5 +113,5 @@
         super(trc("menu", "Imagery"));
         setupMenuScroller();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
         // build dynamically
         addMenuListener(new MenuListener() {
@@ -210,9 +212,5 @@
 
     private JMenuItem getNewOffsetMenu() {
-        if (!Main.isDisplayingMapView()) {
-            offsetAction.setEnabled(false);
-            return singleOffset;
-        }
-        Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+        Collection<ImageryLayer> layers = Main.getLayerManager().getLayersOfType(ImageryLayer.class);
         if (layers.isEmpty()) {
             offsetAction.setEnabled(false);
@@ -239,11 +237,13 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // Do nothing
+    public void layerAdded(LayerAddEvent e) {
+        if (e.getAddedLayer() instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        if (newLayer instanceof ImageryLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof ImageryLayer) {
             refreshOffsetMenu();
         }
@@ -251,8 +251,6 @@
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof ImageryLayer) {
-            refreshOffsetMenu();
-        }
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        refreshOffsetMenu();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MainFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainFrame.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/MainFrame.java	(revision 10345)
@@ -114,5 +114,5 @@
                 refreshTitle();
             }
-        }, false);
+        });
         Main.getLayerManager().addLayerChangeListener(new ManageLayerListeners(), true);
 
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 10345)
@@ -117,5 +117,6 @@
 import org.openstreetmap.josm.gui.dialogs.MenuItemSearchDialog;
 import org.openstreetmap.josm.gui.io.RecentlyOpenedFilesMenu;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.mappaint.MapPaintMenu;
 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
@@ -822,5 +823,5 @@
         windowMenu.addMenuListener(menuSeparatorHandler);
 
-        new PresetsMenuEnabler(presetsMenu).refreshEnabled();
+        new PresetsMenuEnabler(presetsMenu);
     }
 
@@ -886,34 +887,16 @@
     }
 
-    static class PresetsMenuEnabler implements MapView.LayerChangeListener {
+    static class PresetsMenuEnabler implements ActiveLayerChangeListener {
         private final JMenu presetsMenu;
 
         PresetsMenuEnabler(JMenu presetsMenu) {
-            MapView.addLayerChangeListener(this);
             this.presetsMenu = presetsMenu;
-        }
-
-        /**
-         * Refreshes the enabled state
-         */
-        protected void refreshEnabled() {
-            presetsMenu.setEnabled(Main.main.hasEditLayer());
+            Main.getLayerManager().addAndFireActiveLayerChangeListener(this);
         }
 
         @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-            refreshEnabled();
-        }
-
-        @Override
-        public void layerAdded(Layer newLayer) {
-            refreshEnabled();
-        }
-
-        @Override
-        public void layerRemoved(Layer oldLayer) {
-            refreshEnabled();
-        }
-    }
-
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            presetsMenu.setEnabled(e.getSource().getEditLayer() != null);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 10345)
@@ -38,5 +38,4 @@
 import javax.swing.JToolBar;
 import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
 import javax.swing.border.Border;
 import javax.swing.event.PopupMenuEvent;
@@ -59,5 +58,4 @@
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.ViewportData;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.ChangesetDialog;
 import org.openstreetmap.josm.gui.dialogs.CommandStackDialog;
@@ -77,4 +75,10 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.LayerManager;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.util.AdvancedKeyPressDetector;
 import org.openstreetmap.josm.tools.Destroyable;
@@ -90,5 +94,5 @@
  * @author imi
  */
-public class MapFrame extends JPanel implements Destroyable, LayerChangeListener {
+public class MapFrame extends JPanel implements Destroyable, ActiveLayerChangeListener, LayerChangeListener {
 
     /**
@@ -285,5 +289,6 @@
         // status line below the map
         statusLine = new MapStatus(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
 
         boolean unregisterTab = Shortcut.findShortcut(KeyEvent.VK_TAB, 0) != null;
@@ -329,5 +334,6 @@
     @Override
     public void destroy() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         dialogsPanel.destroy();
         Main.pref.removePreferenceChangeListener(sidetoolbarPreferencesChangedListener);
@@ -757,6 +763,7 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         boolean modeChanged = false;
+        Layer newLayer = e.getSource().getActiveLayer();
         if (mapMode == null || !mapMode.layerIsSupported(newLayer)) {
             MapMode newMapMode = getLastMapMode(newLayer);
@@ -771,5 +778,5 @@
         }
         // if this is really a change (and not the first active layer)
-        if (oldLayer != null) {
+        if (e.getPreviousActiveLayer() != null) {
             if (!modeChanged && mapMode != null) {
                 // Let mapmodes know about new active layer
@@ -783,9 +790,5 @@
         // After all listeners notice new layer, some buttons will be disabled/enabled
         // and possibly need to be hidden/shown.
-        SwingUtilities.invokeLater(new Runnable() {
-            @Override public void run() {
-                validateToolBarsVisibility();
-            }
-        });
+        validateToolBarsVisibility();
     }
 
@@ -803,11 +806,17 @@
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
+    public void layerAdded(LayerAddEvent e) {
+        // ignored
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        lastMapMode.remove(oldLayer);
-    }
+    public void layerRemoving(LayerRemoveEvent e) {
+        lastMapMode.remove(e.getRemovedLayer());
+    }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignored
+    }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10345)
@@ -186,9 +186,9 @@
         DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
         selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
-        model = new LayerListModel(selectionModel);
+        model = new LayerListModel(layerManager, selectionModel);
 
         // create the list control
         //
-        layerList = new LayerList(model, layerManager);
+        layerList = new LayerList(model);
         layerList.setSelectionModel(selectionModel);
         layerList.addMouseListener(new PopupMenuHandler());
@@ -330,5 +330,5 @@
     @Override
     public void showNotify() {
-        MapView.addLayerChangeListener(activateLayerAction);
+        layerManager.addActiveLayerChangeListener(activateLayerAction);
         layerManager.addLayerChangeListener(model);
         layerManager.addAndFireActiveLayerChangeListener(model);
@@ -340,5 +340,5 @@
         layerManager.removeLayerChangeListener(model);
         layerManager.removeActiveLayerChangeListener(model);
-        MapView.removeLayerChangeListener(activateLayerAction);
+        layerManager.removeActiveLayerChangeListener(activateLayerAction);
     }
 
@@ -649,11 +649,13 @@
         private final CopyOnWriteArrayList<LayerListModelListener> listeners;
         private LayerList layerList;
+        private final MainLayerManager layerManager;
 
         /**
          * constructor
-         *
+         * @param layerManager The layer manager to use for the list.
          * @param selectionModel the list selection model
          */
-        LayerListModel(DefaultListSelectionModel selectionModel) {
+        LayerListModel(MainLayerManager layerManager, DefaultListSelectionModel selectionModel) {
+            this.layerManager = layerManager;
             this.selectionModel = selectionModel;
             listeners = new CopyOnWriteArrayList<>();
@@ -664,11 +666,10 @@
         }
 
-        private MainLayerManager getLayerManager() {
-            // layerList should never be null. But if it is, we should not crash.
-            if (layerList == null) {
-                return new MainLayerManager();
-            } else {
-                return layerList.getLayerManager();
-            }
+        /**
+         * The layer manager this model is for.
+         * @return The layer manager.
+         */
+        public MainLayerManager getLayerManager() {
+            return layerManager;
         }
 
@@ -1125,9 +1126,7 @@
      */
     static class LayerList extends JTable {
-        private final transient MainLayerManager layerManager;
-
-        LayerList(LayerListModel dataModel, MainLayerManager layerManager) {
+
+        LayerList(LayerListModel dataModel) {
             super(dataModel);
-            this.layerManager = layerManager;
             dataModel.setLayerList(this);
         }
@@ -1142,13 +1141,4 @@
             viewport.scrollRectToVisible(rect);
         }
-
-        /**
-         * Gets you the layer manager used for this list.
-         * @return The layer manager.
-         * @since 10288
-         */
-        public MainLayerManager getLayerManager() {
-            return layerManager;
-        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 10345)
@@ -39,10 +39,11 @@
 import org.openstreetmap.josm.data.notes.NoteComment;
 import org.openstreetmap.josm.data.osm.NoteData;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NoteInputDialog;
 import org.openstreetmap.josm.gui.NoteSortDialog;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.NoteLayer;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -99,5 +100,5 @@
         uploadAction = new UploadNotesAction();
         buildDialog();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
@@ -170,12 +171,7 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        if (newLayer instanceof NoteLayer) {
-            noteData = ((NoteLayer) newLayer).getNoteData();
+    public void layerAdded(LayerAddEvent e) {
+        if (e.getAddedLayer() instanceof NoteLayer) {
+            noteData = ((NoteLayer) e.getAddedLayer()).getNoteData();
             model.setData(noteData.getNotes());
             setNotes(noteData.getSortedNotes());
@@ -184,6 +180,6 @@
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof NoteLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof NoteLayer) {
             noteData = null;
             model.clearData();
@@ -192,4 +188,9 @@
             }
         }
+    }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignored
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 10345)
@@ -35,7 +35,8 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.layer.Layer;
+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;
@@ -50,5 +51,5 @@
  *
  */
-public class UserListDialog extends ToggleDialog implements SelectionChangedListener, MapView.LayerChangeListener {
+public class UserListDialog extends ToggleDialog implements SelectionChangedListener, ActiveLayerChangeListener {
 
     /**
@@ -72,10 +73,10 @@
     public void showNotify() {
         DataSet.addSelectionListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         DataSet.removeSelectionListener(this);
     }
@@ -113,20 +114,11 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (newLayer instanceof OsmDataLayer) {
-            refresh(((OsmDataLayer) newLayer).data.getAllSelected());
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        Layer activeLayer = e.getSource().getActiveLayer();
+        if (activeLayer instanceof OsmDataLayer) {
+            refresh(((OsmDataLayer) activeLayer).data.getAllSelected());
         } else {
             refresh(null);
         }
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // do nothing
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 10345)
@@ -42,11 +42,10 @@
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.data.validation.ValidatorVisitor;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.validator.ValidatorTreePanel;
-import org.openstreetmap.josm.gui.layer.Layer;
+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.preferences.validator.ValidatorPreference;
@@ -66,5 +65,5 @@
  * @author frsantos
  */
-public class ValidatorDialog extends ToggleDialog implements SelectionChangedListener, LayerChangeListener {
+public class ValidatorDialog extends ToggleDialog implements SelectionChangedListener, ActiveLayerChangeListener {
 
     /** The display tree */
@@ -179,14 +178,10 @@
             updateSelection(ds.getAllSelected());
         }
-        MapView.addLayerChangeListener(this);
-        Layer activeLayer = Main.map.mapView.getActiveLayer();
-        if (activeLayer != null) {
-            activeLayerChange(null, activeLayer);
-        }
+        Main.getLayerManager().addAndFireActiveLayerChangeListener(this);
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         DataSet.removeSelectionListener(this);
     }
@@ -407,20 +402,10 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (newLayer instanceof OsmDataLayer) {
-            linkedLayer = (OsmDataLayer) newLayer;
-            tree.setErrorList(linkedLayer.validationErrors);
-        }
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer == linkedLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        OsmDataLayer editLayer = e.getSource().getEditLayer();
+        if (editLayer == null) {
             tree.setErrorList(new ArrayList<TestError>());
+        } else {
+            tree.setErrorList(editLayer.validationErrors);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java	(revision 10345)
@@ -10,10 +10,10 @@
 import javax.swing.AbstractAction;
 
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -26,5 +26,5 @@
  */
 public final class ActivateLayerAction extends AbstractAction
-implements IEnabledStateUpdating, MapView.LayerChangeListener, MultikeyShortcutAction {
+implements IEnabledStateUpdating, ActiveLayerChangeListener, MultikeyShortcutAction {
     private transient Layer layer;
     private transient Shortcut multikeyShortcut;
@@ -77,12 +77,10 @@
     private void execute(Layer layer) {
         // model is going to be updated via LayerChangeListener and PropertyChangeEvents
-        Main.map.mapView.setActiveLayer(layer);
+        model.getLayerManager().setActiveLayer(layer);
         layer.setVisible(true);
     }
 
-    protected boolean isActiveLayer(Layer layer) {
-        if (!Main.isDisplayingMapView())
-            return false;
-        return Main.map.mapView.getActiveLayer() == layer;
+    boolean isActiveLayer(Layer layer) {
+        return model.getLayerManager().getActiveLayer() == layer;
     }
 
@@ -106,15 +104,5 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         updateEnabledState();
     }
@@ -137,3 +125,4 @@
         return null; // Repeating action doesn't make much sense for activating
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 10345)
@@ -618,7 +618,4 @@
         super.destroy();
         Main.pref.removePreferenceChangeListener(this);
-        for (JosmAction action : josmActions) {
-            action.destroy();
-        }
         Container parent = pluginHook.getParent();
         if (parent != null) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 10345)
@@ -11,7 +11,11 @@
 import java.util.Objects;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
@@ -20,5 +24,5 @@
  *
  */
-public class RelationDialogManager extends WindowAdapter implements MapView.LayerChangeListener {
+public class RelationDialogManager extends WindowAdapter implements LayerChangeListener {
 
     /** keeps track of open relation editors */
@@ -33,5 +37,5 @@
         if (RelationDialogManager.relationDialogManager == null) {
             RelationDialogManager.relationDialogManager = new RelationDialogManager();
-            MapView.addLayerChangeListener(RelationDialogManager.relationDialogManager);
+            Main.getLayerManager().addLayerChangeListener(RelationDialogManager.relationDialogManager);
         }
         return RelationDialogManager.relationDialogManager;
@@ -167,10 +171,7 @@
     }
 
-    /**
-     * called when a layer is removed
-     *
-     */
-    @Override
-    public void layerRemoved(Layer oldLayer) {
+    @Override
+    public void layerRemoving(LayerRemoveEvent e) {
+        Layer oldLayer = e.getRemovedLayer();
         if (!(oldLayer instanceof OsmDataLayer))
             return;
@@ -190,11 +191,11 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // do nothing
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // do nothing
+    public void layerAdded(LayerAddEvent e) {
+        // ignore
+    }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignore
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 10345)
@@ -11,10 +11,14 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+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.tools.CheckParameterUtil;
 
-public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, MapView.LayerChangeListener {
+public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, ActiveLayerChangeListener, LayerChangeListener {
 
     /** this selection table model only displays selected primitives in this layer */
@@ -40,5 +44,5 @@
     public void register() {
         DataSet.addSelectionListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
@@ -48,5 +52,5 @@
     public void unregister() {
         DataSet.removeSelectionListener(this);
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
     }
 
@@ -69,10 +73,10 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (oldLayer  == layer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        if (e.getPreviousActiveLayer()  == layer) {
             cache.clear();
         }
-        if (newLayer == layer) {
-            cache.addAll(((OsmDataLayer) newLayer).data.getAllSelected());
+        if (e.getSource().getActiveLayer() == layer) {
+            cache.addAll(layer.data.getAllSelected());
         }
         fireTableDataChanged();
@@ -80,15 +84,20 @@
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // do nothing
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer == layer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() == layer) {
             unregister();
         }
         this.cache.clear();
         fireTableDataChanged();
+    }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // do nothing
     }
 
@@ -128,3 +137,4 @@
         return cache.get(row);
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 10345)
@@ -22,6 +22,8 @@
 import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.tools.Predicate;
 import org.openstreetmap.josm.tools.Utils;
@@ -33,5 +35,5 @@
  * @since 2019
  */
-public final class HistoryBrowserDialogManager implements MapView.LayerChangeListener {
+public final class HistoryBrowserDialogManager implements LayerChangeListener {
 
     private static final String WINDOW_GEOMETRY_PREF = HistoryBrowserDialogManager.class.getName() + ".geometry";
@@ -54,5 +56,5 @@
     protected HistoryBrowserDialogManager() {
         dialogs = new HashMap<>();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
@@ -153,19 +155,19 @@
     /* ----------------------------------------------------------------------------- */
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // Do nothing
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        // remove all history browsers if the number of layers drops to 0
+        if (e.getSource().getLayers().isEmpty()) {
+            hideAll();
+        }
+    }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         // Do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // remove all history browsers if the number of layers drops to 0
-        if (Main.isDisplayingMapView() && Main.map.mapView.getNumLayers() == 0) {
-            hideAll();
-        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 10345)
@@ -41,7 +41,7 @@
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 import org.openstreetmap.josm.gui.JosmUserIdentityManager;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
+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.ChangeNotifier;
@@ -74,5 +74,5 @@
  * @see HistoryBrowser
  */
-public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeListener, DataSetListener {
+public class HistoryBrowserModel extends ChangeNotifier implements ActiveLayerChangeListener, DataSetListener {
     /** the history of an OsmPrimitive */
     private History history;
@@ -111,5 +111,5 @@
             }
         }
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
@@ -670,5 +670,5 @@
             editLayer.data.removeDataSetListener(this);
         }
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
     }
 
@@ -747,12 +747,14 @@
 
     /* ---------------------------------------------------------------------- */
-    /* LayerChangeListener                                                    */
+    /* ActiveLayerChangeListener                                              */
     /* ---------------------------------------------------------------------- */
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        Layer oldLayer = e.getPreviousActiveLayer();
         if (oldLayer instanceof OsmDataLayer) {
             OsmDataLayer l = (OsmDataLayer) oldLayer;
             l.data.removeDataSetListener(this);
         }
+        Layer newLayer = e.getSource().getActiveLayer();
         if (!(newLayer instanceof OsmDataLayer)) {
             latest = null;
@@ -773,14 +775,4 @@
     }
 
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // Do nothing
-    }
-
     /**
      * Creates a {@link HistoryOsmPrimitive} from a {@link OsmPrimitive}
@@ -825,3 +817,4 @@
         }
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 10345)
@@ -78,9 +78,12 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -164,5 +167,4 @@
         setBackgroundLayer(true);
         this.setVisible(true);
-        MapView.addZoomChangeListener(this);
     }
 
@@ -626,27 +628,28 @@
             }
         };
-        Main.map.mapView.addMouseListener(adapter);
-
-        MapView.addLayerChangeListener(new LayerChangeListener() {
+        Main.getLayerManager().addLayerChangeListener(new LayerChangeListener() {
+
             @Override
-            public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-                //
+            public void layerRemoving(LayerRemoveEvent e) {
+                if (e.getRemovedLayer() == AbstractTileSourceLayer.this) {
+                    Main.map.mapView.removeMouseListener(adapter);
+                    e.getSource().removeLayerChangeListener(this);
+                    MapView.removeZoomChangeListener(AbstractTileSourceLayer.this);
+                }
             }
 
             @Override
-            public void layerAdded(Layer newLayer) {
-                //
+            public void layerOrderChanged(LayerOrderChangeEvent e) {
+                // ignored
             }
 
             @Override
-            public void layerRemoved(Layer oldLayer) {
-                if (oldLayer == AbstractTileSourceLayer.this) {
-                    Main.map.mapView.removeMouseListener(adapter);
-                    MapView.removeLayerChangeListener(this);
-                    MapView.removeZoomChangeListener(AbstractTileSourceLayer.this);
+            public void layerAdded(LayerAddEvent e) {
+                if (e.getAddedLayer() == AbstractTileSourceLayer.this) {
+                    Main.map.mapView.addMouseListener(adapter);
+                    MapView.addZoomChangeListener(AbstractTileSourceLayer.this);
                 }
             }
         });
-
         // FIXME: why do we need this? Without this, if you add a WMS layer and do not move the mouse, sometimes, tiles do not
         // start loading.
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 10345)
@@ -23,14 +23,18 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.DialogsPanel.Action;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
-public final class ImageViewerDialog extends ToggleDialog implements LayerChangeListener {
+public final class ImageViewerDialog extends ToggleDialog implements LayerChangeListener, ActiveLayerChangeListener {
 
     private static final String COMMAND_ZOOM = "zoom";
@@ -76,5 +80,6 @@
         tr("Tool: {0}", tr("Display geotagged images")), KeyEvent.VK_Y, Shortcut.DIRECT), 200);
         build();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
@@ -196,5 +201,6 @@
     @Override
     public void destroy() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
+        Main.getLayerManager().removeLayerChangeListener(this);
         super.destroy();
     }
@@ -410,5 +416,31 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
+        showLayer(e.getAddedLayer());
+    }
+
+    @Override
+    public void layerRemoving(LayerRemoveEvent e) {
+        // Clear current image and layer if current layer is deleted
+        if (currentLayer != null && currentLayer.equals(e.getRemovedLayer())) {
+            showImage(null, null);
+        }
+        // Check buttons state in case of layer merging
+        if (currentLayer != null && e.getRemovedLayer() instanceof GeoImageLayer) {
+            currentLayer.checkPreviousNextButtons();
+        }
+    }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignored
+    }
+
+    @Override
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        showLayer(e.getSource().getActiveLayer());
+    }
+
+    private void showLayer(Layer newLayer) {
         if (currentLayer == null && newLayer instanceof GeoImageLayer) {
             ((GeoImageLayer) newLayer).showFirstPhoto();
@@ -416,21 +448,3 @@
     }
 
-    @Override
-    public void layerAdded(Layer newLayer) {
-        if (currentLayer == null && newLayer instanceof GeoImageLayer) {
-            ((GeoImageLayer) newLayer).showFirstPhoto();
-        }
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // Clear current image and layer if current layer is deleted
-        if (currentLayer != null && currentLayer.equals(oldLayer)) {
-            showImage(null, null);
-        }
-        // Check buttons state in case of layer merging
-        if (currentLayer != null && oldLayer instanceof GeoImageLayer) {
-            currentLayer.checkPreviousNextButtons();
-        }
-    }
 }
Index: trunk/src/org/openstreetmap/josm/io/FileExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/FileExporter.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/io/FileExporter.java	(revision 10345)
@@ -8,8 +8,9 @@
 
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 
-public abstract class FileExporter implements LayerChangeListener {
+public abstract class FileExporter implements ActiveLayerChangeListener {
 
     public final ExtensionFileFilter filter;
@@ -54,16 +55,6 @@
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         // To be overriden by subclasses if their enabled state depends of the active layer nature
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // To be overriden by subclasses if needed
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // To be overriden by subclasses if needed
     }
 
Index: trunk/src/org/openstreetmap/josm/io/WMSLayerExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/WMSLayerExporter.java	(revision 10344)
+++ trunk/src/org/openstreetmap/josm/io/WMSLayerExporter.java	(revision 10345)
@@ -12,4 +12,5 @@
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -44,10 +45,9 @@
             }
         }
-
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        setEnabled(newLayer instanceof AbstractTileSourceLayer);
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        setEnabled(e.getSource().getActiveLayer() instanceof AbstractTileSourceLayer);
     }
 }
