Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 1895)
@@ -43,4 +43,5 @@
 import org.openstreetmap.josm.gui.OptionPaneUtil;
 import org.openstreetmap.josm.gui.SplashScreen;
+import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -216,4 +217,8 @@
             mapFrame.setVisible(true);
             mapFrame.setVisibleDialogs();
+            // bootstrapping problem: make sure the layer list dialog is going to
+            // listen to change events of the very first layer
+            //
+            layer.addPropertyChangeListener(LayerListDialog.getInstance().getModel());
         }
         map.mapView.addLayer(layer);
Index: /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 1895)
@@ -135,5 +135,5 @@
                     Main.map != null
                     && Main.map.mapView != null
-                    && Main.map.mapView.getAllLayers().size() > 0
+                    && Main.map.mapView.hasLayers()
             );
         }
Index: /trunk/src/org/openstreetmap/josm/actions/ZoomInAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ZoomInAction.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/actions/ZoomInAction.java	(revision 1895)
@@ -8,5 +8,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -28,5 +27,5 @@
                 Main.map != null
                 && Main.map.mapView != null
-                && Main.map.mapView.getAllLayers().size() > 0
+                && Main.map.mapView.hasLayers()
         );
     }
Index: /trunk/src/org/openstreetmap/josm/actions/ZoomOutAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ZoomOutAction.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/actions/ZoomOutAction.java	(revision 1895)
@@ -27,5 +27,5 @@
                 Main.map != null
                 && Main.map.mapView != null
-                && Main.map.mapView.getAllLayers().size() > 0
+                && Main.map.mapView.hasLayers()
         );
     }
Index: /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 1895)
@@ -95,5 +95,5 @@
             if (Main.map == null) return null;
             if (Main.map.mapView == null) return null;
-            Collection<Layer> layers = Main.map.mapView.getAllLayers();
+            Collection<Layer> layers = Main.map.mapView.getAllLayersAsList();
             for (Layer layer : layers) {
                 if (layer instanceof OsmDataLayer)
Index: /trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 1895)
@@ -22,4 +22,5 @@
 import java.util.Enumeration;
 import java.util.LinkedList;
+import java.util.List;
 
 import javax.swing.AbstractButton;
@@ -209,4 +210,10 @@
     }
 
+    protected void fireActiveLayerChanged(Layer oldLayer, Layer newLayer) {
+        for (Layer.LayerChangeListener l : Layer.listeners) {
+            l.activeLayerChange(oldLayer, newLayer);
+        }
+    }
+
     /**
      * Remove the layer from the mapview. If the layer was in the list before,
@@ -214,9 +221,10 @@
      */
     public void removeLayer(Layer layer) {
+        boolean deletedLayerWasActiveLayer = false;
+
         if (layer == activeLayer) {
-            for (Layer.LayerChangeListener l : Layer.listeners) {
-                l.activeLayerChange(layer, null);
-            }
             activeLayer = null;
+            deletedLayerWasActiveLayer = true;
+            fireActiveLayerChanged(layer, null);
         }
         if (layers.remove(layer)) {
@@ -228,4 +236,13 @@
         layer.destroy();
         AudioPlayer.reset();
+        if (layer instanceof OsmDataLayer && deletedLayerWasActiveLayer) {
+            for (Layer l : layers) {
+                if (l instanceof OsmDataLayer) {
+                    activeLayer = l;
+                    fireActiveLayerChanged(null, activeLayer);
+                }
+            }
+        }
+        repaint();
     }
 
@@ -368,4 +385,29 @@
     public Collection<Layer> getAllLayers() {
         return Collections.unmodifiableCollection(layers);
+    }
+
+    /**
+     * @return An unmodifiable ordered list of all layers
+     */
+    public List<Layer> getAllLayersAsList() {
+        return Collections.unmodifiableList(layers);
+    }
+
+    /**
+     * Replies the number of layers managed by this mav view
+     * 
+     * @return the number of layers managed by this mav view
+     */
+    public int getNumLayers() {
+        return layers.size();
+    }
+
+    /**
+     * Replies true if there is at least one layer in this map view
+     * 
+     * @return true if there is at least one layer in this map view
+     */
+    public boolean hasLayers() {
+        return getNumLayers() > 0;
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/OptionPaneUtil.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/OptionPaneUtil.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/gui/OptionPaneUtil.java	(revision 1895)
@@ -10,5 +10,4 @@
 import javax.swing.JDialog;
 import javax.swing.JOptionPane;
-import javax.swing.JRootPane;
 import javax.swing.UIManager;
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 1895)
@@ -15,8 +15,8 @@
 import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Logger;
 
 import javax.swing.AbstractAction;
@@ -32,4 +32,5 @@
 import javax.swing.ListModel;
 import javax.swing.ListSelectionModel;
+import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
 import javax.swing.event.ListDataEvent;
@@ -59,4 +60,5 @@
  */
 public class LayerListDialog extends ToggleDialog {
+    static private final Logger logger = Logger.getLogger(LayerListDialog.class.getName());
 
     /** the unique instance of the dialog */
@@ -112,4 +114,5 @@
         ActivateLayerAction activateLayerAction = new ActivateLayerAction();
         adaptTo(activateLayerAction, selectionModel);
+        adaptToLayerChanges(activateLayerAction);
         buttonPanel.add(new SideButton(activateLayerAction, "activate"));
 
@@ -159,5 +162,5 @@
         //
         final MapView mapView = mapFrame.mapView;
-        model.populate(mapView.getAllLayers());
+        model.populate();
         model.setSelectedLayer(mapView.getActiveLayer());
         model.addLayerListModelListener(
@@ -166,4 +169,8 @@
                         layerList.ensureIndexIsVisible(index);
                     }
+
+                    public void refresh() {
+                        layerList.repaint();
+                    }
                 }
         );
@@ -208,8 +215,34 @@
     }
 
+    protected void adaptToLayerChanges(final IEnabledStateUpdating listener) {
+        Layer.listeners.add(
+                new LayerChangeListener() {
+                    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+                        listener.updateEnabledState();
+                    }
+                    public void layerAdded(Layer newLayer) {
+                        listener.updateEnabledState();
+                    }
+                    public void layerRemoved(Layer oldLayer) {
+                        listener.updateEnabledState();
+                    }
+                }
+        );
+    }
+
+
+    private enum DeleteDecision {
+        deleteCurrent,
+        dontDeleteCurrent,
+        deleteAll,
+        cancel
+    }
+
     /**
      * The action to delete the currently selected layer
      */
     public final  class DeleteLayerAction extends AbstractAction implements IEnabledStateUpdating {
+
+
 
         private  Layer layer;
@@ -256,5 +289,5 @@
                     "delete_layer",
                     Main.parent,
-                    tr("Do you really want to delete the whole layer ''{0}''?", layer.getName()),
+                    tr("Do you really want to delete layer ''{0}''?", layer.getName()),
                     tr("Confirmation"),
                     JOptionPane.YES_NO_OPTION,
@@ -263,5 +296,36 @@
         }
 
-        public void deleteLayer(Layer layer) {
+        protected DeleteDecision confirmDeleteMultipleLayer(Layer layer, int idx, int numLayers) {
+            String options[] = new String[] {
+                    tr("Yes"),
+                    tr("No"),
+                    tr("Delete all"),
+                    tr("Cancel")
+            };
+            int ret = ConditionalOptionPaneUtil.showOptionDialog(
+                    "delete_layer",
+                    Main.parent,
+                    tr("Do you really want to delete layer ''{0}''?", layer.getName()),
+                    tr("Deleting layer {0} of {1}", idx+1, numLayers),
+                    JOptionPane.DEFAULT_OPTION,
+                    JOptionPane.QUESTION_MESSAGE,
+                    options,
+                    options[0]
+            );
+            switch(ret) {
+            case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION: return DeleteDecision.deleteAll;
+            case JOptionPane.CLOSED_OPTION: return DeleteDecision.cancel;
+            case 0: return DeleteDecision.deleteCurrent;
+            case 1: return DeleteDecision.dontDeleteCurrent;
+            case 2: return DeleteDecision.deleteAll;
+            case 3: return DeleteDecision.cancel;
+            default:
+                // shouldn't happen. This is the safest option.
+                return DeleteDecision.cancel;
+            }
+        }
+
+
+        public void deleteSingleLayer(Layer layer) {
             if (layer == null)
                 return;
@@ -282,12 +346,39 @@
         }
 
+        public void deleteMultipleLayers(List<Layer> layers) {
+            boolean doAskConfirmation = true;
+            for (int i=0; i < layers.size(); i++) {
+                Layer layer = layers.get(i);
+                if (layer instanceof OsmDataLayer) {
+                    OsmDataLayer dataLayer = (OsmDataLayer)layer;
+                    if (dataLayer.isModified() && ! confirmSkipSaving(dataLayer)) {
+                        continue;
+                    }
+                }
+                if (doAskConfirmation) {
+                    DeleteDecision decision = confirmDeleteMultipleLayer(layer, i, layers.size());
+                    switch(decision) {
+                    case deleteCurrent: /* do nothing */ break;
+                    case deleteAll: doAskConfirmation = false; break;
+                    case dontDeleteCurrent: continue;
+                    case cancel: return;
+                    }
+                }
+                // model and view are going to be updated via LayerChangeListener
+                //
+                Main.main.removeLayer(layer);
+            }
+        }
+
         public void actionPerformed(ActionEvent e) {
             if (this.layer == null) {
                 List<Layer> selectedLayers = getModel().getSelectedLayers();
-                for (Layer layer: selectedLayers) {
-                    deleteLayer(layer);
+                if (selectedLayers.size() == 1) {
+                    deleteSingleLayer(selectedLayers.get(0));
+                } else {
+                    deleteMultipleLayers(selectedLayers);
                 }
             } else {
-                deleteLayer(this.layer);
+                deleteSingleLayer(this.layer);
             }
         }
@@ -566,4 +657,5 @@
     public interface LayerListModelListener {
         public void makeVisible(int index, Layer layer);
+        public void refresh();
     }
 
@@ -581,10 +673,9 @@
     public class LayerListModel extends DefaultListModel implements LayerChangeListener, PropertyChangeListener{
 
-        private ArrayList<Layer> layers;
+        //private ArrayList<Layer> layers;
         private DefaultListSelectionModel selectionModel;
         private CopyOnWriteArrayList<LayerListModelListener> listeners;
 
         private LayerListModel(DefaultListSelectionModel selectionModel) {
-            layers = new ArrayList<Layer>();
             this.selectionModel = selectionModel;
             listeners = new CopyOnWriteArrayList<LayerListModelListener>();
@@ -613,17 +704,26 @@
         }
 
-        public void populate(Collection<Layer> layers) {
-            if (layers == null)
+        protected void fireRefresh() {
+            for (LayerListModelListener listener : listeners) {
+                listener.refresh();
+            }
+        }
+
+        public void populate() {
+            if (getLayers() != null) {
+                for (Layer layer: getLayers()) {
+                    // make sure the model is registered exactly once
+                    //
+                    layer.removePropertyChangeListener(this);
+                    layer.addPropertyChangeListener(this);
+                }
+            }
+            fireContentsChanged(this, 0, getSize());
+        }
+
+        public void setSelectedLayer(Layer layer) {
+            if (layer == null || getLayers() == null)
                 return;
-            this.layers.clear();
-            this.layers.addAll(layers);
-            for (Layer layer: this.layers) {
-                layer.addPropertyChangeListener(this);
-            }
-            fireContentsChanged(this, 0, getSize());
-        }
-
-        public void setSelectedLayer(Layer layer) {
-            int idx = layers.indexOf(layer);
+            int idx = getLayers().indexOf(layer);
             if (idx >= 0) {
                 selectionModel.setSelectionInterval(idx, idx);
@@ -635,7 +735,8 @@
         public List<Layer> getSelectedLayers() {
             ArrayList<Layer> selected = new ArrayList<Layer>();
-            for (int i=0; i<layers.size(); i++) {
+            if (getLayers() == null) return selected;
+            for (int i=0; i<getLayers().size(); i++) {
                 if (selectionModel.isSelectedIndex(i)) {
-                    selected.add(layers.get(i));
+                    selected.add(getLayers().get(i));
                 }
             }
@@ -645,5 +746,6 @@
         public List<Integer> getSelectedRows() {
             ArrayList<Integer> selected = new ArrayList<Integer>();
-            for (int i=0; i<layers.size();i++) {
+            if (getLayers() == null) return selected;
+            for (int i=0; i<getLayers().size();i++) {
                 if (selectionModel.isSelectedIndex(i)) {
                     selected.add(i);
@@ -653,30 +755,13 @@
         }
 
-        public void removeLayer(Layer layer) {
+        protected void removeLayer(Layer layer) {
             if (layer == null)
                 return;
-            List<Integer> selectedRows = getSelectedRows();
-            int deletedRow = layers.indexOf(layer);
-            if (deletedRow < 0)
-                // layer not found in the list of layers
-                return;
-            layers.remove(layer);
-            fireContentsChanged(this, 0,getSize());
-            for (int row: selectedRows) {
-                if (row < deletedRow) {
-                    selectionModel.addSelectionInterval(row, row);
-                } else if (row == deletedRow){
-                    // do nothing
-                } else {
-                    selectionModel.addSelectionInterval(row-1, row-1);
-                }
-            }
+            fireRefresh();
             ensureSelectedIsVisible();
         }
 
-        public void addLayer(Layer layer) {
+        protected void addLayer(Layer layer) {
             if (layer == null) return;
-            if (layers.contains(layer)) return;
-            layers.add(layer);
             layer.addPropertyChangeListener(this);
             fireContentsChanged(this, 0, getSize());
@@ -685,5 +770,5 @@
         public Layer getFirstLayer() {
             if (getSize() == 0) return null;
-            return layers.get(0);
+            return getLayers().get(0);
         }
 
@@ -691,5 +776,5 @@
             if (index < 0 || index >= getSize())
                 return null;
-            return layers.get(index);
+            return getLayers().get(index);
         }
 
@@ -703,8 +788,7 @@
             List<Integer> sel = getSelectedRows();
             for (int row: sel) {
-                Layer l1 = layers.get(row);
-                Layer l2 = layers.get(row-1);
-                layers.set(row, l2);
-                layers.set(row-1,l1);
+                Layer l1 = getLayers().get(row);
+                Layer l2 = getLayers().get(row-1);
+                Main.map.mapView.moveLayer(l2,row);
                 Main.map.mapView.moveLayer(l1, row-1);
             }
@@ -719,5 +803,5 @@
         public boolean canMoveDown() {
             List<Integer> sel = getSelectedRows();
-            return !sel.isEmpty() && sel.get(sel.size()-1) < layers.size()-1;
+            return !sel.isEmpty() && sel.get(sel.size()-1) < getLayers().size()-1;
         }
 
@@ -727,9 +811,8 @@
             Collections.reverse(sel);
             for (int row: sel) {
-                Layer l1 = layers.get(row);
-                Layer l2 = layers.get(row+1);
-                layers.set(row, l2);
-                layers.set(row+1,l1);
+                Layer l1 = getLayers().get(row);
+                Layer l2 = getLayers().get(row+1);
                 Main.map.mapView.moveLayer(l1, row+1);
+                Main.map.mapView.moveLayer(l2, row);
             }
             fireContentsChanged(this, 0, getSize());
@@ -744,6 +827,7 @@
             int index = selectionModel.getMinSelectionIndex();
             if (index <0 )return;
-            if (index >= layers.size()) return;
-            Layer layer = layers.get(index);
+            if (getLayers() == null) return;
+            if (index >= getLayers().size()) return;
+            Layer layer = getLayers().get(index);
             fireMakeVisible(index, layer);
         }
@@ -753,5 +837,5 @@
             if (layer == null)
                 return targets;
-            for(Layer target: layers) {
+            for(Layer target: getLayers()) {
                 if (layer == target) {
                     continue;
@@ -765,10 +849,15 @@
 
         public void activateLayer(Layer layer) {
-            layers.remove(layer);
-            layers.add(0,layer);
+            Main.map.mapView.moveLayer(layer,0);
             Main.map.mapView.setActiveLayer(layer);
             layer.setVisible(true);
             selectionModel.setSelectionInterval(0,0);
             ensureSelectedIsVisible();
+        }
+
+        protected List<Layer> getLayers() {
+            if (Main.map == null) return null;
+            if (Main.map.mapView == null) return null;
+            return Main.map.mapView.getAllLayersAsList();
         }
 
@@ -778,9 +867,11 @@
         @Override
         public Object getElementAt(int index) {
-            return layers.get(index);
+            return getLayers().get(index);
         }
 
         @Override
         public int getSize() {
+            List<Layer> layers = getLayers();
+            if (layers == null) return 0;
             return layers.size();
         }
@@ -791,5 +882,5 @@
         public void activeLayerChange(Layer oldLayer, Layer newLayer) {
             if (oldLayer != null) {
-                int idx = layers.indexOf(oldLayer);
+                int idx = getLayers().indexOf(oldLayer);
                 if (idx >= 0) {
                     fireContentsChanged(this, idx,idx);
@@ -798,5 +889,5 @@
 
             if (newLayer != null) {
-                int idx = layers.indexOf(newLayer);
+                int idx = getLayers().indexOf(newLayer);
                 if (idx >= 0) {
                     fireContentsChanged(this, idx,idx);
@@ -809,7 +900,14 @@
         }
 
-        public void layerRemoved(Layer oldLayer) {
-            removeLayer(oldLayer);
-        }
+        public void layerRemoved(final Layer oldLayer) {
+            SwingUtilities.invokeLater(
+                    new Runnable() {
+                        public void run() {
+                            removeLayer(oldLayer);
+                        }
+                    }
+            );
+        }
+
 
         /* ------------------------------------------------------------------------------ */
@@ -819,7 +917,7 @@
             if (evt.getSource() instanceof Layer) {
                 Layer layer = (Layer)evt.getSource();
-                int idx = layers.indexOf(layer);
+                final int idx = getLayers().indexOf(layer);
                 if (idx < 0) return;
-                fireContentsChanged(this, idx, idx);
+                fireRefresh();
             }
         }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 1894)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 1895)
@@ -11,4 +11,5 @@
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.logging.Logger;
 
 import javax.swing.AbstractAction;
@@ -46,4 +47,5 @@
  */
 public class RelationListDialog extends ToggleDialog implements LayerChangeListener, DataChangeListener {
+    private static final Logger logger = Logger.getLogger(RelationListDialog.class.getName());
     static private final PrimitiveNameFormatter NAME_FORMATTER = new PrimitiveNameFormatter();
 
