Index: /trunk/src/org/openstreetmap/josm/data/osm/event/DataChangedEvent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/DataChangedEvent.java	(revision 2651)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/DataChangedEvent.java	(revision 2652)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.data.osm.event;
 
+import java.util.Collections;
 import java.util.List;
 
@@ -21,5 +22,8 @@
     @Override
     public List<OsmPrimitive> getPrimitives() {
-        return dataSet.allPrimitives();
+        if (dataSet == null)
+            return Collections.emptyList();
+        else
+            return dataSet.allPrimitives();
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 2651)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 2652)
@@ -9,9 +9,6 @@
 import javax.swing.SwingUtilities;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
@@ -26,5 +23,5 @@
  *
  */
-public class DatasetEventManager implements LayerChangeListener, Listener {
+public class DatasetEventManager implements MapView.EditLayerChangeListener, Listener {
 
     private static final DatasetEventManager instance = new DatasetEventManager();
@@ -40,5 +37,5 @@
 
     public DatasetEventManager() {
-        MapView.addLayerChangeListener(this);
+        MapView.addEditLayerChangeListener(this);
     }
 
@@ -62,20 +59,16 @@
     }
 
-    /* --------------------------------------------------------------------------- */
-    /* interface LayerChangeListener                                               */
-    /* --------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer a, Layer b) {
-        if (a != null && a instanceof OsmDataLayer) {
-            ((OsmDataLayer)a).data.removeDataSetListener(myListener);
+    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        if (oldLayer != null) {
+            oldLayer.data.removeDataSetListener(myListener);
         }
-        if (b != null && b instanceof OsmDataLayer) {
-            ((OsmDataLayer)b).data.addDataSetListener(myListener);
-        }
-        if (Main.main.getEditLayer() != null) {
-            processDatasetEvent(new DataChangedEvent(Main.main.getEditLayer().data));
+
+        if (newLayer != null) {
+            newLayer.data.addDataSetListener(myListener);
+            processDatasetEvent(new DataChangedEvent(newLayer.data));
+        } else {
+            processDatasetEvent(new DataChangedEvent(null));
         }
     }
-    public void layerRemoved(Layer a) {/* irrelevant in this context */}
-    public void layerAdded(Layer a) {/* irrelevant in this context */}
 
     public void processDatasetEvent(AbstractDatasetChangedEvent event) {
Index: /trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2651)
+++ /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2652)
@@ -76,8 +76,13 @@
     }
 
+    public interface EditLayerChangeListener {
+        void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer);
+    }
+
     /**
      * the layer listeners
      */
     private static final Collection<MapView.LayerChangeListener> layerChangeListeners = new CopyOnWriteArrayList<MapView.LayerChangeListener>();
+    private static final Collection<EditLayerChangeListener> editLayerChangeListeners = new CopyOnWriteArrayList<EditLayerChangeListener>();
 
     /**
@@ -92,4 +97,12 @@
     }
 
+    public static void removeEditLayerChangeListener(EditLayerChangeListener listener) {
+        if (listener != null && editLayerChangeListeners.contains(listener)) {
+            editLayerChangeListeners.remove(listener);
+        }
+    }
+
+
+
     /**
      * Adds a layer change listener
@@ -103,4 +116,10 @@
     }
 
+    public static void addEditLayerChangeListener(EditLayerChangeListener listener) {
+        if (listener != null && ! layerChangeListeners.contains(listener)) {
+            editLayerChangeListeners.add(listener);
+        }
+    }
+
     protected static void fireActiveLayerChanged(Layer oldLayer, Layer newLayer) {
         for (LayerChangeListener l : layerChangeListeners) {
@@ -121,4 +140,10 @@
     }
 
+    protected static void fireEditLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        for (EditLayerChangeListener l : editLayerChangeListeners) {
+            l.editLayerChanged(oldLayer, newLayer);
+        }
+    }
+
     /**
      * A list of all layers currently loaded.
@@ -134,4 +159,6 @@
      */
     private Layer activeLayer;
+
+    private OsmDataLayer editLayer;
 
     /**
@@ -255,7 +282,8 @@
     @Override
     protected DataSet getCurrentDataSet() {
-        if(activeLayer != null && activeLayer instanceof OsmDataLayer)
-            return ((OsmDataLayer)activeLayer).data;
-        return null;
+        if (editLayer != null)
+            return editLayer.data;
+        else
+            return null;
     }
 
@@ -266,5 +294,5 @@
      */
     public boolean isActiveLayerDrawable() {
-        return activeLayer != null && activeLayer instanceof OsmDataLayer;
+        return editLayer != null;
     }
 
@@ -275,5 +303,5 @@
      */
     public boolean isActiveLayerVisible() {
-        return isActiveLayerDrawable() && activeLayer.isVisible();
+        return isActiveLayerDrawable() && editLayer.isVisible();
     }
 
@@ -290,15 +318,20 @@
      * @return the next active data layer
      */
-    protected Layer determineNextActiveLayer() {
-        if (layers.isEmpty()) return null;
-        // if possible, activate the first data layer
-        //
-        List<OsmDataLayer> dataLayers = getLayersOfType(OsmDataLayer.class);
-        if (!dataLayers.isEmpty())
-            return dataLayers.get(0);
-
-        // else the first layer of any type
-        //
-        return layers.get(0);
+    protected Layer determineNextActiveLayer(Layer ignoredLayer) {
+        // First look for data layer
+        for (Layer layer:layers) {
+            if (layer instanceof OsmDataLayer && layer != ignoredLayer)
+                return layer;
+        }
+
+        // Then any layer
+        for (Layer layer:layers) {
+            if (layer != ignoredLayer)
+                return layer;
+        }
+
+        // and then give up
+        return null;
+
     }
 
@@ -308,10 +341,6 @@
      */
     public void removeLayer(Layer layer) {
-        boolean deletedLayerWasActiveLayer = false;
-
         if (layer == activeLayer) {
-            activeLayer = null;
-            deletedLayerWasActiveLayer = true;
-            fireActiveLayerChanged(layer, null);
+            setActiveLayer(determineNextActiveLayer(activeLayer));
         }
         if (layers.remove(layer)) {
@@ -321,11 +350,4 @@
         layer.destroy();
         AudioPlayer.reset();
-        if (deletedLayerWasActiveLayer) {
-            Layer l = determineNextActiveLayer();
-            if (l != null) {
-                activeLayer = l;
-                fireActiveLayerChanged(null, l);
-            }
-        }
         repaint();
     }
@@ -362,4 +384,5 @@
             layers.add(pos, layer);
         }
+        setEditLayer();
         AudioPlayer.reset();
         repaint();
@@ -561,4 +584,35 @@
     }
 
+    private void setEditLayer() {
+        OsmDataLayer newEditLayer = null;
+        OsmDataLayer oldEditLayer = editLayer;
+
+        // Find new edit layer
+        if (activeLayer != editLayer) {
+            if (activeLayer instanceof OsmDataLayer) {
+                newEditLayer = (OsmDataLayer) activeLayer;
+            } else {
+                for (Layer layer:layers) {
+                    if (layer instanceof OsmDataLayer) {
+                        newEditLayer = (OsmDataLayer) layer;
+                        break;
+                    }
+                }
+            }
+        }
+
+        // Set new edit layer
+        if (newEditLayer != editLayer) {
+            if (newEditLayer == null) {
+                getCurrentDataSet().setSelected();
+            }
+
+            editLayer = newEditLayer;
+            fireEditLayerChanged(oldEditLayer, newEditLayer);
+            refreshTitle();
+        }
+
+    }
+
     /**
      * Sets the active layer to <code>layer</code>. If <code>layer</code> is an instance
@@ -571,17 +625,13 @@
         if (!layers.contains(layer))
             throw new IllegalArgumentException(tr("Layer ''{0}'' must be in list of layers", layer.toString()));
-        if (! (layer instanceof OsmDataLayer)) {
-            if (getCurrentDataSet() != null) {
-                getCurrentDataSet().setSelected();
-            }
-        }
+
+        if (layer == activeLayer)
+            return;
+
         Layer old = activeLayer;
         activeLayer = layer;
-        if (old != layer) {
-            fireActiveLayerChanged(old, layer);
-        }
-        if (layer instanceof OsmDataLayer) {
-            refreshTitle((OsmDataLayer)layer);
-        }
+        fireActiveLayerChanged(old, layer);
+
+        setEditLayer();
 
         /* This only makes the buttons look disabled. Disabling the actions as well requires
@@ -612,14 +662,5 @@
      */
     public OsmDataLayer getEditLayer() {
-        if (activeLayer instanceof OsmDataLayer)
-            return (OsmDataLayer)activeLayer;
-
-        // the first OsmDataLayer is the edit layer
-        //
-        for (Layer layer : layers) {
-            if (layer instanceof OsmDataLayer)
-                return (OsmDataLayer)layer;
-        }
-        return null;
+        return editLayer;
     }
 
@@ -678,11 +719,11 @@
             OsmDataLayer layer = (OsmDataLayer)evt.getSource();
             if (layer == getEditLayer()) {
-                refreshTitle(layer);
-            }
-        }
-    }
-
-    protected void refreshTitle(OsmDataLayer layer) {
-        boolean dirty = layer.requiresSaveToFile() || layer.requiresUploadToServer();
+                refreshTitle();
+            }
+        }
+    }
+
+    protected void refreshTitle() {
+        boolean dirty = editLayer != null && (editLayer.requiresSaveToFile() || editLayer.requiresUploadToServer());
         if (dirty) {
             JOptionPane.getFrameForComponent(Main.parent).setTitle("* " + tr("Java OpenStreetMap Editor"));
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 2651)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 2652)
@@ -6,5 +6,4 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.DataChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
