Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 2911)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 2912)
@@ -57,5 +57,5 @@
         SearchSetting s = lastSearch;
         if (s == null) {
-            s = new SearchSetting("", SearchMode.replace, false /* case insensitive */, false /* no regexp */);
+            s = new SearchSetting();
         }
         SearchSetting se = showSearchDialog(s);
@@ -303,6 +303,9 @@
         public boolean regexSearch;
 
+        public SearchSetting() {
+            this("", SearchMode.replace, false /* case insensitive */, false /* no regexp */);
+        }
+
         public SearchSetting(String text, SearchMode mode, boolean caseSensitive, boolean regexSearch) {
-            super();
             this.caseSensitive = caseSensitive;
             this.regexSearch = regexSearch;
@@ -312,9 +315,5 @@
 
         public SearchSetting(SearchSetting original) {
-            super();
-            this.caseSensitive = original.caseSensitive;
-            this.regexSearch = original.regexSearch;
-            this.mode = original.mode;
-            this.text = original.text;
+            this(original.text, original.mode, original.caseSensitive, original.regexSearch);
         }
 
Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 2911)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 2912)
@@ -60,4 +60,5 @@
 
     public static class Always extends Match {
+        public static Always INSTANCE = new Always();
         @Override public boolean match(OsmPrimitive osm) {
             return true;
Index: /trunk/src/org/openstreetmap/josm/data/osm/event/SelectionEventManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/event/SelectionEventManager.java	(revision 2912)
+++ /trunk/src/org/openstreetmap/josm/data/osm/event/SelectionEventManager.java	(revision 2912)
@@ -0,0 +1,90 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.swing.SwingUtilities;
+
+import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
+
+/**
+ * Similar like {@link DatasetEventManager}, just for selection events. Because currently selection changed
+ * event are global, only FIRE_IN_EDT and FIRE_EDT_CONSOLIDATED modes are really useful
+ *
+ */
+public class SelectionEventManager implements SelectionChangedListener {
+
+    private static final SelectionEventManager instance = new SelectionEventManager();
+
+    public static SelectionEventManager getInstance() {
+        return instance;
+    }
+
+    private static class ListenerInfo {
+        final SelectionChangedListener listener;
+
+        public ListenerInfo(SelectionChangedListener listener, boolean consolidate) {
+            this.listener = listener;
+        }
+
+        @Override
+        public int hashCode() {
+            return listener.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            return o instanceof ListenerInfo && ((ListenerInfo)o).listener == listener;
+        }
+    }
+
+    private Collection<? extends OsmPrimitive> selection;
+    private final CopyOnWriteArrayList<ListenerInfo> inEDTListeners = new CopyOnWriteArrayList<ListenerInfo>();
+    private final CopyOnWriteArrayList<ListenerInfo> normalListeners = new CopyOnWriteArrayList<ListenerInfo>();
+
+    public SelectionEventManager() {
+        DataSet.selListeners.add(this);
+    }
+
+    public void addSelectionListener(SelectionChangedListener listener, FireMode fireMode) {
+        if (fireMode == FireMode.IN_EDT)
+            throw new UnsupportedOperationException("IN_EDT mode not supported, you probably want to use IN_EDT_CONSOLIDATED.");
+        if (fireMode == FireMode.IN_EDT || fireMode == FireMode.IN_EDT_CONSOLIDATED) {
+            inEDTListeners.addIfAbsent(new ListenerInfo(listener, fireMode == FireMode.IN_EDT_CONSOLIDATED));
+        } else {
+            normalListeners.addIfAbsent(new ListenerInfo(listener, false));
+        }
+    }
+
+    public void removeSelectionListener(SelectionChangedListener listener) {
+        ListenerInfo searchListener = new ListenerInfo(listener, false);
+        inEDTListeners.remove(searchListener);
+        normalListeners.remove(searchListener);
+    }
+
+    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+        fireEvents(normalListeners, newSelection);
+        selection = newSelection;
+        SwingUtilities.invokeLater(edtRunnable);
+    }
+
+    private void fireEvents(List<ListenerInfo> listeners, Collection<? extends OsmPrimitive> newSelection) {
+        for (ListenerInfo listener: listeners) {
+            listener.listener.selectionChanged(newSelection);
+        }
+    }
+
+    private final Runnable edtRunnable = new Runnable() {
+        public void run() {
+            if (selection != null) {
+                fireEvents(inEDTListeners, selection);
+            }
+        }
+    };
+
+}
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2911)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2912)
@@ -40,4 +40,6 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
+import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
@@ -163,5 +165,5 @@
     @Override
     public void showNotify() {
-        DataSet.selListeners.add(this);
+        SelectionEventManager.getInstance().addSelectionListener(this, FireMode.IN_EDT_CONSOLIDATED);
         MapView.addEditLayerChangeListener(this);
         updateSelection();
@@ -170,5 +172,5 @@
     @Override
     public void hideNotify() {
-        DataSet.selListeners.remove(this);
+        SelectionEventManager.getInstance().removeSelectionListener(this);
         MapView.removeEditLayerChangeListener(this);
     }
@@ -277,5 +279,5 @@
             setTitle(tr("Selection"));
         }
-        
+
         if (selectionHistory != null && newSelection.size() > 0 && !newSelection.equals(historyIgnoreSelection)) {
             historyIgnoreSelection = null;
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 2911)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 2912)
@@ -59,5 +59,4 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -68,4 +67,5 @@
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
+import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
@@ -154,5 +154,5 @@
         DatasetEventManager.getInstance().addDatasetListener(dataChangedAdapter, FireMode.IN_EDT_CONSOLIDATED);
         listOfUsedTags.rebuildNecessary();
-        DataSet.selListeners.add(this);
+        SelectionEventManager.getInstance().addSelectionListener(this, FireMode.IN_EDT_CONSOLIDATED);
         MapView.addEditLayerChangeListener(this);
         updateSelection();
@@ -163,5 +163,5 @@
         DatasetEventManager.getInstance().removeDatasetListener(listOfUsedTags);
         DatasetEventManager.getInstance().removeDatasetListener(dataChangedAdapter);
-        DataSet.selListeners.remove(this);
+        SelectionEventManager.getInstance().removeSelectionListener(this);
         MapView.removeEditLayerChangeListener(this);
     }
