diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index d32dc94..9f819de 100644
--- a/src/org/openstreetmap/josm/gui/MapView.java
+++ b/src/org/openstreetmap/josm/gui/MapView.java
@@ -57,6 +57,7 @@ import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.LayerManager;
+import org.openstreetmap.josm.gui.layer.LayerManager.CyclicLayerRemoveException;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
@@ -659,7 +660,12 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
      */
     @Deprecated
     public void removeLayer(Layer layer) {
-        layerManager.removeLayer(layer);
+        try {
+            layerManager.removeLayer(layer);
+        } catch (CyclicLayerRemoveException e) {
+            // ignore...
+            Main.warn(e);
+        }
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/LayerManager.java b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
index e6c4895..ceb41f0 100644
--- a/src/org/openstreetmap/josm/gui/layer/LayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
@@ -3,7 +3,9 @@ package org.openstreetmap.josm.gui.layer;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.IdentityHashMap;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -114,7 +116,27 @@ public class LayerManager {
         LayerOrderChangeEvent(LayerManager source) {
             super(source);
         }
+    }
+
+    /**
+     * An exception to be thrown when a cyclic remove is detected (remove inside removed listener)
+     * @author Michael Zangl
+     * @since xxx
+     */
+    public static class CyclicLayerRemoveException extends IllegalArgumentException {
+
+        /**
+         * Create a new exception
+         * @param message The message
+         */
+        public CyclicLayerRemoveException(String message) {
+            super(message);
+        }
 
+        @Override
+        public String toString() {
+            return "CyclicLayerRemoveException [" + getMessage() + "]";
+        }
     }
 
     /**
@@ -125,6 +147,11 @@ public class LayerManager {
     private final List<LayerChangeListener> layerChangeListeners = new CopyOnWriteArrayList<>();
 
     /**
+     * A set of layers that are currently removed. To detect {@link #removeLayer(Layer)} calls in the layer remove listener.
+     */
+    private final Set<Layer> removingLayers = Collections.newSetFromMap(new IdentityHashMap<Layer, Boolean>());
+
+    /**
      * Add a layer. The layer will be added at a given psoition.
      * @param layer The layer to add
      */
@@ -154,6 +181,8 @@ public class LayerManager {
      * Remove the layer from the mapview. If the layer was in the list before,
      * an LayerChange event is fired.
      * @param layer The layer to remove
+     * @throws IllegalArgumentException When the layer is not in this list
+     * @throws CyclicLayerRemoveException When {@link #removeLayer(Layer)} is called for a removed layer inside the layer removed listener.
      */
     public void removeLayer(final Layer layer) {
         // we force this on to the EDT Thread to make events fire from there.
@@ -161,14 +190,20 @@ public class LayerManager {
         GuiHelper.runInEDTAndWaitWithException(new Runnable() {
             @Override
             public void run() {
-                realRemoveLayer(layer);
+                checkContainsLayer(layer);
+                if (!removingLayers.add(layer)) {
+                    throw new CyclicLayerRemoveException("Caclic remove for layer " + layer);
+                }
+                try {
+                    realRemoveLayer(layer);
+                } finally {
+                    removingLayers.remove(layer);
+                }
             }
         });
     }
 
     protected synchronized void realRemoveLayer(Layer layer) {
-        checkContainsLayer(layer);
-
         fireLayerRemoving(layer);
         layers.remove(layer);
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
index 36205de..a6078a3 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
@@ -21,6 +21,7 @@ import org.junit.Test;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.layer.LayerManager.CyclicLayerRemoveException;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
@@ -229,6 +230,32 @@ public class LayerManagerTest {
     }
 
     /**
+     * {@link LayerManager#removeLayer(Layer)} fails if a removeLayer of a layer that is removed is called inside the layer remove listener.
+     */
+    @Test(expected = CyclicLayerRemoveException.class)
+    public void testRemoveLayerFailsWhenRemoveCycle() {
+        final AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer2);
+
+        layerManager.addLayerChangeListener(new LayerChangeListener() {
+            @Override
+            public void layerRemoving(LayerRemoveEvent e) {
+                layerManager.removeLayer(layer1);
+            }
+
+            @Override
+            public void layerOrderChanged(LayerOrderChangeEvent e) {
+            }
+
+            @Override
+            public void layerAdded(LayerAddEvent e) {
+            }
+        });
+        layerManager.removeLayer(layer1);
+    }
+    /**
      * {@link LayerManager#moveLayer(Layer, int)}
      */
     @Test
