Index: trunk/src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/actions/JosmAction.java	(revision 2621)
@@ -14,7 +14,7 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -93,7 +93,5 @@
             Main.contentPane.getActionMap().remove(sc.getKeyStroke());
         }
-        if (Layer.listeners != null) {
-            Layer.listeners.remove(layerChangeAdapter);
-        }
+        MapView.removeLayerChangeListener(layerChangeAdapter);
         if (DataSet.selListeners != null) {
             DataSet.selListeners.remove(selectionChangeAdapter);
@@ -146,5 +144,5 @@
         layerChangeAdapter = new LayerChangeAdapter();
         selectionChangeAdapter = new SelectionChangeAdapter();
-        Layer.listeners.add(layerChangeAdapter);
+        MapView.addLayerChangeListener(layerChangeAdapter);
         DataSet.selListeners.add(selectionChangeAdapter);
         initEnabledState();
@@ -195,5 +193,5 @@
      *
      */
-    private class LayerChangeAdapter implements LayerChangeListener {
+    private class LayerChangeAdapter implements MapView.LayerChangeListener {
         public void activeLayerChange(Layer oldLayer, Layer newLayer) {
             updateEnabledState();
Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 2621)
@@ -4,5 +4,4 @@
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.List;
 import java.util.LinkedList;
 import java.util.Stack;
@@ -10,12 +9,11 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
 
-public class UndoRedoHandler implements LayerChangeListener {
+public class UndoRedoHandler implements MapView.LayerChangeListener {
 
     /**
@@ -31,5 +29,5 @@
 
     public UndoRedoHandler() {
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 2621)
@@ -7,6 +7,4 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 
@@ -33,10 +31,11 @@
 import org.openstreetmap.josm.actions.DuplicateAction;
 import org.openstreetmap.josm.actions.ExitAction;
+import org.openstreetmap.josm.actions.FullscreenToggleAction;
 import org.openstreetmap.josm.actions.GpxExportAction;
 import org.openstreetmap.josm.actions.HelpAction;
 import org.openstreetmap.josm.actions.HistoryInfoAction;
 import org.openstreetmap.josm.actions.InfoAction;
+import org.openstreetmap.josm.actions.JoinAreasAction;
 import org.openstreetmap.josm.actions.JoinNodeWayAction;
-import org.openstreetmap.josm.actions.JoinAreasAction;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.MergeLayerAction;
@@ -68,5 +67,4 @@
 import org.openstreetmap.josm.actions.UploadSelectionAction;
 import org.openstreetmap.josm.actions.WireframeToggleAction;
-import org.openstreetmap.josm.actions.FullscreenToggleAction;
 import org.openstreetmap.josm.actions.ZoomInAction;
 import org.openstreetmap.josm.actions.ZoomOutAction;
@@ -80,5 +78,4 @@
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Shortcut;
 /**
@@ -309,8 +306,8 @@
     }
 
-    class PresetsMenuEnabler implements LayerChangeListener {
+    class PresetsMenuEnabler implements MapView.LayerChangeListener {
         private JMenu presetsMenu;
         public PresetsMenuEnabler(JMenu presetsMenu) {
-            Layer.listeners.add(this);
+            MapView.addLayerChangeListener(this);
             this.presetsMenu = presetsMenu;
         }
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 2621)
@@ -26,4 +26,5 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.AbstractButton;
@@ -64,4 +65,59 @@
  */
 public class MapView extends NavigatableComponent implements PropertyChangeListener {
+
+    /**
+     * Interface to notify listeners of the change of the active layer.
+     * @author imi
+     */
+    public interface LayerChangeListener {
+        void activeLayerChange(Layer oldLayer, Layer newLayer);
+        void layerAdded(Layer newLayer);
+        void layerRemoved(Layer oldLayer);
+    }
+
+    /**
+     * the layer listeners
+     */
+    private static final Collection<MapView.LayerChangeListener> layerChangeListeners = new CopyOnWriteArrayList<MapView.LayerChangeListener>();
+
+    /**
+     * Removes a layer change listener
+     * 
+     * @param listener the listener. Ignored if null or already registered.
+     */
+    public static void removeLayerChangeListener(MapView.LayerChangeListener listener) {
+        if (listener != null && layerChangeListeners.contains(listener)) {
+            layerChangeListeners.remove(listener);
+        }
+    }
+
+    /**
+     * Adds a layer change listener
+     * 
+     * @param listener the listener. Ignored if null or already registered.
+     */
+    public static void addLayerChangeListener(MapView.LayerChangeListener listener) {
+        if (listener != null && ! layerChangeListeners.contains(listener)) {
+            layerChangeListeners.add(listener);
+        }
+    }
+
+    protected static void fireActiveLayerChanged(Layer oldLayer, Layer newLayer) {
+        for (LayerChangeListener l : layerChangeListeners) {
+            l.activeLayerChange(oldLayer, newLayer);
+        }
+    }
+
+    protected static void fireLayerAdded(Layer newLayer) {
+        for (MapView.LayerChangeListener l : MapView.layerChangeListeners) {
+            l.layerAdded(newLayer);
+        }
+    }
+
+    protected static void fireLayerRemoved(Layer layer) {
+        for (MapView.LayerChangeListener l : MapView.layerChangeListeners) {
+            l.layerRemoved(layer);
+        }
+    }
 
     /**
@@ -187,15 +243,10 @@
             layers.add(0, layer);
         }
-
-        for (Layer.LayerChangeListener l : Layer.listeners) {
-            l.layerAdded(layer);
-        }
+        fireLayerAdded(layer);
         if (layer instanceof OsmDataLayer || activeLayer == null) {
             // autoselect the new layer
             Layer old = activeLayer;
             setActiveLayer(layer);
-            for (Layer.LayerChangeListener l : Layer.listeners) {
-                l.activeLayerChange(old, layer);
-            }
+            fireActiveLayerChanged(old, layer);
         }
         layer.addPropertyChangeListener(this);
@@ -229,9 +280,4 @@
     }
 
-    protected void fireActiveLayerChanged(Layer oldLayer, Layer newLayer) {
-        for (Layer.LayerChangeListener l : Layer.listeners) {
-            l.activeLayerChange(oldLayer, newLayer);
-        }
-    }
 
     /**
@@ -272,7 +318,5 @@
         }
         if (layers.remove(layer)) {
-            for (Layer.LayerChangeListener l : Layer.listeners) {
-                l.layerRemoved(layer);
-            }
+            fireLayerRemoved(layer);
         }
         layer.removePropertyChangeListener(this);
@@ -290,4 +334,5 @@
 
     private boolean virtualNodesEnabled = false;
+
     public void setVirtualNodesEnabled(boolean enabled) {
         if(virtualNodesEnabled != enabled) {
@@ -536,7 +581,5 @@
         activeLayer = layer;
         if (old != layer) {
-            for (Layer.LayerChangeListener l : Layer.listeners) {
-                l.activeLayerChange(old, layer);
-            }
+            fireActiveLayerChanged(old, layer);
         }
         if (layer instanceof OsmDataLayer) {
@@ -650,3 +693,4 @@
         }
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 2621)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetInSelectionListModel;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetListCellRenderer;
@@ -43,5 +44,4 @@
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.io.CloseChangesetTask;
-import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OpenBrowser;
@@ -94,9 +94,9 @@
 
         ChangesetCache.getInstance().addChangesetCacheListener(inSelectionModel);
-        Layer.listeners.add(inSelectionModel);
+        MapView.addLayerChangeListener(inSelectionModel);
         DataSet.selListeners.add(inSelectionModel);
 
         ChangesetCache.getInstance().addChangesetCacheListener(inActiveDataLayerModel);
-        Layer.listeners.add(inActiveDataLayerModel);
+        MapView.addLayerChangeListener(inActiveDataLayerModel);
 
         DblClickHandler dblClickHandler = new DblClickHandler();
@@ -112,7 +112,7 @@
     public void tearDown() {
         ChangesetCache.getInstance().removeChangesetCacheListener(inActiveDataLayerModel);
-        Layer.listeners.remove(inSelectionModel);
+        MapView.removeLayerChangeListener(inSelectionModel);
         DataSet.selListeners.remove(inSelectionModel);
-        Layer.listeners.remove(inActiveDataLayerModel);
+        MapView.removeLayerChangeListener(inActiveDataLayerModel);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 2621)
@@ -43,11 +43,11 @@
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -58,5 +58,5 @@
  *
  */
-public final class ConflictDialog extends ToggleDialog implements LayerChangeListener, IConflictListener, SelectionChangedListener{
+public final class ConflictDialog extends ToggleDialog implements MapView.LayerChangeListener, IConflictListener, SelectionChangedListener{
 
     static public Color getColor() {
@@ -122,6 +122,14 @@
         build();
         DataSet.selListeners.add(this);
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
         refreshView();
+    }
+
+
+
+    @Override
+    public void tearDown() {
+        MapView.removeLayerChangeListener(this);
+        DataSet.selListeners.remove(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 2621)
@@ -28,5 +28,4 @@
 import org.openstreetmap.josm.gui.conflict.pair.ConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.properties.OperationCancelledException;
-import org.openstreetmap.josm.gui.help.HelpBrowser;
 import org.openstreetmap.josm.gui.help.HelpBrowserProxy;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -231,9 +230,9 @@
                 );
                 switch(ret) {
-                    case JOptionPane.YES_OPTION:
-                        setVisible(false);
-                        break;
-                    default:
-                        return;
+                case JOptionPane.YES_OPTION:
+                    setVisible(false);
+                    break;
+                default:
+                    return;
                 }
             }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 2621)
@@ -4,38 +4,35 @@
 import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
 
 import javax.swing.JCheckBox;
 import javax.swing.JPanel;
-import javax.swing.JTable;
-import javax.swing.table.JTableHeader;
-import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.event.TableModelListener;
-import javax.swing.event.TableModelEvent;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.ListSelectionModel;
 import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
-
-import java.awt.Component;
-import java.awt.FlowLayout;
-import java.awt.BorderLayout;
-import java.awt.GridLayout;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ActionEvent;
-import java.awt.event.MouseEvent;
-
-import org.openstreetmap.josm.Main;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableCellRenderer;
+
+import org.openstreetmap.josm.actions.search.SearchAction;
+import org.openstreetmap.josm.data.osm.Filter;
+import org.openstreetmap.josm.data.osm.Filters;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.DataChangeListener;
+import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.data.osm.Filters;
-import org.openstreetmap.josm.data.osm.Filter;
 import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.actions.search.SearchAction;
 
 /**
@@ -43,5 +40,5 @@
  * @author Petr_Dlouhý
  */
-public class FilterDialog extends ToggleDialog implements DataChangeListener, LayerChangeListener, TableModelListener {
+public class FilterDialog extends ToggleDialog implements DataChangeListener, MapView.LayerChangeListener, TableModelListener {
     private JTable userTable;
     private Filters filters = new Filters();
@@ -54,9 +51,14 @@
 
     public FilterDialog(){
-       super(tr("Filter"), "filter", tr("Filter objects and hide/disable them."),
-               Shortcut.registerShortcut("subwindow:filter", tr("Toggle: {0}", tr("Filter")), KeyEvent.VK_F, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 162);
-
-       Layer.listeners.add(this);
-       build();
+        super(tr("Filter"), "filter", tr("Filter objects and hide/disable them."),
+                Shortcut.registerShortcut("subwindow:filter", tr("Toggle: {0}", tr("Filter")), KeyEvent.VK_F, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 162);
+
+        MapView.addLayerChangeListener(this);
+        build();
+    }
+
+    @Override
+    public void tearDown() {
+        MapView.removeLayerChangeListener(this);
     }
 
@@ -65,60 +67,60 @@
 
         addButton = new SideButton(marktr("Add"), "add", "SelectionList", tr("Add filter."),
-              new ActionListener(){
-                 public void actionPerformed(ActionEvent evt){
-                    Filter filter = (Filter)SearchAction.showSearchDialog(new Filter());
-                    if(filter != null){
-                       filters.addFilter(filter);
-                       filters.filter();
-                    }
-                 }
-              });
+                new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                Filter filter = (Filter)SearchAction.showSearchDialog(new Filter());
+                if(filter != null){
+                    filters.addFilter(filter);
+                    filters.filter();
+                }
+            }
+        });
         pnl.add(addButton);
 
         editButton = new SideButton(marktr("Edit"), "edit", "SelectionList", tr("Edit filter."),
-              new ActionListener(){
-                 public void actionPerformed(ActionEvent evt){
-                    int index = userTable.getSelectionModel().getMinSelectionIndex();
-                    if(index < 0) return;
-                    Filter f = filters.getFilter(index);
-                    Filter filter = (Filter)SearchAction.showSearchDialog(f);
-                    if(filter != null){
-                       filters.setFilter(index, filter);
-                       filters.filter();
-                    }
-                 }
-              });
+                new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                int index = userTable.getSelectionModel().getMinSelectionIndex();
+                if(index < 0) return;
+                Filter f = filters.getFilter(index);
+                Filter filter = (Filter)SearchAction.showSearchDialog(f);
+                if(filter != null){
+                    filters.setFilter(index, filter);
+                    filters.filter();
+                }
+            }
+        });
         pnl.add(editButton);
 
         deleteButton = new SideButton(marktr("Delete"), "delete", "SelectionList", tr("Delete filter."),
-              new ActionListener(){
-                 public void actionPerformed(ActionEvent evt){
-                    int index = userTable.getSelectionModel().getMinSelectionIndex();
-                    if(index < 0) return;
-                    filters.removeFilter(index);
-                 }
-              });
+                new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                int index = userTable.getSelectionModel().getMinSelectionIndex();
+                if(index < 0) return;
+                filters.removeFilter(index);
+            }
+        });
         pnl.add(deleteButton);
 
         upButton = new SideButton(marktr("Up"), "up", "SelectionList", tr("Move filter up."),
-              new ActionListener(){
-                 public void actionPerformed(ActionEvent evt){
-                    int index = userTable.getSelectionModel().getMinSelectionIndex();
-                    if(index < 0) return;
-                    filters.moveUpFilter(index);
-                    userTable.getSelectionModel().setSelectionInterval(index-1, index-1);
-                 }
-              });
+                new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                int index = userTable.getSelectionModel().getMinSelectionIndex();
+                if(index < 0) return;
+                filters.moveUpFilter(index);
+                userTable.getSelectionModel().setSelectionInterval(index-1, index-1);
+            }
+        });
         pnl.add(upButton);
 
         downButton = new SideButton(marktr("Down"), "down", "SelectionList", tr("Move filter down."),
-              new ActionListener(){
-                 public void actionPerformed(ActionEvent evt){
-                    int index = userTable.getSelectionModel().getMinSelectionIndex();
-                    if(index < 0) return;
-                    filters.moveDownFilter(index);
-                    userTable.getSelectionModel().setSelectionInterval(index+1, index+1);
-                 }
-              });
+                new ActionListener(){
+            public void actionPerformed(ActionEvent evt){
+                int index = userTable.getSelectionModel().getMinSelectionIndex();
+                if(index < 0) return;
+                filters.moveDownFilter(index);
+                userTable.getSelectionModel().setSelectionInterval(index+1, index+1);
+            }
+        });
         pnl.add(downButton);
         return pnl;
@@ -126,10 +128,10 @@
 
     protected String[] columnToolTips = {
-        tr("Enable filter"),
-        tr("Hide elements"),
-        null,
-        tr("Apply also for children"),
-        tr("Inverse filter"),
-        tr("Filter mode")
+            tr("Enable filter"),
+            tr("Hide elements"),
+            null,
+            tr("Apply also for children"),
+            tr("Inverse filter"),
+            tr("Filter mode")
     };
 
@@ -138,15 +140,17 @@
         pnl.setLayout(new BorderLayout());
         userTable = new JTable(filters){
+            @Override
             protected JTableHeader createDefaultTableHeader() {
                 return new JTableHeader(columnModel) {
-                   public String getToolTipText(MouseEvent e) {
-                       String tip = null;
-                       java.awt.Point p = e.getPoint();
-                       int index = columnModel.getColumnIndexAtX(p.x);
-                       int realIndex = columnModel.getColumn(index).getModelIndex();
-                       return columnToolTips[realIndex];
-                   }
-               };
-           }
+                    @Override
+                    public String getToolTipText(MouseEvent e) {
+                        String tip = null;
+                        java.awt.Point p = e.getPoint();
+                        int index = columnModel.getColumnIndexAtX(p.x);
+                        int realIndex = columnModel.getColumn(index).getModelIndex();
+                        return columnToolTips[realIndex];
+                    }
+                };
+            }
         };
 
@@ -192,33 +196,34 @@
     }
 
-   public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-      filters.filter();
-   }
-
-   public void dataChanged(OsmDataLayer l){
-      filters.filter();
-   }
-
-   class StringRenderer extends DefaultTableCellRenderer {
-      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
-         Filters model = (Filters)table.getModel();
-         Component cell = (Component)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
-         cell.setEnabled(model.isCellEnabled(row, column));
-         return cell;
-      }
-   }
-
-   class BooleanRenderer extends JCheckBox implements TableCellRenderer {
-      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
-         Filters model = (Filters)table.getModel();
-         setSelected((Boolean)value);
-         setEnabled(model.isCellEnabled(row, column));
-         setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
-         return this;
-      }
-   }
-
-   public void tableChanged(TableModelEvent e){
-      setTitle("Filter Hidden:" + filters.hiddenCount + " Disabled:" + filters.disabledCount);
-   }
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        filters.filter();
+    }
+
+    public void dataChanged(OsmDataLayer l){
+        filters.filter();
+    }
+
+    class StringRenderer extends DefaultTableCellRenderer {
+        @Override
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+            Filters model = (Filters)table.getModel();
+            Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+            cell.setEnabled(model.isCellEnabled(row, column));
+            return cell;
+        }
+    }
+
+    class BooleanRenderer extends JCheckBox implements TableCellRenderer {
+        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
+            Filters model = (Filters)table.getModel();
+            setSelected((Boolean)value);
+            setEnabled(model.isCellEnabled(row, column));
+            setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+            return this;
+        }
+    }
+
+    public void tableChanged(TableModelEvent e){
+        setTitle("Filter Hidden:" + filters.hiddenCount + " Disabled:" + filters.disabledCount);
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 2621)
@@ -1,3 +1,2 @@
-// License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.gui.dialogs;
 
@@ -44,8 +43,8 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.io.SaveLayersDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -95,4 +94,6 @@
     private LayerList layerList;
 
+    ActivateLayerAction activateLayerAction;
+
     protected JPanel createButtonPanel() {
         JPanel buttonPanel = new JPanel(new GridLayout(1, 5));
@@ -111,7 +112,7 @@
 
         // -- activate action
-        ActivateLayerAction activateLayerAction = new ActivateLayerAction();
+        activateLayerAction = new ActivateLayerAction();
         adaptTo(activateLayerAction, selectionModel);
-        adaptToLayerChanges(activateLayerAction);
+        MapView.addLayerChangeListener(activateLayerAction);
         buttonPanel.add(new SideButton(activateLayerAction, "activate"));
 
@@ -151,5 +152,5 @@
         selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         model = new LayerListModel(selectionModel);
-        Layer.listeners.add(model);
+        MapView.addLayerChangeListener(model);
 
         // create the list control
@@ -182,4 +183,10 @@
     }
 
+    @Override
+    public void tearDown() {
+        MapView.removeLayerChangeListener(model);
+        MapView.removeLayerChangeListener(activateLayerAction);
+    }
+
     public LayerListModel getModel() {
         return model;
@@ -232,33 +239,4 @@
                 }
         );
-    }
-    /**
-     * Wires <code>listener</code> to {@see MapView} in such a way, that
-     * <code>listener</code> receives a {@see IEnabledStateUpdating#updateEnabledState()}
-     * on every {@see LayerChangeListener}-event emitted by {@see MapView}.
-     *
-     * @param listener  the listener
-     */
-    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
     }
 
@@ -400,5 +378,5 @@
      */
 
-    public final class ActivateLayerAction extends AbstractAction implements IEnabledStateUpdating{
+    public final class ActivateLayerAction extends AbstractAction implements IEnabledStateUpdating, MapView.LayerChangeListener{
         private  Layer layer;
 
@@ -449,4 +427,14 @@
                 setEnabled(!isActiveLayer(layer));
             }
+        }
+
+        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+            updateEnabledState();
+        }
+        public void layerAdded(Layer newLayer) {
+            updateEnabledState();
+        }
+        public void layerRemoved(Layer oldLayer) {
+            updateEnabledState();
         }
     }
@@ -633,5 +621,5 @@
      * the properties {@see Layer#VISIBLE_PROP} and {@see Layer#NAME_PROP}.
      */
-    public class LayerListModel extends DefaultListModel implements LayerChangeListener, PropertyChangeListener{
+    public class LayerListModel extends DefaultListModel implements MapView.LayerChangeListener, PropertyChangeListener{
 
         /** manages list selection state*/
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 2621)
@@ -66,9 +66,10 @@
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.gui.preferences.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
@@ -95,5 +96,5 @@
  * @author imi
  */
-public class PropertiesDialog extends ToggleDialog implements SelectionChangedListener, LayerChangeListener {
+public class PropertiesDialog extends ToggleDialog implements SelectionChangedListener, MapView.LayerChangeListener {
     /**
      * Watches for double clicks and from editing or new property, depending on the
@@ -594,5 +595,10 @@
 
         DataSet.selListeners.add(this);
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
+    }
+
+    @Override
+    public void tearDown() {
+        MapView.removeLayerChangeListener(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2621)
@@ -41,6 +41,8 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
@@ -48,5 +50,4 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -60,5 +61,5 @@
  * objects are visible on the map and can be selected there. Relations are not.
  */
-public class RelationListDialog extends ToggleDialog implements LayerChangeListener, DataSetListener, DataChangeListener {
+public class RelationListDialog extends ToggleDialog implements MapView.LayerChangeListener, DataSetListener, DataChangeListener {
     //private static final Logger logger = Logger.getLogger(RelationListDialog.class.getName());
 
@@ -137,6 +138,6 @@
 
     @Override public void showNotify() {
-        Layer.listeners.add(this);
-        Layer.listeners.add(newAction);
+        MapView.addLayerChangeListener(this);
+        MapView.addLayerChangeListener(newAction);
         // Register as a data set listener for the current edit layer only.
         // See also activeLayerChanged
@@ -148,7 +149,6 @@
 
     @Override public void hideNotify() {
-        Layer.listeners.remove(this);
-        Layer.listeners.remove(newAction);
-        Layer.listeners.add(newAction);
+        MapView.removeLayerChangeListener(this);
+        MapView.removeLayerChangeListener(newAction);
         // unregistering from *all* data layer is somewhat overkill but it
         // doesn't harm either.
@@ -345,5 +345,5 @@
      *
      */
-    class NewAction extends AbstractAction implements LayerChangeListener{
+    class NewAction extends AbstractAction implements MapView.LayerChangeListener{
         public NewAction() {
             putValue(SHORT_DESCRIPTION,tr("Create a new relation"));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2621)
@@ -43,9 +43,10 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -57,5 +58,5 @@
  * @author imi
  */
-public class SelectionListDialog extends ToggleDialog implements SelectionChangedListener, LayerChangeListener {
+public class SelectionListDialog extends ToggleDialog implements SelectionChangedListener, MapView.LayerChangeListener {
 
     private static final int SELECTION_HISTORY_SIZE = 10;
@@ -163,5 +164,11 @@
 
         DataSet.selListeners.add(this);
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
+    }
+
+    @Override
+    public void tearDown() {
+        MapView.removeLayerChangeListener(this);
+        DataSet.selListeners.remove(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 2621)
@@ -41,8 +41,9 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -53,5 +54,5 @@
  *
  */
-public class UserListDialog extends ToggleDialog implements SelectionChangedListener, LayerChangeListener {
+public class UserListDialog extends ToggleDialog implements SelectionChangedListener, MapView.LayerChangeListener {
 
     /**
@@ -69,5 +70,11 @@
         build();
         DataSet.selListeners.add(this);
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
+    }
+
+    @Override
+    public void tearDown() {
+        MapView.removeLayerChangeListener(this);
+        DataSet.selListeners.remove(this);
     }
 
@@ -312,7 +319,7 @@
             UserInfo info = data.get(row);
             switch(column) {
-                case 0: /* author */ return info.getName() == null ? "" : info.getName();
-                case 1: /* count */ return info.count;
-                case 2: /* percent */ return NumberFormat.getPercentInstance().format(info.percent);
+            case 0: /* author */ return info.getName() == null ? "" : info.getName();
+            case 1: /* count */ return info.count;
+            case 2: /* percent */ return NumberFormat.getPercentInstance().format(info.percent);
             }
             return null;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java	(revision 2621)
@@ -8,9 +8,10 @@
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+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;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
-public class ChangesetInSelectionListModel extends ChangesetListModel implements SelectionChangedListener, LayerChangeListener{
+public class ChangesetInSelectionListModel extends ChangesetListModel implements SelectionChangedListener, MapView.LayerChangeListener{
 
     public ChangesetInSelectionListModel(DefaultListSelectionModel selectionModel) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java	(revision 2621)
@@ -5,10 +5,11 @@
 
 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;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
-public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements LayerChangeListener, DataChangeListener{
+public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements MapView.LayerChangeListener, DataChangeListener{
 
     public ChangesetsInActiveDataLayerListModel(DefaultListSelectionModel selectionModel) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2621)
@@ -544,4 +544,5 @@
             getLayer().data.removeDataSetListener(memberTableModel);
             getLayer().listenerDataChanged.remove(memberTableModel);
+            memberTable.unlinkAsListener();
             dispose();
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 2621)
@@ -25,7 +25,8 @@
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+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;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
 public class MemberTable extends JTable implements IMemberModelListener {
@@ -38,4 +39,5 @@
     /** the popup menu */
     protected JPopupMenu popupMenu;
+    private ZoomToAction zoomToAction;
 
     /**
@@ -148,15 +150,4 @@
 
     /**
-     * creates the popup men
-     */
-    protected void createPopupMenu() {
-        popupMenu = new JPopupMenu();
-        ZoomToAction zoomToAction = new ZoomToAction();
-        Layer.listeners.add(zoomToAction);
-        getSelectionModel().addListSelectionListener(zoomToAction);
-        popupMenu.add(zoomToAction);
-    }
-
-    /**
      * Replies the popup menu for this table
      *
@@ -165,7 +156,15 @@
     protected JPopupMenu getPopUpMenu() {
         if (popupMenu == null) {
-            createPopupMenu();
+            popupMenu = new JPopupMenu();
+            zoomToAction = new ZoomToAction();
+            MapView.addLayerChangeListener(zoomToAction);
+            getSelectionModel().addListSelectionListener(zoomToAction);
+            popupMenu.add(zoomToAction);
         }
         return popupMenu;
+    }
+
+    public void unlinkAsListener() {
+        MapView.removeLayerChangeListener(zoomToAction);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java	(revision 2621)
@@ -12,7 +12,7 @@
 
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
 /**
@@ -20,5 +20,5 @@
  *
  */
-public class RelationDialogManager extends WindowAdapter implements LayerChangeListener{
+public class RelationDialogManager extends WindowAdapter implements MapView.LayerChangeListener{
 
     /** keeps track of open relation editors */
@@ -33,5 +33,5 @@
         if (RelationDialogManager.relationDialogManager == null) {
             RelationDialogManager.relationDialogManager = new RelationDialogManager();
-            Layer.listeners.add(RelationDialogManager.relationDialogManager);
+            MapView.addLayerChangeListener(RelationDialogManager.relationDialogManager);
         }
         return RelationDialogManager.relationDialogManager;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java	(revision 2621)
@@ -13,9 +13,9 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
-public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, LayerChangeListener{
+public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, MapView.LayerChangeListener{
 
     /** this selection table model only displays selected primitives in this layer */
@@ -34,5 +34,5 @@
         this.layer = layer;
         cache = new ArrayList<OsmPrimitive>();
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
         populateSelectedPrimitives(layer);
     }
@@ -40,5 +40,5 @@
     public void unregister() {
         DataSet.selListeners.remove(this);
-        Layer.listeners.remove(this);
+        MapView.removeLayerChangeListener(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 2621)
@@ -10,9 +10,9 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.tools.WindowGeometry;
 
-public class HistoryBrowserDialogManager implements LayerChangeListener {
+public class HistoryBrowserDialogManager implements MapView.LayerChangeListener {
     static private HistoryBrowserDialogManager instance;
     static public HistoryBrowserDialogManager getInstance() {
@@ -27,5 +27,5 @@
     protected HistoryBrowserDialogManager() {
         dialogs = new HashMap<Long, HistoryBrowserDialog>();
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2621)
@@ -29,8 +29,8 @@
 import org.openstreetmap.josm.data.osm.history.HistoryWay;
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.DataChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
 /**
@@ -59,5 +59,5 @@
  * @see HistoryBrowser
  */
-public class HistoryBrowserModel extends Observable implements LayerChangeListener, DataSetListener, DataChangeListener {
+public class HistoryBrowserModel extends Observable implements MapView.LayerChangeListener, DataSetListener, DataChangeListener {
 
     private static Logger logger = Logger.getLogger(HistoryBrowserModel.class.getName());
@@ -97,6 +97,5 @@
             getEditLayer().listenerDataChanged.add(this);
         }
-        Layer.listeners.add(this);
-
+        MapView.addLayerChangeListener(this);
     }
 
@@ -772,6 +771,5 @@
             getEditLayer().data.removeDataSetListener(this);
         }
-        Layer.listeners.remove(this);
-
+        MapView.removeLayerChangeListener(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 2621)
@@ -11,6 +11,4 @@
 import java.beans.PropertyChangeSupport;
 import java.io.File;
-import java.util.Collection;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.AbstractAction;
@@ -49,46 +47,4 @@
 
     /**
-     * Interface to notify listeners of the change of the active layer.
-     * @author imi
-     */
-    public interface LayerChangeListener {
-        void activeLayerChange(Layer oldLayer, Layer newLayer);
-        void layerAdded(Layer newLayer);
-        void layerRemoved(Layer oldLayer);
-    }
-
-    /**
-     * The listener of the active layer changes. You may register/deregister yourself
-     * while an LayerChangeListener - action is executed.
-     * 
-     * @deprecated use {@see #addLayerChangeListener(LayerChangeListener)}
-     * and {@see #removeLayerChangeListener(LayerChangeListener)}
-     */
-    @Deprecated
-    public static final Collection<LayerChangeListener> listeners = new CopyOnWriteArrayList<LayerChangeListener>();
-
-    /**
-     * Adds a layer change listener
-     * 
-     * @param listener the listener. Ignored if null or already registered.
-     */
-    public static void addLayerChangeListener(LayerChangeListener listener) {
-        if (listener != null && ! listeners.contains(listener)) {
-            listeners.add(listener);
-        }
-    }
-
-    /**
-     * Removes a layer change listener
-     * 
-     * @param listener the listener. Ignored if null or already registered.
-     */
-    public static void removeLayerChangeListener(LayerChangeListener listener) {
-        if (listener != null && listeners.contains(listener)) {
-            listeners.remove(listener);
-        }
-    }
-
-    /**
      * The visibility state of the layer.
      *
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 2621)
@@ -16,13 +16,11 @@
 import java.awt.Graphics2D;
 import java.awt.Image;
-import java.awt.MediaTracker;
 import java.awt.Point;
 import java.awt.Rectangle;
-import java.awt.Toolkit;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeEvent;
 import java.io.File;
 import java.io.IOException;
@@ -30,9 +28,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
-import java.util.Collection;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
-import java.util.HashSet;
 import java.util.List;
 
@@ -50,4 +48,5 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
@@ -102,13 +101,12 @@
         }
         public int compareTo(ImageEntry image) {
-            if (time != null && image.time != null) {
+            if (time != null && image.time != null)
                 return time.compareTo(image.time);
-            } else if (time == null && image.time == null) {
+            else if (time == null && image.time == null)
                 return 0;
-            } else if (time == null) {
+            else if (time == null)
                 return -1;
-            } else {
+            else
                 return 1;
-            }
         }
     }
@@ -147,7 +145,6 @@
             }
 
-            if (cancelled) {
+            if (cancelled)
                 return;
-            }
             progressMonitor.subTask(tr("Read photos..."));
             progressMonitor.setTicksCount(files.size());
@@ -205,5 +202,5 @@
                         e.printStackTrace();
                         rememberError(tr("Unable to get canonical path for directory {0}\n",
-                                           f.getAbsolutePath()));
+                                f.getAbsolutePath()));
                     }
 
@@ -228,11 +225,10 @@
 
                 } else {
-                      files.add(f);
-                }
-            }
-
-            if (nullFile) {
+                    files.add(f);
+                }
+            }
+
+            if (nullFile)
                 throw new NullPointerException();
-            }
         }
 
@@ -265,5 +261,5 @@
                 Main.main.addLayer(layer);
                 layer.hook_up_mouse_events(); // Main.map.mapView should exist
-                                              // now. Can add mouse listener
+                // now. Can add mouse listener
 
                 if (! cancelled && layer.data.size() > 0) {
@@ -329,5 +325,5 @@
                 new JSeparator(),
                 correlateItem
-                };
+        };
     }
 
@@ -336,8 +332,9 @@
         int i = 0;
         for (ImageEntry e : data)
-            if (e.pos != null)
+            if (e.pos != null) {
                 i++;
+            }
         return data.size() + " " + trn("image", "images", data.size())
-                + " loaded. " + tr("{0} were found to be gps tagged.", i);
+        + " loaded. " + tr("{0} were found to be gps tagged.", i);
     }
 
@@ -406,6 +403,6 @@
 
         return new Dimension(
-            (int) Math.round(f * thumb.getWidth(null)),
-            (int) Math.round(f * thumb.getHeight(null)));
+                (int) Math.round(f * thumb.getWidth(null)),
+                (int) Math.round(f * thumb.getHeight(null)));
     }
 
@@ -432,6 +429,7 @@
 
                 for (ImageEntry e : data) {
-                    if (e.pos == null)
+                    if (e.pos == null) {
                         continue;
+                    }
                     Point p = mv.getPoint(e.pos);
                     if (e.thumbnail != null) {
@@ -444,6 +442,6 @@
                     else { // thumbnail not loaded yet
                         icon.paintIcon(mv, tempG,
-                                   p.x - icon.getIconWidth() / 2,
-                                   p.y - icon.getIconHeight() / 2);
+                                p.x - icon.getIconWidth() / 2,
+                                p.y - icon.getIconHeight() / 2);
                     }
                 }
@@ -454,10 +452,11 @@
         else {
             for (ImageEntry e : data) {
-                if (e.pos == null)
+                if (e.pos == null) {
                     continue;
+                }
                 Point p = mv.getPoint(e.pos);
                 icon.paintIcon(mv, g,
-                           p.x - icon.getIconWidth() / 2,
-                           p.y - icon.getIconHeight() / 2);
+                        p.x - icon.getIconWidth() / 2,
+                        p.y - icon.getIconHeight() / 2);
             }
         }
@@ -475,6 +474,6 @@
                 } else {
                     selectedIcon.paintIcon(mv, g,
-                                p.x - selectedIcon.getIconWidth() / 2,
-                                p.y - selectedIcon.getIconHeight() / 2);
+                            p.x - selectedIcon.getIconWidth() / 2,
+                            p.y - selectedIcon.getIconHeight() / 2);
                 }
             }
@@ -484,6 +483,7 @@
     @Override
     public void visitBoundingBox(BoundingXYVisitor v) {
-        for (ImageEntry e : data)
+        for (ImageEntry e : data) {
             v.visit(e.pos);
+        }
     }
 
@@ -508,5 +508,5 @@
 
             Rational[] components = dir
-                    .getRationalArray(GpsDirectory.TAG_GPS_LONGITUDE);
+            .getRationalArray(GpsDirectory.TAG_GPS_LONGITUDE);
 
             deg = components[0].intValue();
@@ -516,6 +516,7 @@
             lon = (deg + (min / 60) + (sec / 3600));
 
-            if (dir.getString(GpsDirectory.TAG_GPS_LONGITUDE_REF).charAt(0) == 'W')
+            if (dir.getString(GpsDirectory.TAG_GPS_LONGITUDE_REF).charAt(0) == 'W') {
                 lon = -lon;
+            }
 
             // latitude
@@ -529,6 +530,7 @@
             lat = (deg + (min / 60) + (sec / 3600));
 
-            if (dir.getString(GpsDirectory.TAG_GPS_LATITUDE_REF).charAt(0) == 'S')
+            if (dir.getString(GpsDirectory.TAG_GPS_LATITUDE_REF).charAt(0) == 'S') {
                 lat = -lat;
+            }
 
             // Store values
@@ -569,5 +571,5 @@
 
     public void checkPreviousNextButtons() {
-//        System.err.println("showing image " + currentPhoto);
+        //        System.err.println("showing image " + currentPhoto);
         ImageViewerDialog.setNextEnabled(currentPhoto < data.size() - 1);
         ImageViewerDialog.setPreviousEnabled(currentPhoto > 0);
@@ -596,23 +598,22 @@
             @Override public void mousePressed(MouseEvent e) {
 
-                if (e.getButton() != MouseEvent.BUTTON1) {
+                if (e.getButton() != MouseEvent.BUTTON1)
                     return;
-                }
-                if (isVisible())
+                if (isVisible()) {
                     Main.map.mapView.repaint();
+                }
             }
 
             @Override public void mouseReleased(MouseEvent ev) {
-                if (ev.getButton() != MouseEvent.BUTTON1) {
+                if (ev.getButton() != MouseEvent.BUTTON1)
                     return;
-                }
-                if (!isVisible()) {
+                if (!isVisible())
                     return;
-                }
 
                 for (int i = data.size() - 1; i >= 0; --i) {
                     ImageEntry e = data.get(i);
-                    if (e.pos == null)
+                    if (e.pos == null) {
                         continue;
+                    }
                     Point p = Main.map.mapView.getPoint(e.pos);
                     Rectangle r;
@@ -622,7 +623,7 @@
                     } else {
                         r = new Rectangle(p.x - icon.getIconWidth() / 2,
-                                            p.y - icon.getIconHeight() / 2,
-                                            icon.getIconWidth(),
-                                            icon.getIconHeight());
+                                p.y - icon.getIconHeight() / 2,
+                                icon.getIconWidth(),
+                                icon.getIconHeight());
                     }
                     if (r.contains(ev.getPoint())) {
@@ -636,5 +637,5 @@
         };
         Main.map.mapView.addMouseListener(mouseAdapter);
-        Layer.listeners.add(new LayerChangeListener() {
+        MapView.addLayerChangeListener(new LayerChangeListener() {
             public void activeLayerChange(Layer oldLayer, Layer newLayer) {
                 if (newLayer == GeoImageLayer.this && currentPhoto >= 0) {
@@ -656,4 +657,6 @@
                     data.clear();
                     data = null;
+                    // stop listening to layer change events
+                    MapView.removeLayerChangeListener(this);
                 }
             }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 2621)
@@ -44,8 +44,8 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.QuadStateCheckBox;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPritority;
@@ -65,5 +65,5 @@
  * It is also able to construct dialogs out of preset definitions.
  */
-public class TaggingPreset extends AbstractAction implements LayerChangeListener {
+public class TaggingPreset extends AbstractAction implements MapView.LayerChangeListener {
 
     public TaggingPresetMenu group = null;
@@ -181,8 +181,9 @@
             }
             if(locale_text == null) {
-                if(text_context != null)
+                if(text_context != null) {
                     locale_text = trc(text_context, text);
-                else
+                } else {
                     locale_text = tr(text);
+                }
             }
             p.add(new JLabel(locale_text+":"), GBC.std().insets(0,0,10,0));
@@ -231,8 +232,9 @@
 
             if(locale_text == null) {
-                if(text_context != null)
+                if(text_context != null) {
                     locale_text = trc(text_context, text);
-                else
+                } else {
                     locale_text = tr(text);
+                }
             }
 
@@ -334,6 +336,6 @@
             for (int i=0; i<value_array.length; i++) {
                 lhm.put(value_array[i], (locale_display_values == null)
-                ? (values_context == null ? tr(display_array[i])
-                : tr(values_context, display_array[i])) : display_array[i]);
+                        ? (values_context == null ? tr(display_array[i])
+                                : tr(values_context, display_array[i])) : display_array[i]);
             }
             if(!usage.unused()){
@@ -377,8 +379,9 @@
 
             if(locale_text == null) {
-                if(text_context != null)
+                if(text_context != null) {
                     locale_text = trc(text_context, text);
-                else
+                } else {
                     locale_text = tr(text);
+                }
             }
             p.add(new JLabel(locale_text+":"), GBC.std().insets(0,0,10,0));
@@ -427,8 +430,9 @@
         @Override public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel) {
             if(locale_text == null) {
-                if(text_context != null)
+                if(text_context != null) {
                     locale_text = trc(text_context, text);
-                else
+                } else {
                     locale_text = tr(text);
+                }
             }
             p.add(new JLabel(locale_text), GBC.eol());
@@ -447,10 +451,11 @@
         @Override public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel) {
             if(locale_text == null) {
-                if(text == null)
+                if(text == null) {
                     locale_text = tr("More information about this feature");
-                else if(text_context != null)
+                } else if(text_context != null) {
                     locale_text = trc(text_context, text);
-                else
+                } else {
                     locale_text = tr(text);
+                }
             }
             String url = locale_href;
@@ -508,5 +513,5 @@
      */
     public TaggingPreset() {
-        Layer.listeners.add(this);
+        MapView.addLayerChangeListener(this);
         updateEnabledState();
     }
@@ -522,8 +527,9 @@
     public String getLocaleName() {
         if(locale_name == null) {
-            if(name_context != null)
+            if(name_context != null) {
                 locale_name = trc(name_context, name);
-            else
+            } else {
                 locale_name = tr(name);
+            }
         }
         return locale_name;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionCache.java	(revision 2620)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionCache.java	(revision 2621)
@@ -12,7 +12,7 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
 
 /**
@@ -40,5 +40,5 @@
     static {
         caches = new HashMap<OsmDataLayer, AutoCompletionCache>();
-        Layer.listeners.add(new LayerChangeListener() {
+        MapView.addLayerChangeListener(new MapView.LayerChangeListener() {
             public void activeLayerChange(Layer oldLayer, Layer newLayer) {
                 // do nothing
