diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index 278c952..99dd688 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -82,6 +82,7 @@ import org.openstreetmap.josm.gui.MainApplication.Option;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapFrameListener;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.io.SaveLayersDialog;
@@ -525,8 +526,14 @@ public abstract class Main {
 
         Main.map = map;
 
+        // Notify map frame listeners, mostly plugins.
+        if ((map == null) == (old == null)) {
+            Main.warn("Replacing the map frame. This is not expected by some plugins and should not happen.");
+        }
         for (MapFrameListener listener : mapFrameListeners) {
+            MapView.fireDeprecatedListenerOnAdd = true;
             listener.mapFrameInitialized(old, map);
+            MapView.fireDeprecatedListenerOnAdd = false;
         }
         if (map == null && currentProgressMonitor != null) {
             currentProgressMonitor.showForegroundDialog();
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index 67a62e0..1415463 100644
--- a/src/org/openstreetmap/josm/gui/MapView.java
+++ b/src/org/openstreetmap/josm/gui/MapView.java
@@ -374,7 +374,11 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
      */
     @Deprecated
     public static void addLayerChangeListener(LayerChangeListener listener) {
-        addLayerChangeListener(listener, false);
+        if (fireDeprecatedListenerOnAdd) {
+            Main.warn("Plugin seems to be adding listener during mapFrameInitialized(): " + BugReport.getCallingMethod(2)
+            + ". Layer listeners should be set on plugin load.");
+        }
+        addLayerChangeListener(listener, fireDeprecatedListenerOnAdd);
     }
 
     /**
@@ -390,10 +394,10 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     @Deprecated
     public static void addLayerChangeListener(LayerChangeListener listener, boolean initialFire) {
         if (listener != null) {
-            initialFire = initialFire && Main.isDisplayingMapView();
+            initialFire = initialFire && (Main.isDisplayingMapView() || fireDeprecatedListenerOnAdd);
 
             LayerChangeAdapter adapter = new LayerChangeAdapter(listener, initialFire);
-            Main.getLayerManager().addLayerChangeListener(adapter, false);
+            Main.getLayerManager().addLayerChangeListener(adapter, initialFire);
             if (initialFire) {
                 Main.getLayerManager().addAndFireActiveLayerChangeListener(adapter);
             } else {
@@ -438,6 +442,16 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
         addEditLayerChangeListener(listener, false);
     }
 
+
+    /**
+     * Temporary. To be removed as soon as the {@link LayerChangeListener}s are removed.
+     * <p>
+     * Some plugins add their listeners in {@link Main#setMapFrame(MapFrame)}. This method is now called just after the first layer was added to
+     * the layer manager. So that listener would not receive the addition of the first layer. As long as this field is set, we fake an add call
+     * to that listener when it is added to immitate the old behaviour. You should not access it from anywhere else.
+     */
+    public static boolean fireDeprecatedListenerOnAdd;
+
     public boolean viewportFollowing;
 
     /**
diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
index cfd2fdb..f74af94 100644
--- a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
@@ -62,7 +62,7 @@ public final class BugReport {
      *            How many methods to look back in the stack trace. 1 gives the method calling this method, 0 gives you getCallingMethod().
      * @return The method name.
      */
-    static String getCallingMethod(int offset) {
+    public static String getCallingMethod(int offset) {
         StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
         String className = BugReport.class.getName();
         for (int i = 0; i < stackTrace.length - offset; i++) {
