Index: src/org/openstreetmap/josm/actions/UpdateDataAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 2315)
+++ src/org/openstreetmap/josm/actions/UpdateDataAction.java	(working copy)
@@ -18,7 +18,7 @@
     public UpdateDataAction() {
         super(tr("Update data"),
                 "updatedata",
-                tr("Updates the objects in the current data layer from the server."),
+                tr("Updates the objects in the active data layer from the server."),
                 Shortcut.registerShortcut("file:updatedata",
                         tr("Update data"),
                         KeyEvent.VK_U,
Index: src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UploadAction.java	(revision 2315)
+++ src/org/openstreetmap/josm/actions/UploadAction.java	(working copy)
@@ -116,7 +116,7 @@
     }
 
     public UploadAction() {
-        super(tr("Upload data"), "upload", tr("Upload all changes in the current data layer to the OSM server"),
+        super(tr("Upload data"), "upload", tr("Upload all changes in the active data layer to the OSM server"),
                 Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload data")), KeyEvent.VK_U, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY), true);
     }
 
Index: src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(revision 2315)
+++ src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(working copy)
@@ -270,12 +270,14 @@
          */
         if (numPanels == 1 && panels.get(N-1).getComponents().length == 0)
         {
+            parent.setDividerSize(0);
             this.setVisible(false);
         } else {
             if (this.getWidth() != 0) { // only if josm started with hidden panel
                 this.setPreferredSize(new Dimension(this.getWidth(), 0));
             }
             this.setVisible(true);
+            parent.setDividerSize(5);
             parent.resetToPreferredSizes();
         }
     }
Index: src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2315)
+++ src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(working copy)
@@ -4,21 +4,27 @@
 
 import java.awt.BorderLayout;
 import java.awt.GridLayout;
+import java.awt.Point;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
+import java.util.List;
 import java.util.logging.Logger;
 
 import javax.swing.AbstractAction;
 import javax.swing.AbstractListModel;
 import javax.swing.JList;
+import javax.swing.JMenuItem;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
@@ -36,6 +42,7 @@
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
 import org.openstreetmap.josm.gui.layer.DataChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -169,7 +176,7 @@
             model.setRelations(null);
             return;
         }
-        Relation selected = getSelected();
+        Relation[] selected = getAllSelected();
 
         model.setRelations(getDisplayedRelationsInSortOrder(Main.main.getCurrentDataSet()));
         if(model.getSize() > 0) {
@@ -177,7 +184,7 @@
         } else {
             setTitle(tr("Relations"));
         }
-        selectRelation(selected);
+        selectRelations(selected);
     }
 
     public void activeLayerChange(Layer a, Layer b) {
@@ -239,22 +246,49 @@
     }
 
     /**
+     * @return All selected relations in the list, possibly empty List
+     */
+    private Relation[] getAllSelected() {
+        return (Relation[]) Arrays.asList(displaylist.getSelectedValues()).toArray(new Relation[0]);
+    }
+
+    /**
      * Selects the relation <code>relation</code> in the list of relations.
      *
      * @param relation  the relation
      */
     public void selectRelation(Relation relation) {
-        if (relation == null){
-            displaylist.clearSelection();
-            return;
+        selectRelations(new Relation[] {relation});
+    }
+
+    /**
+     * Selects the relations <code>relations</code> in the list of relations.
+     *
+     * @param relations  the relations (may be empty)
+     */
+    public void selectRelations(Relation[] relations) {
+        List<Integer> sel = new ArrayList<Integer>();
+        for (Relation r : relations) {
+            if (r == null) continue;
+            int idx = model.getIndexOfRelation(r);
+            if (idx != -1) {
+                sel.add(idx);
+            }
         }
-        int idx = model.getIndexOfRelation(relation);
-        if (idx == -1) {
+        if (sel.isEmpty()) {
             displaylist.clearSelection();
+            return;
         } else {
-            displaylist.setSelectedIndex(idx);
-            displaylist.scrollRectToVisible(displaylist.getCellBounds(idx,idx));
+            int fst = Collections.min(sel);
+            displaylist.scrollRectToVisible(displaylist.getCellBounds(fst, fst));
+        }
+
+        int[] aSel = new int[sel.size()];       //FIXME: how to cast Integer[] -> int[] ?
+        for (int i=0; i<sel.size(); ++i) {
+            aSel[i] = sel.get(i);
         }
+
+        displaylist.setSelectedIndices(aSel);
     }
 
     class DoubleClickAdapter extends MouseAdapter {
@@ -275,9 +309,68 @@
                 }
             }
         }
+        private void openPopup(MouseEvent e) {
+            Point p = e.getPoint();
+            int index = displaylist.locationToIndex(p);
+            if (index < 0) return;
+            if (!displaylist.getCellBounds(index, index).contains(e.getPoint()))
+                return;
+            Object obj = model.getElementAt(index);
+            if (! displaylist.isSelectedIndex(index)) {
+                displaylist.setSelectedIndex(index);
+            }
+            JPopupMenu menu = new JPopupMenu();
+            JMenuItem down = new JMenuItem(tr("Download members"), ImageProvider.get("dialogs", "downloadincomplete"));
+
+            final Object[] os = displaylist.getSelectedValues();
+            final List<Relation> rs = new ArrayList<Relation>(); 
+            for (Object o : os) {
+                Relation r = (Relation) o;
+                if (r != null && !r.isNew()) {
+                    rs.add(r);
+                }
+            }
+            down.setEnabled(!rs.isEmpty());
+            down.addActionListener(new ActionListener () {
+                public void actionPerformed(ActionEvent e) {
+                    Main.worker.submit(new GenericRelationEditor.DownloadTask(
+                                                    (Relation[]) rs.toArray(new Relation[0]),
+                                                    Main.map.mapView.getEditLayer(), null));
+                }
+            });
+            JMenuItem select = new JMenuItem(tr("Select members"), ImageProvider.get("selectall"));
+            select.addActionListener(new ActionListener () {
+                public void actionPerformed(ActionEvent e) {
+                    Object[] rs = displaylist.getSelectedValues();
+                    HashSet<OsmPrimitive> ms = new HashSet<OsmPrimitive>();
+                    for (Object r : rs) {
+                        for (RelationMember m : ((Relation) r).getMembers()) {
+                            ms.add(m.getMember());
+                        }
+                    }
+                    final OsmDataLayer l = Main.map.mapView.getEditLayer();
+                    l.data.setSelected(ms);
+                    DataSet.fireSelectionChanged(l.data.getSelected());
+                }
+            });
+            menu.add(down);
+            menu.add(select);
+
+            menu.show(RelationListDialog.this, p.x, p.y-3);
+        }
+        @Override public void mousePressed(MouseEvent e) {
+            if (e.isPopupTrigger()) {
+                openPopup(e);
+            }
+        }
+        @Override public void mouseReleased(MouseEvent e) {
+            if (e.isPopupTrigger()) {
+                openPopup(e);
+            }
+        }
     }
 
-    /**
+   /**
      * The edit action
      *
      */
Index: src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2315)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(working copy)
@@ -196,24 +196,7 @@
             listSelectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         }
         return listSelectionModel;
-    }
-
-    public void updateMemberReferences(DataSet ds) {
-        for (int i=0; i< members.size();i++) {
-            RelationMember member = members.get(i);
-            if (member.getMember().isNew()) {
-                continue;
-            }
-            OsmPrimitive primitive = ds.getPrimitiveById(member.getMember().getId(), OsmPrimitiveType.from(member.getMember()));
-            if (primitive != null) {
-                RelationMember newMember = new RelationMember(member.getRole(), primitive);
-                members.remove(i);
-                members.add(i, newMember);
-            }
-        }
-        fireTableDataChanged();
-    }
-
+    }
     public void removeMembersReferringTo(List<? extends OsmPrimitive> primitives) {
         if (primitives == null)
             return;
Index: src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2315)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(working copy)
@@ -1202,7 +1202,7 @@
         public void actionPerformed(ActionEvent e) {
             if (!isEnabled())
                 return;
-            Main.worker.submit(new DownloadTask(GenericRelationEditor.this));
+            Main.worker.submit(new DownloadTask(new Relation[] {getRelation()}, getLayer(), memberTableModel, GenericRelationEditor.this));
         }
 
         protected void updateEnabledState() {
@@ -1368,17 +1368,33 @@
      * The asynchronous task for downloading relation members.
      *
      */
-    class DownloadTask extends PleaseWaitRunnable {
+    public static class DownloadTask extends PleaseWaitRunnable {
         private boolean cancelled;
         private int conflictsCount;
         private Exception lastException;
+        private Relation[] relations;
+        private OsmDataLayer curLayer;
+        private MemberTableModel memberTableModel;
 
-        public DownloadTask(Dialog parent) {
+        public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) {
             super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /*
              * don't
              * ignore
              * exception
              */);
+             this.relations = relations;
+             this.curLayer = curLayer;
+             this.memberTableModel = memberTableModel;
+        }
+        public DownloadTask(Relation[] relations, OsmDataLayer curLayer, MemberTableModel memberTableModel) {
+            super(tr("Download relation members"), new PleaseWaitProgressMonitor(), false /*
+             * don't
+             * ignore
+             * exception
+             */);
+             this.relations = relations;
+             this.curLayer = curLayer;        
+             this.memberTableModel = memberTableModel;
         }
 
         @Override
@@ -1389,9 +1405,12 @@
 
         @Override
         protected void finish() {
+            Main.map.repaint();
             if (cancelled)
                 return;
-            memberTableModel.updateMemberReferences(getLayer().data);
+            if (memberTableModel != null) {
+                memberTableModel.fireTableDataChanged();
+            }
             if (lastException != null) {
                 ExceptionDialogUtil.explainException(lastException);
             }
@@ -1409,32 +1428,38 @@
         @Override
         protected void realRun() throws SAXException, IOException, OsmTransferException {
             try {
-                progressMonitor.indeterminateSubTask("");
-                OsmServerObjectReader reader = new OsmServerObjectReader(getRelation().getId(), OsmPrimitiveType.RELATION,
-                        true);
-                DataSet dataSet = reader.parseOsm(progressMonitor
-                        .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
-                if (dataSet != null) {
-                    final MergeVisitor visitor = new MergeVisitor(getLayer().data, dataSet);
-                    visitor.merge();
-
-                    // copy the merged layer's data source info
-                    for (DataSource src : dataSet.dataSources) {
-                        getLayer().data.dataSources.add(src);
+                boolean changed = false;
+                for (Relation relation : relations) {
+                    progressMonitor.indeterminateSubTask("");
+                    OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.RELATION,
+                            true);
+                    DataSet dataSet = reader.parseOsm(progressMonitor
+                            .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
+                    if (dataSet != null) {
+                        changed = true;
+                        final MergeVisitor visitor = new MergeVisitor(curLayer.data, dataSet);
+                        visitor.merge();
+
+                        // copy the merged layer's data source info
+                        for (DataSource src : dataSet.dataSources) {
+                            curLayer.data.dataSources.add(src);
+                        }
+                        if (!visitor.getConflicts().isEmpty()) {
+                            curLayer.getConflicts().add(visitor.getConflicts());
+                            conflictsCount = visitor.getConflicts().size();
+                        }
                     }
-                    // FIXME: this is necessary because there are dialogs listening
-                    // for DataChangeEvents which manipulate Swing components on this
-                    // thread.
-                    //
+                }
+                // FIXME: this is necessary because there are dialogs listening
+                // for DataChangeEvents which manipulate Swing components on this
+                // thread.
+                //
+                if (changed) {
                     SwingUtilities.invokeLater(new Runnable() {
                         public void run() {
-                            getLayer().fireDataChange();
+                            curLayer.fireDataChange();
                         }
                     });
-                    if (!visitor.getConflicts().isEmpty()) {
-                        getLayer().getConflicts().add(visitor.getConflicts());
-                        conflictsCount = visitor.getConflicts().size();
-                    }
                 }
             } catch (Exception e) {
                 if (cancelled) {
