Index: trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/actions/UpdateDataAction.java	(revision 2317)
@@ -19,5 +19,5 @@
         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"),
Index: trunk/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 2317)
@@ -117,5 +117,5 @@
 
     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: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2317)
@@ -5,10 +5,9 @@
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -16,5 +15,4 @@
 
 import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 
 /**
@@ -135,7 +133,6 @@
             relations.add(relation);
             return relation;
-        } else {
+        } else
             throw new AssertionError();
-        }
     }
 
@@ -170,6 +167,7 @@
         for (OsmPrimitive osm : selectedPrimitives) {
             if (osm instanceof Way ||
-                osm instanceof Node)
+                    osm instanceof Node) {
                 sel.add(osm);
+            }
         }
         return sel;
@@ -245,6 +243,7 @@
 
     public boolean toggleSelected(OsmPrimitive osm) {
-        if (!selectedPrimitives.remove(osm))
+        if (!selectedPrimitives.remove(osm)) {
             selectedPrimitives.add(osm);
+        }
         return true;
     }
@@ -480,13 +479,12 @@
             OsmPrimitive result = null;
             switch (type) {
-            case NODE: result = new Node(id, true); break;
-            case WAY: result = new Way(id, true); break;
-            case RELATION: result = new Relation(id, true); break;
+                case NODE: result = new Node(id, true); break;
+                case WAY: result = new Way(id, true); break;
+                case RELATION: result = new Relation(id, true); break;
             }
             addPrimitive(result);
             return result;
-        } else {
+        } else
             return null;
-        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(revision 2317)
@@ -271,4 +271,5 @@
         if (numPanels == 1 && panels.get(N-1).getComponents().length == 0)
         {
+            parent.setDividerSize(0);
             this.setVisible(false);
         } else {
@@ -277,4 +278,5 @@
             }
             this.setVisible(true);
+            parent.setDividerSize(5);
             parent.resetToPreferredSizes();
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2317)
@@ -1,8 +1,10 @@
 package org.openstreetmap.josm.gui.dialogs;
 
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.BorderLayout;
 import java.awt.GridLayout;
+import java.awt.Point;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -10,14 +12,18 @@
 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.DefaultListSelectionModel;
 import javax.swing.JList;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.KeyStroke;
@@ -36,4 +42,5 @@
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.DataChangeListener;
@@ -64,4 +71,6 @@
     /** the delete action */
     private DeleteAction deleteAction;
+    /** the popup menu */
+    private RelationDialogPopupMenu popupMenu;
 
 
@@ -75,9 +84,11 @@
         // create the list of relations
         //
-        model = new RelationListModel();
+        DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
+        model = new RelationListModel(selectionModel);
         displaylist = new JList(model);
+        displaylist.setSelectionModel(selectionModel);
         displaylist.setCellRenderer(new OsmPrimitivRenderer());
         displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
-        displaylist.addMouseListener(new DoubleClickAdapter());
+        displaylist.addMouseListener(new MouseEventHandler());
         add(new JScrollPane(displaylist), BorderLayout.CENTER);
 
@@ -119,4 +130,6 @@
         displaylist.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0), "deleteRelation");
         displaylist.getActionMap().put("deleteRelation", deleteAction);
+
+        popupMenu = new RelationDialogPopupMenu();
 
         // register as layer listener
@@ -170,5 +183,5 @@
             return;
         }
-        Relation selected = getSelected();
+        Relation[] selected = getAllSelected();
 
         model.setRelations(getDisplayedRelationsInSortOrder(Main.main.getCurrentDataSet()));
@@ -178,5 +191,5 @@
             setTitle(tr("Relations"));
         }
-        selectRelation(selected);
+        selectRelations(selected);
     }
 
@@ -240,4 +253,11 @@
 
     /**
+     * @return All selected relations in the list, possibly empty List
+     */
+    private Relation[] getAllSelected() {
+        return Arrays.asList(displaylist.getSelectedValues()).toArray(new Relation[0]);
+    }
+
+    /**
      * Selects the relation <code>relation</code> in the list of relations.
      *
@@ -245,18 +265,40 @@
      */
     public void selectRelation(Relation relation) {
-        if (relation == null){
+        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);
+            }
+        }
+        if (sel.isEmpty()) {
             displaylist.clearSelection();
             return;
-        }
-        int idx = model.getIndexOfRelation(relation);
-        if (idx == -1) {
-            displaylist.clearSelection();
         } else {
-            displaylist.setSelectedIndex(idx);
-            displaylist.scrollRectToVisible(displaylist.getCellBounds(idx,idx));
-        }
-    }
-
-    class DoubleClickAdapter extends MouseAdapter {
+            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 MouseEventHandler extends MouseAdapter {
         protected void setCurrentRelationAsSelection() {
             Main.main.getCurrentDataSet().setSelected((Relation)displaylist.getSelectedValue());
@@ -274,4 +316,25 @@
                     setCurrentRelationAsSelection();
                 }
+            }
+        }
+        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;
+            if (! displaylist.isSelectedIndex(index)) {
+                displaylist.setSelectedIndex(index);
+            }
+            popupMenu.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);
             }
         }
@@ -441,5 +504,4 @@
         public SelectAction() {
             putValue(SHORT_DESCRIPTION,tr("Set the current selection to the list of selected relations"));
-            //putValue(NAME, tr("Select"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
             setEnabled(false);
@@ -463,6 +525,72 @@
     }
 
+    /**
+     * Sets the current selection to the list of relations selected in this dialog
+     *
+     */
+    class SelectMembersAction extends AbstractAction implements ListSelectionListener{
+        public SelectMembersAction() {
+            putValue(SHORT_DESCRIPTION,tr("Select the members of all selected relations"));
+            putValue(SMALL_ICON, ImageProvider.get("selectall"));
+            putValue(NAME, tr("Select members"));
+            updateEnabledState();
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            if (!isEnabled()) return;
+            List<Relation> relations = model.getSelectedRelations();
+            HashSet<OsmPrimitive> members = new HashSet<OsmPrimitive>();
+            for(Relation r: relations) {
+                members.addAll(r.getMemberPrimitives());
+            }
+            Main.map.mapView.getEditLayer().data.setSelected(members);
+            DataSet.fireSelectionChanged(members);
+        }
+
+        protected void updateEnabledState() {
+            setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length > 0);
+        }
+
+        public void valueChanged(ListSelectionEvent e) {
+            updateEnabledState();
+        }
+    }
+
+
+    class DownloadMembersAction extends AbstractAction implements ListSelectionListener{
+
+        public DownloadMembersAction() {
+            putValue(SHORT_DESCRIPTION,tr("Download all members of the selected relations"));
+            putValue(NAME, tr("Download members"));
+            putValue(SMALL_ICON, ImageProvider.get("dialogs", "downloadincomplete"));
+            putValue("help", ht("/Dialog/RelationList#DownloadMembers"));
+            updateEnabledState();
+        }
+
+        protected void updateEnabledState() {
+            setEnabled(! model.getSelectedNonNewRelations().isEmpty());
+        }
+
+        public void valueChanged(ListSelectionEvent e) {
+            updateEnabledState();
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            List<Relation> relations = model.getSelectedNonNewRelations();
+            if (relations.isEmpty())
+                return;
+            Main.worker.submit(new GenericRelationEditor.DownloadTask(
+                    model.getSelectedNonNewRelations(),
+                    Main.map.mapView.getEditLayer(), null));
+        }
+    }
+
     private static  class RelationListModel extends AbstractListModel {
         private ArrayList<Relation> relations;
+        private DefaultListSelectionModel selectionModel;
+
+        public RelationListModel(DefaultListSelectionModel selectionModel) {
+            this.selectionModel = selectionModel;
+        }
 
         public ArrayList<Relation> getRelations() {
@@ -493,4 +621,62 @@
             return relations.indexOf(relation);
         }
+
+        /**
+         * Replies the list of selected, non-new relations. Empty list,
+         * if there are no selected, non-new relations.
+         * 
+         * @return the list of selected, non-new relations.
+         */
+        public List<Relation> getSelectedNonNewRelations() {
+            ArrayList<Relation> ret = new ArrayList<Relation>();
+            for (int i=0; i<getSize();i++) {
+                if (!selectionModel.isSelectedIndex(i)) {
+                    continue;
+                }
+                if (relations.get(i).isNew()) {
+                    continue;
+                }
+                ret.add(relations.get(i));
+            }
+            return ret;
+        }
+
+        /**
+         * Replies the list of selected relations. Empty list,
+         * if there are no selected relations.
+         * 
+         * @return the list of selected, non-new relations.
+         */
+        public List<Relation> getSelectedRelations() {
+            ArrayList<Relation> ret = new ArrayList<Relation>();
+            for (int i=0; i<getSize();i++) {
+                if (!selectionModel.isSelectedIndex(i)) {
+                    continue;
+                }
+                ret.add(relations.get(i));
+            }
+            return ret;
+        }
+    }
+
+    class RelationDialogPopupMenu extends JPopupMenu {
+
+        protected void build() {
+            // -- download members action
+            //
+            DownloadMembersAction downloadMembersAction = new DownloadMembersAction();
+            displaylist.addListSelectionListener(downloadMembersAction);
+            add(downloadMembersAction);
+
+            // -- select members action
+            //
+            SelectMembersAction selectMembersAction = new SelectMembersAction();
+            displaylist.addListSelectionListener(selectMembersAction);
+            add(selectMembersAction);
+        }
+
+        public RelationDialogPopupMenu() {
+            build();
+        }
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2317)
@@ -1203,5 +1203,10 @@
             if (!isEnabled())
                 return;
-            Main.worker.submit(new DownloadTask(GenericRelationEditor.this));
+            Main.worker.submit(new DownloadTask(
+                    Collections.singletonList(getRelation()),
+                    getLayer(),
+                    memberTableModel,
+                    GenericRelationEditor.this)
+            );
         }
 
@@ -1369,10 +1374,13 @@
      *
      */
-    class DownloadTask extends PleaseWaitRunnable {
+    public static class DownloadTask extends PleaseWaitRunnable {
         private boolean cancelled;
         private int conflictsCount;
         private Exception lastException;
-
-        public DownloadTask(Dialog parent) {
+        private List<Relation> relations;
+        private OsmDataLayer curLayer;
+        private MemberTableModel memberTableModel;
+
+        public DownloadTask(List<Relation> relations, OsmDataLayer curLayer, MemberTableModel memberTableModel, Dialog parent) {
             super(tr("Download relation members"), new PleaseWaitProgressMonitor(parent), false /*
              * don't
@@ -1380,4 +1388,18 @@
              * exception
              */);
+            this.relations = relations;
+            this.curLayer = curLayer;
+            this.memberTableModel = memberTableModel;
+        }
+
+        public DownloadTask(List<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;
         }
 
@@ -1390,7 +1412,10 @@
         @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);
@@ -1410,30 +1435,36 @@
         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) {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberRoleCellEditor.java	(revision 2317)
@@ -41,5 +41,4 @@
         String role = (String)value;
         editor.setText(role);
-        System.out.println(role + " - initializing autocompletion list ...");
         AutoCompletionCache.getCacheForLayer(Main.main.getEditLayer()).populateWithMemberRoles(autoCompletionList);
         autoCompletionList.dump();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2317)
@@ -18,8 +18,6 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
@@ -87,10 +85,10 @@
     public Object getValueAt(int rowIndex, int columnIndex) {
         switch (columnIndex) {
-        case 0:
-            return members.get(rowIndex).getRole();
-        case 1:
-            return members.get(rowIndex).getMember();
-        case 2:
-            return wayConnection(rowIndex);
+            case 0:
+                return members.get(rowIndex).getRole();
+            case 1:
+                return members.get(rowIndex).getMember();
+            case 2:
+                return wayConnection(rowIndex);
         }
         // should not happen
@@ -197,20 +195,4 @@
         }
         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();
     }
 
@@ -724,12 +706,10 @@
     private WayConnectionType wayConnection(int i) {
         RelationMember m = members.get(i);
-        if (! m.isWay()) {
+        if (! m.isWay())
             return new WayConnectionType();
-        }
         Way w = m.getWay();
-        if (w == null || w.incomplete) {
+        if (w == null || w.incomplete)
             return new WayConnectionType();
-        }
-        
+
         int ip = (i - 1 + members.size()) % members.size();
         Integer link_p = linked(ip);
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserCommandProcessor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserCommandProcessor.java	(revision 2316)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowserCommandProcessor.java	(revision 2317)
@@ -1,14 +1,13 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.help;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import javax.swing.SwingUtilities;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 /**
@@ -71,7 +70,5 @@
             try {
                 cmd = reader.readLine();
-                logger.info("got command: " + cmd);
             } catch(IOException e) {
-                logger.log(Level.SEVERE,e.toString());
                 System.out.println(tr("Failed to read command. Exiting help browser. Exception was:" + e.toString()));
                 System.exit(1);
