Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2859)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2860)
@@ -312,16 +312,14 @@
      * @return the next active data layer
      */
-    protected Layer determineNextActiveLayer(Layer ignoredLayer) {
+    protected Layer determineNextActiveLayer(List<Layer> layersList) {
         // First look for data layer
-        for (Layer layer:layers) {
-            if (layer instanceof OsmDataLayer && layer != ignoredLayer)
+        for (Layer layer:layersList) {
+            if (layer instanceof OsmDataLayer)
                 return layer;
         }
 
         // Then any layer
-        for (Layer layer:layers) {
-            if (layer != ignoredLayer)
-                return layer;
-        }
+        if (!layersList.isEmpty())
+            return layersList.get(0);
 
         // and then give up
@@ -335,10 +333,17 @@
      */
     public void removeLayer(Layer layer) {
+        List<Layer> layersList = new ArrayList<Layer>(layers);
+
+        if (!layersList.remove(layer))
+            return;
+
+        setEditLayer(layersList);
+
         if (layer == activeLayer) {
-            setActiveLayer(determineNextActiveLayer(activeLayer));
-        }
-        if (layers.remove(layer)) {
-            fireLayerRemoved(layer);
-        }
+            setActiveLayer(determineNextActiveLayer(layersList), false);
+        }
+
+        layers.remove(layer);
+        fireLayerRemoved(layer);
         layer.removePropertyChangeListener(this);
         layer.destroy();
@@ -378,5 +383,5 @@
             layers.add(pos, layer);
         }
-        setEditLayer();
+        setEditLayer(layers);
         AudioPlayer.reset();
         repaint();
@@ -577,14 +582,14 @@
     }
 
-    private void setEditLayer() {
-        OsmDataLayer newEditLayer = editLayer;
+    private void setEditLayer(List<Layer> layersList) {
+        OsmDataLayer newEditLayer = layersList.contains(editLayer)?editLayer:null;
         OsmDataLayer oldEditLayer = editLayer;
 
         // Find new edit layer
-        if (activeLayer != editLayer) {
-            if (activeLayer instanceof OsmDataLayer) {
+        if (activeLayer != editLayer || !layersList.contains(editLayer)) {
+            if (activeLayer instanceof OsmDataLayer && layersList.contains(activeLayer)) {
                 newEditLayer = (OsmDataLayer) activeLayer;
             } else {
-                for (Layer layer:layers) {
+                for (Layer layer:layersList) {
                     if (layer instanceof OsmDataLayer) {
                         newEditLayer = (OsmDataLayer) layer;
@@ -616,4 +621,8 @@
      */
     public void setActiveLayer(Layer layer) {
+        setActiveLayer(layer, true);
+    }
+
+    private void setActiveLayer(Layer layer, boolean setEditLayer) {
         if (layer != null && !layers.contains(layer))
             throw new IllegalArgumentException(tr("Layer ''{0}'' must be in list of layers", layer.toString()));
@@ -624,5 +633,7 @@
         Layer old = activeLayer;
         activeLayer = layer;
-        setEditLayer();
+        if (setEditLayer) {
+            setEditLayer(layers);
+        }
         fireActiveLayerChanged(old, layer);
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2859)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2860)
@@ -736,8 +736,5 @@
 
     public void dataChanged(DataChangedEvent event) {
-        Layer l = Main.main.getEditLayer();
-        if (l != null) {
-            initFromLayer(l);
-        }
+        initFromLayer(Main.main.getEditLayer());
     }
 
