diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index c0e89c6..09e5a10 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -657,7 +657,6 @@ public abstract class Main {
             @Override
             public void initialize() {
                 validator = new OsmValidator();
-                getLayerManager().addLayerChangeListener(validator);
             }
         });
 
diff --git a/src/org/openstreetmap/josm/data/validation/OsmValidator.java b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
index 883f5b9..9fdf307 100644
--- a/src/org/openstreetmap/josm/data/validation/OsmValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
@@ -59,11 +59,6 @@ import org.openstreetmap.josm.data.validation.tests.UntaggedNode;
 import org.openstreetmap.josm.data.validation.tests.UntaggedWay;
 import org.openstreetmap.josm.data.validation.tests.WayConnectedToArea;
 import org.openstreetmap.josm.data.validation.tests.WronglyOrderedWays;
-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.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.ValidatorLayer;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorPreference;
@@ -74,7 +69,7 @@ import org.openstreetmap.josm.tools.Utils;
  *
  * @author Francisco R. Santos &lt;frsantos@gmail.com&gt;
  */
-public class OsmValidator implements LayerChangeListener {
+public class OsmValidator {
 
     public static volatile ValidatorLayer errorLayer;
 
@@ -345,29 +340,4 @@ public class OsmValidator implements LayerChangeListener {
         }
     }
 
-    /* -------------------------------------------------------------------------- */
-    /* interface LayerChangeListener                                              */
-    /* -------------------------------------------------------------------------- */
-    @Override
-    public void layerAdded(LayerAddEvent e) {
-        // do nothing
-    }
-
-    @Override
-    public void layerOrderChanged(LayerOrderChangeEvent e) {
-        // do nothing
-    }
-
-    @Override
-    public void layerRemoving(LayerRemoveEvent e) {
-        if (e.getRemovedLayer() == errorLayer) {
-            errorLayer = null;
-            return;
-        }
-        if (e.getSource().getLayersOfType(OsmDataLayer.class).isEmpty()) {
-            if (errorLayer != null) {
-                Main.getLayerManager().removeLayer(errorLayer);
-            }
-        }
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/LayerManager.java b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
index e7ee59e..f235080 100644
--- a/src/org/openstreetmap/josm/gui/layer/LayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
@@ -2,8 +2,12 @@
 package org.openstreetmap.josm.gui.layer;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.openstreetmap.josm.Main;
@@ -97,6 +101,7 @@ public class LayerManager {
     public static class LayerRemoveEvent extends LayerManagerEvent {
         private final Layer removedLayer;
         private final boolean lastLayer;
+        private Collection<Layer> scheduleForRemoval = new ArrayList<>();
 
         LayerRemoveEvent(LayerManager source, Layer removedLayer) {
             super(source);
@@ -121,6 +126,20 @@ public class LayerManager {
             return lastLayer;
         }
 
+        /**
+         * Schedule the removal of other layers after this layer has been deleted.
+         * <p>
+         * Dupplicate removal requests are ignored.
+         * @param layers The layers to remove.
+         * @since xxx
+         */
+        public void scheduleRemoval(Collection<? extends Layer> layers) {
+            for (Layer layer : layers) {
+                getSource().checkContainsLayer(layer);
+            }
+            scheduleForRemoval.addAll(layers);
+        }
+
         @Override
         public String toString() {
             return "LayerRemoveEvent [removedLayer=" + removedLayer + ", lastLayer=" + lastLayer + ']';
@@ -197,10 +216,25 @@ public class LayerManager {
     }
 
     protected synchronized void realRemoveLayer(Layer layer) {
-        checkContainsLayer(layer);
+        GuiHelper.assertCallFromEdt();
+        Set<Layer> toRemove = Collections.newSetFromMap(new IdentityHashMap<Layer, Boolean>());
+        toRemove.add(layer);
+
+        while (!toRemove.isEmpty()) {
+            Iterator<Layer> iterator = toRemove.iterator();
+            Layer layerToRemove = iterator.next();
+            iterator.remove();
+            checkContainsLayer(layerToRemove);
 
-        fireLayerRemoving(layer);
-        layers.remove(layer);
+            Collection<Layer> newToRemove = realRemoveSingleLayer(layerToRemove);
+            toRemove.addAll(newToRemove);
+        }
+    }
+
+    protected Collection<Layer> realRemoveSingleLayer(Layer layerToRemove) {
+        Collection<Layer> newToRemove = fireLayerRemoving(layerToRemove);
+        layers.remove(layerToRemove);
+        return newToRemove;
     }
 
     /**
@@ -333,12 +367,12 @@ public class LayerManager {
         removeLayerChangeListener(listener, false);
     }
 
-
     /**
      * Removes a layer change listener
      *
      * @param listener the listener.
-     * @param fireRemove if we should fire a remove event for every layer in this manager.
+     * @param fireRemove if we should fire a remove event for every layer in this manager. The event is fired as if the layer was deleted but
+     * {@link LayerRemoveEvent#scheduleRemoval(Collection)} is ignored.
      */
     public synchronized void removeLayerChangeListener(LayerChangeListener listener, boolean fireRemove) {
         if (!layerChangeListeners.remove(listener)) {
@@ -364,16 +398,22 @@ public class LayerManager {
         }
     }
 
-    private void fireLayerRemoving(Layer layer) {
+    /**
+     * Fire the layer remove event
+     * @param layer The layer to remove
+     * @return A list of layers that should be removed afterwards.
+     */
+    private Collection<Layer> fireLayerRemoving(Layer layer) {
         GuiHelper.assertCallFromEdt();
         LayerRemoveEvent e = new LayerRemoveEvent(this, layer);
         for (LayerChangeListener l : layerChangeListeners) {
             try {
                 l.layerRemoving(e);
             } catch (RuntimeException t) {
-                throw BugReport.intercept(t).put("listener", l).put("event", e);
+                throw BugReport.intercept(t).put("listener", l).put("event", e).put("layer", layer);
             }
         }
+        return e.scheduleForRemoval;
     }
 
     private void fireLayerOrderChanged() {
diff --git a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
index bd6a5ee..f5a30a7 100644
--- a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.gui.layer;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -206,13 +207,13 @@ public class MainLayerManager extends LayerManager {
     }
 
     @Override
-    protected synchronized void realRemoveLayer(Layer layer) {
+    protected Collection<Layer> realRemoveSingleLayer(Layer layer) {
         if (layer == activeLayer || layer == editLayer) {
             Layer nextActive = suggestNextActiveLayer(layer);
             setActiveLayer(nextActive, true);
         }
 
-        super.realRemoveLayer(layer);
+        return super.realRemoveSingleLayer(layer);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java b/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
index a72a581..4044d99 100644
--- a/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
@@ -4,6 +4,7 @@ package org.openstreetmap.josm.gui.layer;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.Graphics2D;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 
@@ -164,7 +165,7 @@ public class ValidatorLayer extends Layer implements LayerChangeListener {
     public void layerRemoving(LayerRemoveEvent e) {
         // Removed layer is still in that list.
         if (e.getRemovedLayer() instanceof OsmDataLayer && e.getSource().getLayersOfType(OsmDataLayer.class).size() <= 1) {
-            Main.getLayerManager().removeLayer(this);
+            e.scheduleRemoval(Collections.singleton(this));
         } else if (e.getRemovedLayer() == this) {
             Main.getLayerManager().removeLayerChangeListener(this);
             OsmValidator.errorLayer = null;
