diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index 4abcbe5..15dd555 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -396,15 +396,6 @@ public class MainApplication extends Main {
 
         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,
                 !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false));
diff --git a/src/org/openstreetmap/josm/gui/MainPanel.java b/src/org/openstreetmap/josm/gui/MainPanel.java
index 0762e3b..f7ffd64 100644
--- a/src/org/openstreetmap/josm/gui/MainPanel.java
+++ b/src/org/openstreetmap/josm/gui/MainPanel.java
@@ -6,16 +6,13 @@ import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 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;
 
 /**
@@ -44,11 +41,11 @@ public class MainPanel extends JPanel {
 
     /**
      * 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
             return;
@@ -154,27 +151,21 @@ public class MainPanel extends JPanel {
      * Re-adds the layer listeners. Never call this in production, only needed for testing.
      */
     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());
             }
         });
     }
diff --git a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
index bd6a5ee..442a47d 100644
--- a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
@@ -94,6 +94,47 @@ public class MainLayerManager extends LayerManager {
     }
 
     /**
+     * This event is fired for {@link LayerAvailabilityListener}
+     * @author Michael Zangl
+     * @since  xxx
+     */
+    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 xxx
+     */
+    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.
      */
     private Layer activeLayer;
@@ -104,6 +145,7 @@ public class MainLayerManager extends LayerManager {
     private OsmDataLayer editLayer;
 
     private final List<ActiveLayerChangeListener> activeLayerChangeListeners = new CopyOnWriteArrayList<>();
+    private final List<LayerAvailabilityListener> layerAvailabilityListeners = new CopyOnWriteArrayList<>();
 
     /**
      * Adds a active/edit layer change listener
@@ -155,6 +197,29 @@ public class MainLayerManager extends LayerManager {
     }
 
     /**
+     * Add a new {@link LayerAvailabilityListener}.
+     * @param listener The listener
+     * @since xxx
+     */
+    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 xxx
+     */
+    public synchronized void removeLayerAvailabilityListener(LayerAvailabilityListener listener) {
+        if (!layerAvailabilityListeners.remove(listener)) {
+            throw new IllegalArgumentException("Attempted to remove listener that was not in list: " + listener);
+        }
+
+    }
+
+    /**
      * Set the active layer. If the layer is an OsmDataLayer, the edit layer is also changed.
      * @param layer The active layer.
      */
@@ -197,6 +262,12 @@ public class MainLayerManager extends LayerManager {
 
     @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);
 
         // update the active layer automatically.
@@ -213,6 +284,13 @@ public class MainLayerManager extends LayerManager {
         }
 
         super.realRemoveLayer(layer);
+
+        if (getLayers().isEmpty()) {
+            LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false);
+            for (LayerAvailabilityListener  l : layerAvailabilityListeners) {
+                l.afterLastLayerRemoved(e);
+            }
+        }
     }
 
     /**
@@ -318,5 +396,6 @@ public class MainLayerManager extends LayerManager {
         super.resetState();
 
         activeLayerChangeListeners.clear();
+        layerAvailabilityListeners.clear();
     }
 }
