Index: trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 347)
+++ trunk/src/org/openstreetmap/josm/data/UndoRedoHandler.java	(revision 348)
@@ -42,4 +42,5 @@
 			OsmDataLayer data = (OsmDataLayer)Main.map.mapView.getActiveLayer();
 			data.setModified(true);
+			data.fireDataChange();
 		}
 		fireCommandsChanged();
@@ -58,4 +59,5 @@
 			OsmDataLayer data = (OsmDataLayer)Main.map.mapView.getActiveLayer();
 			data.setModified(data.uploadedModified || !commands.isEmpty());
+			data.fireDataChange();
 			fireCommandsChanged();
 		}		
@@ -76,4 +78,5 @@
 			OsmDataLayer data = (OsmDataLayer)Main.map.mapView.getActiveLayer();
 			data.setModified(true);
+			data.fireDataChange();
 			fireCommandsChanged();
 		}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationEditor.java	(revision 347)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationEditor.java	(revision 348)
@@ -13,4 +13,5 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Map.Entry;
@@ -174,5 +175,5 @@
 		
 	    memberData.setColumnIdentifiers(new String[]{tr("Role"),tr("Occupied By")});
-		memberTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+		memberTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
 		memberTable.getColumnModel().getColumn(1).setCellRenderer(new OsmPrimitivRenderer());
 		/*
@@ -228,7 +229,8 @@
 		buttonPanel.add(createButton(marktr("Select"),"select", tr("Highlight the member from the current table row as JOSM's selection"), KeyEvent.VK_S, new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
-				int row = memberTable.getSelectedRow();
-				OsmPrimitive p = (OsmPrimitive) memberTable.getValueAt(row, 1);
-				Main.ds.setSelected(Collections.singleton(p));
+				int[] rows = memberTable.getSelectedRows();
+				ArrayList<OsmPrimitive> sel = new ArrayList<OsmPrimitive>(rows.length);
+				for (int i : rows) { sel.add((OsmPrimitive)memberTable.getValueAt(i, 1)); }
+				Main.ds.setSelected(sel);
 			}
 		}));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 347)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 348)
@@ -31,4 +31,8 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+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;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -42,5 +46,5 @@
  * @author Frederik Ramm <frederik@remote.org>
  */
-public class RelationListDialog extends ToggleDialog {
+public class RelationListDialog extends ToggleDialog implements LayerChangeListener, DataChangeListener {
 
 	/**
@@ -95,15 +99,6 @@
 			}
 		}));
-		
+		Layer.listeners.add(this);
 		add(buttonPanel, BorderLayout.SOUTH);
-		
-		/*
-		DataSet.dataListeners.add(new DataChangedListener() {
-			public void dataChanged() {
-				updateList();
-				repaint();
-			}
-		});
-		*/
 	}
 
@@ -133,3 +128,27 @@
 	}
 	
+	public void activeLayerChange(Layer a, Layer b) {
+		if (a instanceof OsmDataLayer && b instanceof OsmDataLayer) {
+			((OsmDataLayer)a).listenerDataChanged.remove(this);
+			((OsmDataLayer)b).listenerDataChanged.add(this);
+			updateList();
+			repaint();
+		}
+	}
+	
+	public void layerRemoved(Layer a) {
+		if (a instanceof OsmDataLayer) {
+			((OsmDataLayer)a).listenerDataChanged.remove(this);
+		}
+	}
+	public void layerAdded(Layer a) {
+		if (a instanceof OsmDataLayer) {
+			((OsmDataLayer)a).listenerDataChanged.add(this);
+		}
+	}	
+	public void dataChanged(OsmDataLayer l) {
+		updateList();
+		repaint();
+	}
+	
 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 347)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 348)
@@ -109,5 +109,6 @@
 
 	public final LinkedList<ModifiedChangedListener> listenerModified = new LinkedList<ModifiedChangedListener>();
-
+	public final LinkedList<DataChangeListener> listenerDataChanged = new LinkedList<DataChangeListener>();
+	
 	private SimplePaintVisitor mapPainter = new SimplePaintVisitor();
 
@@ -177,4 +178,5 @@
 		for (DataSource src : ((OsmDataLayer)from).data.dataSources) 
 			data.dataSources.add(src);
+		fireDataChange();
 		
 		if (visitor.conflicts.isEmpty())
@@ -315,3 +317,9 @@
     	this.mapPainter = mapPainter;
     }
+	
+	public void fireDataChange() {
+		for (DataChangeListener dcl : listenerDataChanged) {
+			dcl.dataChanged(this);
+		}
+	}
 }
