Index: trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 2657)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java	(revision 2658)
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.data.osm.event;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Queue;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -32,6 +31,6 @@
 
     private final Queue<AbstractDatasetChangedEvent> eventsInEDT = new LinkedBlockingQueue<AbstractDatasetChangedEvent>();
-    private final List<DataSetListener> inEDTListeners = new ArrayList<DataSetListener>();
-    private final List<DataSetListener> normalListeners = new ArrayList<DataSetListener>();
+    private final CopyOnWriteArrayList<DataSetListener> inEDTListeners = new CopyOnWriteArrayList<DataSetListener>();
+    private final CopyOnWriteArrayList<DataSetListener> normalListeners = new CopyOnWriteArrayList<DataSetListener>();
     private final DataSetListener myListener = new DataSetListenerAdapter(this);
 
@@ -48,7 +47,7 @@
     public void addDatasetListener(DataSetListener listener, boolean fireInEDT) {
         if (fireInEDT) {
-            inEDTListeners.add(listener);
+            inEDTListeners.addIfAbsent(listener);
         } else {
-            normalListeners.add(listener);
+            normalListeners.addIfAbsent(listener);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2657)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2658)
@@ -18,5 +18,4 @@
 import java.util.Collections;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.NoSuchElementException;
 
@@ -46,5 +45,4 @@
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -57,5 +55,5 @@
  * @author imi
  */
-public class SelectionListDialog extends ToggleDialog implements SelectionChangedListener, MapView.LayerChangeListener {
+public class SelectionListDialog extends ToggleDialog implements SelectionChangedListener, MapView.EditLayerChangeListener {
 
     private static final int SELECTION_HISTORY_SIZE = 10;
@@ -162,11 +160,20 @@
         }
 
-        DataSet.selListeners.add(this);
-        MapView.addLayerChangeListener(this);
+        MapView.addEditLayerChangeListener(this);
     }
 
     @Override
     public void tearDown() {
-        MapView.removeLayerChangeListener(this);
+        MapView.removeEditLayerChangeListener(this);
+    }
+
+    @Override
+    public void showNotify() {
+        DataSet.selListeners.add(this);
+        updateSelection();
+    }
+
+    @Override
+    public void hideNotify() {
         DataSet.selListeners.remove(this);
     }
@@ -370,20 +377,14 @@
     }
 
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (newLayer instanceof OsmDataLayer) {
-            OsmDataLayer dataLayer = (OsmDataLayer)newLayer;
-            selectionChanged(dataLayer.data.getSelected());
+    private void updateSelection() {
+        if (Main.main.getCurrentDataSet() == null) {
+            selectionChanged(Collections.<OsmPrimitive>emptyList());
         } else {
-            List<OsmPrimitive> selection = Collections.emptyList();
-            selectionChanged(selection);
-        }
-    }
-
-    public void layerAdded(Layer newLayer) {
-        // do nothing
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        // do nothing
+            selectionChanged(Main.main.getCurrentDataSet().getSelected());
+        }
+    }
+
+    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        updateSelection();
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/ListOfUsedTags.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/ListOfUsedTags.java	(revision 2657)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/ListOfUsedTags.java	(revision 2658)
@@ -47,4 +47,8 @@
         else
             return values;
+    }
+
+    public void rebuildNecessary() {
+        dirty = true;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 2657)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 2658)
@@ -71,5 +71,4 @@
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 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.preferences.TaggingPresetPreference;
@@ -97,5 +96,5 @@
  * @author imi
  */
-public class PropertiesDialog extends ToggleDialog implements SelectionChangedListener, MapView.LayerChangeListener {
+public class PropertiesDialog extends ToggleDialog implements SelectionChangedListener, MapView.EditLayerChangeListener {
     /**
      * Watches for double clicks and from editing or new property, depending on the
@@ -145,4 +144,7 @@
     public void showNotify() {
         DatasetEventManager.getInstance().addDatasetListener(listOfUsedTags, false);
+        listOfUsedTags.rebuildNecessary();
+        DataSet.selListeners.add(this);
+        updateSelection();
     }
 
@@ -150,4 +152,5 @@
     public void hideNotify() {
         DatasetEventManager.getInstance().removeDatasetListener(listOfUsedTags);
+        DataSet.selListeners.remove(this);
     }
 
@@ -568,11 +571,10 @@
         add(buttonPanel, BorderLayout.SOUTH);
 
-        DataSet.selListeners.add(this);
-        MapView.addLayerChangeListener(this);
+        MapView.addEditLayerChangeListener(this);
     }
 
     @Override
     public void tearDown() {
-        MapView.removeLayerChangeListener(this);
+        MapView.removeEditLayerChangeListener(this);
     }
 
@@ -776,23 +778,17 @@
     }
 
+    private void updateSelection() {
+        if (Main.main.getCurrentDataSet() == null) {
+            selectionChanged(Collections.<OsmPrimitive>emptyList());
+        } else {
+            selectionChanged(Main.main.getCurrentDataSet().getSelected());
+        }
+    }
+
     /* ---------------------------------------------------------------------------------- */
-    /* LayerChangeListener                                                                */
+    /* EditLayerChangeListener                                                                */
     /* ---------------------------------------------------------------------------------- */
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (newLayer instanceof OsmDataLayer) {
-            OsmDataLayer dataLayer = (OsmDataLayer)newLayer;
-            selectionChanged(dataLayer.data.getSelected());
-        } else {
-            List<OsmPrimitive> selection = Collections.emptyList();
-            selectionChanged(selection);
-        }
-    }
-
-    public void layerAdded(Layer newLayer) {
-        // do nothing
-    }
-
-    public void layerRemoved(Layer oldLayer) {
-        // do nothing
+    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        updateSelection();
     }
 
