Index: trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 12100)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 12101)
@@ -31,8 +31,8 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AbstractInfoAction;
-import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSelectionListener;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -51,5 +51,5 @@
  *
  */
-public class UserListDialog extends ToggleDialog implements SelectionChangedListener, ActiveLayerChangeListener {
+public class UserListDialog extends ToggleDialog implements DataSelectionListener, ActiveLayerChangeListener {
 
     /**
@@ -71,5 +71,5 @@
     @Override
     public void showNotify() {
-        DataSet.addSelectionListener(this);
+        SelectionEventManager.getInstance().addSelectionListenerForEdt(this);
         Main.getLayerManager().addActiveLayerChangeListener(this);
     }
@@ -78,5 +78,5 @@
     public void hideNotify() {
         Main.getLayerManager().removeActiveLayerChangeListener(this);
-        DataSet.removeSelectionListener(this);
+        SelectionEventManager.getInstance().removeSelectionListener(this);
     }
 
@@ -103,11 +103,7 @@
     }
 
-    /**
-     * Called when the selection in the dataset changed.
-     * @param newSelection The new selection array.
-     */
-    @Override
-    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        refresh(newSelection);
+    @Override
+    public void selectionChanged(SelectionChangeEvent event) {
+        refresh(event.getSelection());
     }
 
@@ -115,4 +111,8 @@
     public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         Layer activeLayer = e.getSource().getActiveLayer();
+        refreshForActiveLayer(activeLayer);
+    }
+
+    private void refreshForActiveLayer(Layer activeLayer) {
         if (activeLayer instanceof OsmDataLayer) {
             refresh(((OsmDataLayer) activeLayer).data.getAllSelected());
@@ -127,6 +127,6 @@
      */
     public void refresh(Collection<? extends OsmPrimitive> fromPrimitives) {
-        model.populate(fromPrimitives);
         GuiHelper.runInEDT(() -> {
+            model.populate(fromPrimitives);
             if (model.getRowCount() != 0) {
                 setTitle(trn("{0} Author", "{0} Authors", model.getRowCount(), model.getRowCount()));
@@ -140,8 +140,5 @@
     public void showDialog() {
         super.showDialog();
-        Layer layer = Main.getLayerManager().getActiveLayer();
-        if (layer instanceof OsmDataLayer) {
-            refresh(((OsmDataLayer) layer).data.getAllSelected());
-        }
+        refreshForActiveLayer(Main.getLayerManager().getActiveLayer());
     }
 
@@ -308,4 +305,5 @@
 
         public void populate(Collection<? extends OsmPrimitive> primitives) {
+            GuiHelper.assertCallFromEdt();
             Map<User, Integer> statistics = computeStatistics(primitives);
             data.clear();
@@ -316,5 +314,5 @@
             }
             Collections.sort(data);
-            GuiHelper.runInEDTAndWait(this::fireTableDataChanged);
+            this.fireTableDataChanged();
         }
 
