Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 10287)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 10288)
@@ -144,4 +144,6 @@
      * Replies true if JOSM currently displays a map view. False, if it doesn't, i.e. if
      * it only shows the MOTD panel.
+     * <p>
+     * You do not need this when accessing the layer manager. The layer manager will be empty if no map view is shown.
      *
      * @return <code>true</code> if JOSM currently displays a map view
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10287)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 10288)
@@ -60,4 +60,11 @@
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions;
 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;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -75,4 +82,6 @@
  * change the ordering of the layers, to hide/show layers, to activate layers,
  * and to delete layers.
+ * <p>
+ * Support for multiple {@link LayerListDialog} is currently not complete but intended for the future.
  * @since 17
  */
@@ -134,4 +143,9 @@
     private final transient Shortcut[] visibilityToggleShortcuts = new Shortcut[10];
     private final ToggleLayerIndexVisibility[] visibilityToggleActions = new ToggleLayerIndexVisibility[10];
+
+    /**
+     * The {@link MainLayerManager} this list is for.
+     */
+    private final transient MainLayerManager layerManager;
 
     /**
@@ -155,7 +169,16 @@
      */
     protected LayerListDialog(MapFrame mapFrame) {
+        this(mapFrame.mapView.getLayerManager());
+    }
+
+    /**
+     * Creates a layer list and attach it to the given mapView.
+     * @param layerManager The layer manager this list is for
+     */
+    private LayerListDialog(MainLayerManager layerManager) {
         super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."),
                 Shortcut.registerShortcut("subwindow:layers", tr("Toggle: {0}", tr("Layers")), KeyEvent.VK_L,
                         Shortcut.ALT_SHIFT), 100, true);
+        this.layerManager = layerManager;
 
         // create the models
@@ -167,5 +190,5 @@
         // create the list control
         //
-        layerList = new LayerList(model);
+        layerList = new LayerList(model, layerManager);
         layerList.setSelectionModel(selectionModel);
         layerList.addMouseListener(new PopupMenuHandler());
@@ -219,7 +242,6 @@
         // init the model
         //
-        final MapView mapView = mapFrame.mapView;
         model.populate();
-        model.setSelectedLayer(mapView.getActiveLayer());
+        model.setSelectedLayer(layerManager.getActiveLayer());
         model.addLayerListModelListener(
                 new LayerListModelListener() {
@@ -297,8 +319,18 @@
     }
 
+    /**
+     * Gets the layer manager this dialog is for.
+     * @return The layer manager.
+     * @since 10288
+     */
+    public MainLayerManager getLayerManager() {
+        return layerManager;
+    }
+
     @Override
     public void showNotify() {
         MapView.addLayerChangeListener(activateLayerAction);
-        MapView.addLayerChangeListener(model);
+        layerManager.addLayerChangeListener(model);
+        layerManager.addActiveLayerChangeListener(model, true);
         model.populate();
     }
@@ -306,5 +338,6 @@
     @Override
     public void hideNotify() {
-        MapView.removeLayerChangeListener(model);
+        layerManager.removeLayerChangeListener(model);
+        layerManager.removeActiveLayerChangeListener(model);
         MapView.removeLayerChangeListener(activateLayerAction);
     }
@@ -513,7 +546,5 @@
 
         protected boolean isActiveLayer(Layer layer) {
-            if (!Main.isDisplayingMapView())
-                return false;
-            return Main.map.mapView.getActiveLayer() == layer;
+            return getLayerManager().getActiveLayer() == layer;
         }
 
@@ -612,5 +643,6 @@
      * the properties {@link Layer#VISIBLE_PROP} and {@link Layer#NAME_PROP}.
      */
-    public static final class LayerListModel extends AbstractTableModel implements MapView.LayerChangeListener, PropertyChangeListener {
+    public static final class LayerListModel extends AbstractTableModel
+            implements LayerChangeListener, ActiveLayerChangeListener, PropertyChangeListener {
         /** manages list selection state*/
         private final DefaultListSelectionModel selectionModel;
@@ -628,6 +660,15 @@
         }
 
-        void setlayerList(LayerList layerList) {
+        void setLayerList(LayerList layerList) {
             this.layerList = layerList;
+        }
+
+        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();
+            }
         }
 
@@ -744,15 +785,11 @@
             final int size = getRowCount();
             final List<Integer> rows = getSelectedRows();
-            GuiHelper.runInEDTAndWait(new Runnable() {
-                @Override
-                public void run() {
-                    if (rows.isEmpty() && size > 0) {
-                        selectionModel.setSelectionInterval(size-1, size-1);
-                    }
-                    fireTableDataChanged();
-                    fireRefresh();
-                    ensureActiveSelected();
-                }
-            });
+
+            if (rows.isEmpty() && size > 0) {
+                selectionModel.setSelectionInterval(size-1, size-1);
+            }
+            fireTableDataChanged();
+            fireRefresh();
+            ensureActiveSelected();
         }
 
@@ -888,8 +925,8 @@
         public List<Layer> getPossibleMergeTargets(Layer source) {
             List<Layer> targets = new ArrayList<>();
-            if (source == null || !Main.isDisplayingMapView()) {
+            if (source == null) {
                 return targets;
             }
-            for (Layer target : Main.map.mapView.getAllLayersAsList()) {
+            for (Layer target : getLayers()) {
                 if (source == target) {
                     continue;
@@ -910,7 +947,5 @@
          */
         public List<Layer> getLayers() {
-            if (!Main.isDisplayingMapView())
-                return Collections.<Layer>emptyList();
-            return Main.map.mapView.getAllLayersAsList();
+            return getLayerManager().getLayers();
         }
 
@@ -942,12 +977,15 @@
          */
         protected Layer getActiveLayer() {
-            return Main.isDisplayingMapView() ? Main.map.mapView.getActiveLayer() : null;
-        }
-
-        /**
-         * Replies the scale layer. null, if no active layer is available
+            return getLayerManager().getActiveLayer();
+        }
+
+        /**
+         * Replies the scale layer. null, if no active layer is available.
          *
          * @return the scale layer. null, if no active layer is available
-         */
+         * @deprecated Deprecated since it is unused in JOSM and does not really belong here. Can be removed soon (August 2016).
+         *             You can directly query MapView.
+         */
+        @Deprecated
         protected NativeScaleLayer getNativeScaleLayer() {
             return Main.isDisplayingMapView() ? Main.map.mapView.getNativeScaleLayer() : null;
@@ -998,5 +1036,5 @@
                 switch (col) {
                 case 0:
-                    Main.map.mapView.setActiveLayer(l);
+                    getLayerManager().setActiveLayer(l);
                     l.setVisible(true);
                     break;
@@ -1028,37 +1066,42 @@
 
         /* ------------------------------------------------------------------------------ */
+        /* Interface ActiveLayerChangeListener                                            */
+        /* ------------------------------------------------------------------------------ */
+        @Override
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            Layer oldLayer = e.getPreviousActiveLayer();
+            if (oldLayer != null) {
+                int idx = getLayers().indexOf(oldLayer);
+                if (idx >= 0) {
+                    fireTableRowsUpdated(idx, idx);
+                }
+            }
+
+            Layer newLayer = getActiveLayer();
+            if (newLayer != null) {
+                int idx = getLayers().indexOf(newLayer);
+                if (idx >= 0) {
+                    fireTableRowsUpdated(idx, idx);
+                }
+            }
+            ensureActiveSelected();
+        }
+
+        /* ------------------------------------------------------------------------------ */
         /* Interface LayerChangeListener                                                  */
         /* ------------------------------------------------------------------------------ */
         @Override
-        public void activeLayerChange(final Layer oldLayer, final Layer newLayer) {
-            GuiHelper.runInEDTAndWait(new Runnable() {
-                @Override
-                public void run() {
-                    if (oldLayer != null) {
-                        int idx = getLayers().indexOf(oldLayer);
-                        if (idx >= 0) {
-                            fireTableRowsUpdated(idx, idx);
-                        }
-                    }
-
-                    if (newLayer != null) {
-                        int idx = getLayers().indexOf(newLayer);
-                        if (idx >= 0) {
-                            fireTableRowsUpdated(idx, idx);
-                        }
-                    }
-                    ensureActiveSelected();
-                }
-            });
-        }
-
-        @Override
-        public void layerAdded(Layer newLayer) {
-            onAddLayer(newLayer);
-        }
-
-        @Override
-        public void layerRemoved(final Layer oldLayer) {
-            onRemoveLayer(oldLayer);
+        public void layerAdded(LayerAddEvent e) {
+            onAddLayer(e.getAddedLayer());
+        }
+
+        @Override
+        public void layerRemoving(LayerRemoveEvent e) {
+            onRemoveLayer(e.getRemovedLayer());
+        }
+
+        @Override
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            // ignored for now, since only we change layer order.
         }
 
@@ -1078,8 +1121,14 @@
     }
 
+    /**
+     * This component displays a list of layers and provides the methods needed by {@link LayerListModel}.
+     */
     static class LayerList extends JTable {
-        LayerList(LayerListModel dataModel) {
+        private final transient MainLayerManager layerManager;
+
+        LayerList(LayerListModel dataModel, MainLayerManager layerManager) {
             super(dataModel);
-            dataModel.setlayerList(this);
+            this.layerManager = layerManager;
+            dataModel.setLayerList(this);
         }
 
@@ -1093,4 +1142,13 @@
             viewport.scrollRectToVisible(rect);
         }
+
+        /**
+         * Gets you the layer manager used for this list.
+         * @return The layer manager.
+         * @since 10288
+         */
+        public MainLayerManager getLayerManager() {
+            return layerManager;
+        }
     }
 
@@ -1149,8 +1207,5 @@
      */
     public static Layer getLayerForIndex(int index) {
-        if (!Main.isDisplayingMapView())
-            return null;
-
-        List<Layer> layers = Main.map.mapView.getAllLayersAsList();
+        List<Layer> layers = Main.getLayerManager().getLayers();
 
         if (index < layers.size() && index >= 0)
@@ -1169,8 +1224,5 @@
         List<MultikeyInfo> result = new ArrayList<>();
 
-        if (!Main.isDisplayingMapView())
-            return result;
-
-        List<Layer> layers = Main.map.mapView.getAllLayersAsList();
+        List<Layer> layers = Main.getLayerManager().getLayers();
 
         int index = 0;
@@ -1186,13 +1238,13 @@
 
     /**
-     * Determines if a layer is valid (contained in layer list).
+     * Determines if a layer is valid (contained in global layer list).
      * @param l the layer
      * @return {@code true} if layer {@code l} is contained in current layer list
      */
     public static boolean isLayerValid(Layer l) {
-        if (l == null || !Main.isDisplayingMapView())
+        if (l == null)
             return false;
 
-        return Main.map.mapView.getAllLayersAsList().contains(l);
+        return Main.getLayerManager().containsLayer(l);
     }
 
@@ -1203,8 +1255,8 @@
      */
     public static MultikeyInfo getLayerInfo(Layer l) {
-        if (l == null || !Main.isDisplayingMapView())
+        if (l == null)
             return null;
 
-        int index = Main.map.mapView.getAllLayersAsList().indexOf(l);
+        int index = Main.getLayerManager().getLayers().indexOf(l);
         if (index < 0)
             return null;
