Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10507)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10508)
@@ -397,13 +397,4 @@
         I18n.setupLanguageFonts();
 
-        // Can only be called after preferences are initialized.
-        // We can move this to MainPanel constructor as soon as noone depends on Main#panel any more.
-        GuiHelper.runInEDTAndWait(new Runnable() {
-            @Override
-            public void run() {
-                mainPanel.updateContent();
-            }
-        });
-
         WindowGeometry geometry = WindowGeometry.mainWindow("gui.geometry",
                 args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null,
Index: /trunk/src/org/openstreetmap/josm/gui/MainPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainPanel.java	(revision 10507)
+++ /trunk/src/org/openstreetmap/josm/gui/MainPanel.java	(revision 10508)
@@ -7,14 +7,11 @@
 
 import javax.swing.JPanel;
-import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 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.LayerAvailabilityEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityListener;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 
@@ -45,9 +42,9 @@
     /**
      * Update the content of this {@link MainFrame} to either display the map or display the welcome screen.
+     * @param showMap If the map should be displayed.
      */
-    protected void updateContent() {
+    protected void updateContent(boolean showMap) {
         GuiHelper.assertCallFromEdt();
         MapFrame old = map;
-        boolean showMap = !layerManager.getLayers().isEmpty();
         if (old != null && showMap) {
             // no state change
@@ -155,25 +152,19 @@
      */
     public void reAddListeners() {
-        layerManager.addLayerChangeListener(new LayerChangeListener() {
+        layerManager.addLayerAvailabilityListener(new LayerAvailabilityListener() {
             @Override
-            public void layerAdded(LayerAddEvent e) {
-                updateContent();
+            public void beforeFirstLayerAdded(LayerAvailabilityEvent e) {
+                updateContent(true);
             }
 
             @Override
-            public void layerRemoving(final LayerRemoveEvent e) {
-                // Delay main.map removal until after all listeners are finished.
-                // Some components rely on this and e.g. get the MapView that way.
-                SwingUtilities.invokeLater(new Runnable() {
-                    @Override
-                    public void run() {
-                        updateContent();
-                    }
-                });
+            public void afterLastLayerRemoved(LayerAvailabilityEvent e) {
+                updateContent(false);
             }
-
+        });
+        GuiHelper.runInEDTAndWait(new Runnable() {
             @Override
-            public void layerOrderChanged(LayerOrderChangeEvent e) {
-                // ignored
+            public void run() {
+                updateContent(!layerManager.getLayers().isEmpty());
             }
         });
Index: /trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(revision 10507)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(revision 10508)
@@ -96,4 +96,45 @@
 
     /**
+     * This event is fired for {@link LayerAvailabilityListener}
+     * @author Michael Zangl
+     * @since 10508
+     */
+    public class LayerAvailabilityEvent extends LayerManagerEvent {
+        private final boolean hasLayers;
+
+        LayerAvailabilityEvent(LayerManager source, boolean hasLayers) {
+            super(source);
+            this.hasLayers = hasLayers;
+        }
+
+        /**
+         * Checks if this layer manager will have layers afterwards
+         * @return true if layers will be added.
+         */
+        public boolean hasLayers() {
+            return hasLayers;
+        }
+    }
+
+    /**
+     * A listener that gets informed before any layer is displayed and after all layers are removed.
+     * @author Michael Zangl
+     * @since 10508
+     */
+    public interface LayerAvailabilityListener {
+        /**
+         * This method is called in the UI thread right before the first layer is added.
+         * @param e The event.
+         */
+        void beforeFirstLayerAdded(LayerAvailabilityEvent e);
+
+        /**
+         * This method is called in the UI thread after the last layer was removed.
+         * @param e The event.
+         */
+        void afterLastLayerRemoved(LayerAvailabilityEvent e);
+    }
+
+    /**
      * The layer from the layers list that is currently active.
      */
@@ -106,4 +147,5 @@
 
     private final List<ActiveLayerChangeListener> activeLayerChangeListeners = new CopyOnWriteArrayList<>();
+    private final List<LayerAvailabilityListener> layerAvailabilityListeners = new CopyOnWriteArrayList<>();
 
     /**
@@ -154,4 +196,26 @@
         }
         activeLayerChangeListeners.remove(listener);
+    }
+
+    /**
+     * Add a new {@link LayerAvailabilityListener}.
+     * @param listener The listener
+     * @since 10508
+     */
+    public synchronized void addLayerAvailabilityListener(LayerAvailabilityListener listener) {
+        if (!layerAvailabilityListeners.add(listener)) {
+            throw new IllegalArgumentException("Attempted to add listener that was already in list: " + listener);
+        }
+    }
+
+    /**
+     * Remove an {@link LayerAvailabilityListener}.
+     * @param listener The listener
+     * @since 10508
+     */
+    public synchronized void removeLayerAvailabilityListener(LayerAvailabilityListener listener) {
+        if (!layerAvailabilityListeners.remove(listener)) {
+            throw new IllegalArgumentException("Attempted to remove listener that was not in list: " + listener);
+        }
     }
 
@@ -199,4 +263,10 @@
     @Override
     protected synchronized void realAddLayer(Layer layer) {
+        if (getLayers().isEmpty()) {
+            LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, true);
+            for (LayerAvailabilityListener l : layerAvailabilityListeners) {
+                l.beforeFirstLayerAdded(e);
+            }
+        }
         super.realAddLayer(layer);
 
@@ -214,5 +284,12 @@
         }
 
-        return super.realRemoveSingleLayer(layer);
+        Collection<Layer> toDelete = super.realRemoveSingleLayer(layer);
+        if (getLayers().isEmpty()) {
+            LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false);
+            for (LayerAvailabilityListener l : layerAvailabilityListeners) {
+                l.afterLastLayerRemoved(e);
+            }
+        }
+        return toDelete;
     }
 
@@ -320,4 +397,5 @@
 
         activeLayerChangeListeners.clear();
+        layerAvailabilityListeners.clear();
     }
 }
