Index: trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java	(revision 5793)
+++ trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java	(revision 5793)
@@ -0,0 +1,31 @@
+package org.openstreetmap.josm.actions.relation;
+
+
+import java.util.Collection;
+import java.util.Collections;
+import javax.swing.AbstractAction;
+import org.openstreetmap.josm.data.osm.Relation;
+
+/**
+ * Ancestor for all actions that want to work with relation collection and 
+ * to be disabled is the collection is empty
+ */
+public abstract class AbstractRelationAction extends AbstractAction {
+    protected Collection<Relation> relations = Collections.<Relation>emptySet();
+    
+    /**
+     * This fuction should be called to specify working set of relations
+     */
+    public void setRelations(Collection<Relation> relations) {
+        if (relations==null) {
+            this.relations = Collections.<Relation>emptySet();
+        } else {
+            this.relations = relations;
+        }
+        updateEnabledState();
+    }
+    
+    protected void updateEnabledState() {
+        setEnabled(!relations.isEmpty());
+    }
+}
Index: trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java	(revision 5793)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java	(revision 5793)
@@ -0,0 +1,31 @@
+package org.openstreetmap.josm.actions.relation;
+
+import java.awt.event.ActionEvent;
+import static javax.swing.Action.NAME;
+import static javax.swing.Action.SHORT_DESCRIPTION;
+import static javax.swing.Action.SMALL_ICON;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * The action for downloading members of relations
+ */
+public class DownloadMembersAction extends AbstractRelationAction {
+
+    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"));
+    }
+    
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty()) return;
+        Main.worker.submit(new DownloadRelationTask(relations, Main.map.mapView.getEditLayer()));
+    }
+}
Index: trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java	(revision 5793)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java	(revision 5793)
@@ -0,0 +1,47 @@
+package org.openstreetmap.josm.actions.relation;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import static javax.swing.Action.NAME;
+import static javax.swing.Action.SHORT_DESCRIPTION;
+import static javax.swing.Action.SMALL_ICON;
+
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * Action for downloading incomplete members of selected relations
+ */
+public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAction {
+
+    public DownloadSelectedIncompleteMembersAction() {
+        putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
+        putValue(NAME, tr("Download incomplete members"));
+    }
+
+    public Set<OsmPrimitive> buildSetOfIncompleteMembers(Collection<Relation> rels) {
+        Set<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
+        for (Relation r : rels) {
+            ret.addAll(r.getIncompleteMembers());
+        }
+        return ret;
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty()) return;
+        Main.worker.submit(new DownloadRelationMemberTask(
+                relations,
+                buildSetOfIncompleteMembers(relations),
+                Main.map.mapView.getEditLayer()));
+    }
+
+}
Index: trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java	(revision 5793)
+++ trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java	(revision 5793)
@@ -0,0 +1,59 @@
+package org.openstreetmap.josm.actions.relation;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.HashSet;
+import javax.swing.AbstractAction;
+import static javax.swing.Action.NAME;
+import static javax.swing.Action.SHORT_DESCRIPTION;
+import static javax.swing.Action.SMALL_ICON;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
+import static org.openstreetmap.josm.tools.I18n.tr;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * The action for editing a relation 
+ */
+public class EditRelationAction extends AbstractRelationAction  {
+    public EditRelationAction() {
+        putValue(NAME, tr("Edit"));
+        putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation"));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+    }
+
+    public static Collection<RelationMember> getMembersForCurrentSelection(Relation r) {
+        Collection<RelationMember> members = new HashSet<RelationMember>();
+        Collection<OsmPrimitive> selection = Main.map.mapView.getEditLayer().data.getSelected();
+        for (RelationMember member: r.getMembers()) {
+            if (selection.contains(member.getMember())) {
+                members.add(member);
+            }
+        }
+        return members;
+    }
+
+    public static void launchEditor(Relation toEdit) {
+        if (toEdit == null) return;
+        RelationEditor.getEditor(Main.map.mapView.getEditLayer(), toEdit,
+                getMembersForCurrentSelection(toEdit)).setVisible(true);
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.size()!=1) return;
+        launchEditor(relations.iterator().next());
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        // only one selected relation can be edited
+        setEnabled( relations.size()==1 );
+    }
+    
+    
+}
Index: trunk/src/org/openstreetmap/josm/actions/relation/SelectInRelationListAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/SelectInRelationListAction.java	(revision 5793)
+++ trunk/src/org/openstreetmap/josm/actions/relation/SelectInRelationListAction.java	(revision 5793)
@@ -0,0 +1,29 @@
+package org.openstreetmap.josm.actions.relation;
+
+import java.awt.event.ActionEvent;
+import static javax.swing.Action.NAME;
+import static javax.swing.Action.SHORT_DESCRIPTION;
+import static javax.swing.Action.SMALL_ICON;
+
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * The action for activating a relation in relation list dialog
+ */
+public class SelectInRelationListAction extends AbstractRelationAction {
+    public SelectInRelationListAction() {
+        putValue(NAME, tr("Select in relation list"));
+        putValue(SHORT_DESCRIPTION, tr("Select relation in relation list."));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "selectionlist"));
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty()) return;
+        if (Main.map.relationListDialog!=null)
+            Main.map.relationListDialog.selectRelations(relations);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java	(revision 5793)
+++ trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java	(revision 5793)
@@ -0,0 +1,43 @@
+package org.openstreetmap.josm.actions.relation;
+
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import static javax.swing.Action.NAME;
+import static javax.swing.Action.SHORT_DESCRIPTION;
+import static javax.swing.Action.SMALL_ICON;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+* Sets the current selection to the list of relations selected in this dialog
+*/
+public class SelectMembersAction extends AbstractRelationAction {
+    boolean add;
+    public SelectMembersAction(boolean add) {
+        putValue(SHORT_DESCRIPTION,add ? tr("Add the members of all selected relations to current selection")
+                : tr("Select the members of all selected relations"));
+        putValue(SMALL_ICON, ImageProvider.get("selectall"));
+        putValue(NAME, add ? tr("Select members (add)") : tr("Select members"));
+        this.add = add;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty()) return;
+        
+        HashSet<OsmPrimitive> members = new HashSet<OsmPrimitive>();
+        for(Relation r: relations) {
+            members.addAll(r.getMemberPrimitives());
+        }
+        if(add) {
+            Main.map.mapView.getEditLayer().data.addSelected(members);
+        } else {
+            Main.map.mapView.getEditLayer().data.setSelected(members);
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java	(revision 5793)
+++ trunk/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java	(revision 5793)
@@ -0,0 +1,36 @@
+package org.openstreetmap.josm.actions.relation;
+
+import java.awt.event.ActionEvent;
+import static javax.swing.Action.NAME;
+import static javax.swing.Action.SHORT_DESCRIPTION;
+import static javax.swing.Action.SMALL_ICON;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+/**
+ * Sets the current selection to specified list of relations 
+ */
+public class SelectRelationAction extends AbstractRelationAction {
+    boolean add;
+
+    public SelectRelationAction(boolean add) {
+        putValue(SHORT_DESCRIPTION, add ? tr("Add the selected relations to the current selection") : tr("Set the current selection to the list of selected relations"));
+        putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+        putValue(NAME, add ? tr("Select relation (add)") : tr("Select relation"));
+        this.add = add;
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if (!isEnabled() || relations.isEmpty()) return;
+        OsmDataLayer editLayer = Main.map.mapView.getEditLayer();
+        if (editLayer==null || editLayer.data==null) return;
+        if (add) {
+            editLayer.data.addSelected(relations);
+        } else {
+            editLayer.data.setSelected(relations);
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5792)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5793)
@@ -31,4 +31,5 @@
 import javax.swing.JMenuItem;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
@@ -44,4 +45,9 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.relation.DownloadMembersAction;
+import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
+import org.openstreetmap.josm.actions.relation.EditRelationAction;
+import org.openstreetmap.josm.actions.relation.SelectMembersAction;
+import org.openstreetmap.josm.actions.relation.SelectRelationAction;
 import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.command.Command;
@@ -51,5 +57,4 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
@@ -68,6 +73,4 @@
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
-import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
@@ -76,5 +79,4 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
-import org.openstreetmap.josm.gui.widgets.ListPopupMenu;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
@@ -96,10 +98,10 @@
     private final RelationListModel model;
 
-    /** the edit action */
-    private final EditAction editAction;
     /** the delete action */
     private final DeleteAction deleteAction;
     private final NewAction newAction;
     private final AddToRelation addToRelation;
+    private final DuplicateAction duplicateAction;
+    
     /** the popup menu */
     private final RelationDialogPopupMenu popupMenu;
@@ -107,4 +109,14 @@
     private final JTextField filter;
     
+    // Actions
+    /** the edit action */
+    private final EditRelationAction editAction;
+    private final DownloadMembersAction downloadMembersAction = new DownloadMembersAction();
+    private final DownloadSelectedIncompleteMembersAction downloadSelectedIncompleteMembersAction = new DownloadSelectedIncompleteMembersAction();
+    private final SelectMembersAction selectMemebersAction = new SelectMembersAction(false);
+    private final SelectMembersAction addMembersToSelectionAction = new SelectMembersAction(true);
+    private final SelectRelationAction selectRelationAction = new SelectRelationAction(false);
+    private final SelectRelationAction addRelationToSelectionAction = new SelectRelationAction(true);
+
     /**
      * constructor
@@ -139,54 +151,42 @@
         // the edit action
         //
-        editAction = new EditAction();
-        displaylist.addListSelectionListener(editAction);
-
+        editAction = new EditRelationAction();
+        
         // the duplicate action
         //
-        DuplicateAction duplicateAction = new DuplicateAction();
-        displaylist.addListSelectionListener(duplicateAction);
-
+        duplicateAction = new DuplicateAction();
+        
         // the delete action
         //
         deleteAction = new DeleteAction();
-        displaylist.addListSelectionListener(deleteAction);
-
-        // the select action
+
+        // Add to realaion action
         //
-        SelectAction selectAction = new SelectAction(false);
-        displaylist.addListSelectionListener(selectAction);
-
-        filter = new DisableShortcutsOnFocusGainedTextField();
-        filter.setToolTipText(tr("Relation list filter"));
-        filter.getDocument().addDocumentListener(new DocumentListener() {
-
-            private void setFilter() {
-                try {
-                    filter.setBackground(UIManager.getColor("TextField.background"));
-                    filter.setToolTipText(tr("Relation list filter"));
-                    model.setFilter(SearchCompiler.compile(filter.getText(), false, false));
-                } catch (SearchCompiler.ParseError ex) {
-                    filter.setBackground(new Color(255, 224, 224));
-                    filter.setToolTipText(ex.getMessage());
-                    model.setFilter(new SearchCompiler.Always());
-                }
-            }
-
+        addToRelation = new AddToRelation();
+
+        filter = setupFilter();
+
+        displaylist.addListSelectionListener(new ListSelectionListener() {
             @Override
-            public void insertUpdate(DocumentEvent e) {
-                setFilter();
-            }
-
-            @Override
-            public void removeUpdate(DocumentEvent e) {
-                setFilter();
-            }
-
-            @Override
-            public void changedUpdate(DocumentEvent e) {
-                setFilter();
+            public void valueChanged(ListSelectionEvent e) {
+                duplicateAction.valueChanged(e);
+                deleteAction.valueChanged(e);
+                addToRelation.valueChanged(e);
+
+                List<Relation> rels;
+                rels = model.getSelectedNonNewRelations();
+                downloadMembersAction.setRelations(rels);
+
+                rels = model.getSelectedRelationsWithIncompleteMembers();
+                downloadSelectedIncompleteMembersAction.setRelations(rels); 
+
+                rels = model.getSelectedRelations();
+                selectMemebersAction.setRelations(rels);
+                addMembersToSelectionAction.setRelations(rels);
+                selectRelationAction.setRelations(rels);
+                addRelationToSelectionAction.setRelations(rels);
             }
         });
-
+        
         JPanel pane = new JPanel(new BorderLayout());
         pane.add(filter, BorderLayout.NORTH);
@@ -197,5 +197,5 @@
                 new SideButton(duplicateAction, false),
                 new SideButton(deleteAction, false),
-                new SideButton(selectAction, false)
+                new SideButton(selectRelationAction, false)
         }));
 
@@ -207,8 +207,7 @@
         
         // Select relation on Ctrl-Enter
-        InputMapUtils.addEnterAction(displaylist, selectAction);
-
-        addToRelation = new AddToRelation();
-        popupMenu = new RelationDialogPopupMenu(displaylist);
+        InputMapUtils.addEnterAction(displaylist, selectRelationAction);
+
+        popupMenu = new RelationDialogPopupMenu();
 
         // Edit relation on Ctrl-Enter
@@ -216,5 +215,5 @@
         displaylist.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.CTRL_MASK), "edit");
     }
-
+    
     @Override public void showNotify() {
         MapView.addLayerChangeListener(newAction);
@@ -254,22 +253,4 @@
 
     /**
-     * Adds a selection listener to the relation list.
-     *
-     * @param listener the listener to add
-     */
-    public void addListSelectionListener(ListSelectionListener listener) {
-        displaylist.addListSelectionListener(listener);
-    }
-
-    /**
-     * Removes a selection listener from the relation list.
-     *
-     * @param listener the listener to remove
-     */
-    public void removeListSelectionListener(ListSelectionListener listener) {
-        displaylist.removeListSelectionListener(listener);
-    }
-
-    /**
      * @return The selected relation in the list
      */
@@ -306,4 +287,39 @@
     }
 
+    private JTextField  setupFilter() {
+        final JTextField f = new DisableShortcutsOnFocusGainedTextField();
+        f.setToolTipText(tr("Relation list filter"));
+        f.getDocument().addDocumentListener(new DocumentListener() {
+
+            private void setFilter() {
+                try {
+                    f.setBackground(UIManager.getColor("TextField.background"));
+                    f.setToolTipText(tr("Relation list filter"));
+                    model.setFilter(SearchCompiler.compile(filter.getText(), false, false));
+                } catch (SearchCompiler.ParseError ex) {
+                    f.setBackground(new Color(255, 224, 224));
+                    f.setToolTipText(ex.getMessage());
+                    model.setFilter(new SearchCompiler.Always());
+                }
+            }
+
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                setFilter();
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {
+                setFilter();
+            }
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {
+                setFilter();
+            }
+        });
+        return f;
+    }
+
     class MouseEventHandler extends MouseAdapter {
         protected void setCurrentRelationAsSelection() {
@@ -312,5 +328,5 @@
 
         protected void editCurrentRelation() {
-            new EditAction().launchEditor(getSelected());
+            EditRelationAction.launchEditor(getSelected());
         }
 
@@ -349,44 +365,5 @@
         }
     }
-
-    /**
-     * The edit action
-     *
-     */
-    class EditAction extends AbstractAction implements ListSelectionListener{
-        public EditAction() {
-            putValue(SHORT_DESCRIPTION,tr( "Open an editor for the selected relation"));
-            putValue(NAME, tr("Edit"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
-            setEnabled(false);
-        }
-        protected Collection<RelationMember> getMembersForCurrentSelection(Relation r) {
-            Collection<RelationMember> members = new HashSet<RelationMember>();
-            Collection<OsmPrimitive> selection = Main.map.mapView.getEditLayer().data.getSelected();
-            for (RelationMember member: r.getMembers()) {
-                if (selection.contains(member.getMember())) {
-                    members.add(member);
-                }
-            }
-            return members;
-        }
-
-        public void launchEditor(Relation toEdit) {
-            if (toEdit == null)
-                return;
-            RelationEditor.getEditor(Main.map.mapView.getEditLayer(),toEdit, getMembersForCurrentSelection(toEdit)).setVisible(true);
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if (!isEnabled())
-                return;
-            launchEditor(getSelected());
-        }
-
-        public void valueChanged(ListSelectionEvent e) {
-            setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length == 1);
-        }
-    }
-
+    
     /**
      * The delete action
@@ -498,155 +475,4 @@
         protected void updateEnabledState() {
             setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length == 1);
-        }
-
-        public void valueChanged(ListSelectionEvent e) {
-            updateEnabledState();
-        }
-    }
-
-    /**
-     * Sets the current selection to the list of relations selected in this dialog
-     *
-     */
-    class SelectAction extends AbstractAction implements ListSelectionListener{
-        boolean add;
-        public SelectAction(boolean add) {
-            putValue(SHORT_DESCRIPTION, add ? tr("Add the selected relations to the current selection")
-                    : tr("Set the current selection to the list of selected relations"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
-            putValue(NAME, add ? tr("Select relation (add)") : tr("Select relation"));
-            this.add = add;
-            updateEnabledState();
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if (!isEnabled()) return;
-            int [] idx = displaylist.getSelectedIndices();
-            if (idx == null || idx.length == 0) return;
-            ArrayList<OsmPrimitive> selection = new ArrayList<OsmPrimitive>(idx.length);
-            for (int i: idx) {
-                selection.add(model.getVisibleRelation(i));
-            }
-            if(add) {
-                Main.map.mapView.getEditLayer().data.addSelected(selection);
-            } else {
-                Main.map.mapView.getEditLayer().data.setSelected(selection);
-            }
-        }
-
-        protected void updateEnabledState() {
-            setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length > 0);
-        }
-
-        public void valueChanged(ListSelectionEvent e) {
-            updateEnabledState();
-        }
-    }
-
-    /**
-     * Sets the current selection to the list of relations selected in this dialog
-     *
-     */
-    class SelectMembersAction extends AbstractAction implements ListSelectionListener{
-        boolean add;
-        public SelectMembersAction(boolean add) {
-            putValue(SHORT_DESCRIPTION,add ? tr("Add the members of all selected relations to current selection")
-                    : tr("Select the members of all selected relations"));
-            putValue(SMALL_ICON, ImageProvider.get("selectall"));
-            putValue(NAME, add ? tr("Select members (add)") : tr("Select members"));
-            this.add = add;
-            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());
-            }
-            if(add) {
-                Main.map.mapView.getEditLayer().data.addSelected(members);
-            } else {
-                Main.map.mapView.getEditLayer().data.setSelected(members);
-            }
-        }
-
-        protected void updateEnabledState() {
-            setEnabled(displaylist.getSelectedIndices() != null && displaylist.getSelectedIndices().length > 0);
-        }
-
-        public void valueChanged(ListSelectionEvent e) {
-            updateEnabledState();
-        }
-    }
-
-    /**
-     * The action for downloading members of all selected relations
-     *
-     */
-    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 DownloadRelationTask(
-                    model.getSelectedNonNewRelations(),
-                    Main.map.mapView.getEditLayer())
-                    );
-        }
-    }
-
-    /**
-     * Action for downloading incomplete members of selected relations
-     *
-     */
-    class DownloadSelectedIncompleteMembersAction extends AbstractAction implements ListSelectionListener{
-        public DownloadSelectedIncompleteMembersAction() {
-            putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
-            putValue(NAME, tr("Download incomplete members"));
-            updateEnabledState();
-        }
-
-        public Set<OsmPrimitive> buildSetOfIncompleteMembers(List<Relation> rels) {
-            Set<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
-            for(Relation r: rels) {
-                ret.addAll(r.getIncompleteMembers());
-            }
-            return ret;
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if (!isEnabled())
-                return;
-            List<Relation> rels = model.getSelectedRelationsWithIncompleteMembers();
-            if (rels.isEmpty()) return;
-            Main.worker.submit(new DownloadRelationMemberTask(
-                    rels,
-                    buildSetOfIncompleteMembers(rels),
-                    Main.map.mapView.getEditLayer()
-                    ));
-        }
-
-        protected void updateEnabledState() {
-            setEnabled(!model.getSelectedRelationsWithIncompleteMembers().isEmpty());
         }
 
@@ -955,24 +781,22 @@
     }
 
-    class RelationDialogPopupMenu extends ListPopupMenu {
-
-        public RelationDialogPopupMenu(JList list) {
-            super(list);
-
+    class RelationDialogPopupMenu extends JPopupMenu {
+
+        public RelationDialogPopupMenu() {
             // -- download members action
-            add(new DownloadMembersAction());
+            add(downloadMembersAction);
 
             // -- download incomplete members action
-            add(new DownloadSelectedIncompleteMembersAction());
+            add(downloadSelectedIncompleteMembersAction);
 
             addSeparator();
 
             // -- select members action
-            add(new SelectMembersAction(false));
-            add(new SelectMembersAction(true));
+            add(selectMemebersAction);
+            add(addMembersToSelectionAction);
 
             // -- select action
-            add(new SelectAction(false));
-            add(new SelectAction(true));
+            add(selectRelationAction);
+            add(addRelationToSelectionAction);
 
             addSeparator();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 5792)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 5793)
@@ -39,4 +39,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AutoScaleAction;
+import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
+import org.openstreetmap.josm.actions.relation.EditRelationAction;
+import org.openstreetmap.josm.actions.relation.SelectInRelationListAction;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
 import org.openstreetmap.josm.data.SelectionChangedListener;
@@ -46,5 +49,4 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
@@ -66,6 +68,4 @@
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
-import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.widgets.ListPopupMenu;
@@ -88,6 +88,6 @@
     private ZoomToJOSMSelectionAction actZoomToJOSMSelection;
     private ZoomToListSelection actZoomToListSelection;
-    private SetRelationSelection actSetRelationSelection;
-    private EditRelationSelection actEditRelationSelection;
+    private SelectInRelationListAction actSetRelationSelection;
+    private EditRelationAction actEditRelationSelection;
     private DownloadSelectedIncompleteMembersAction actDownloadSelectedIncompleteMembers;
 
@@ -142,8 +142,21 @@
 
         actZoomToListSelection = new ZoomToListSelection();
-        actSetRelationSelection = new SetRelationSelection();
-        actEditRelationSelection = new EditRelationSelection();
+        actSetRelationSelection = new SelectInRelationListAction();
+        actEditRelationSelection = new EditRelationAction();
         actDownloadSelectedIncompleteMembers = new DownloadSelectedIncompleteMembersAction();
 
+        lstPrimitives.addListSelectionListener(new ListSelectionListener() {
+            @Override
+            public void valueChanged(ListSelectionEvent e) {
+                actZoomToListSelection.valueChanged(e);
+                List<Relation> rels;
+                rels = model.getSelectedRelationsWithIncompleteMembers();
+                actDownloadSelectedIncompleteMembers.setRelations(rels); 
+                rels = OsmPrimitive.getFilteredList(model.getSelected(), Relation.class);
+                actSetRelationSelection.setRelations(rels);
+                actEditRelationSelection.setRelations(rels);
+            }
+        });
+                
         lstPrimitives.addMouseListener(new SelectionPopupMenuLauncher());
         lstPrimitives.addMouseListener(new DblClickHandler());
@@ -250,12 +263,15 @@
         }
 
+        @Override
         public void contentsChanged(ListDataEvent e) {
             updateTitle();
         }
 
+        @Override
         public void intervalAdded(ListDataEvent e) {
             updateTitle();
         }
 
+        @Override
         public void intervalRemoved(ListDataEvent e) {
             updateTitle();
@@ -274,4 +290,5 @@
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             if (!isEnabled()) return;
@@ -283,4 +300,5 @@
         }
 
+        @Override
         public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
             updateEnabledState();
@@ -329,4 +347,5 @@
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             AutoScaleAction.autoScale("selection");
@@ -337,12 +356,15 @@
         }
 
+        @Override
         public void contentsChanged(ListDataEvent e) {
             updateEnabledState();
         }
 
+        @Override
         public void intervalAdded(ListDataEvent e) {
             updateEnabledState();
         }
 
+        @Override
         public void intervalRemoved(ListDataEvent e) {
             updateEnabledState();
@@ -363,4 +385,5 @@
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             BoundingXYVisitor box = new BoundingXYVisitor();
@@ -378,59 +401,5 @@
         }
 
-        public void valueChanged(ListSelectionEvent e) {
-            updateEnabledState();
-        }
-    }
-
-    /**
-     * The action for setting and editing a relation in relation list dialog
-     *
-     */
-    class EditRelationSelection extends SetRelationSelection {
-        public EditRelationSelection() {
-            putValue(NAME, tr("Call editor for relation"));
-            putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
-            updateEnabledState();
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            Relation relation = (Relation)model.getSelected().toArray()[0];
-            Collection<RelationMember> members = new HashSet<RelationMember>();
-            Collection<OsmPrimitive> selection = model.getAllElements();
-            for (RelationMember member: relation.getMembers()) {
-                if (selection.contains(member.getMember())) {
-                    members.add(member);
-                }
-            }
-            Main.map.relationListDialog.selectRelation(relation);
-            RelationEditor.getEditor(Main.map.mapView.getEditLayer(), relation,
-                    members).setVisible(true);
-        }
-    }
-
-    /**
-     * The action for setting a relation in relation list dialog
-     *
-     */
-    class SetRelationSelection extends AbstractAction implements ListSelectionListener{
-        public SetRelationSelection() {
-            putValue(NAME, tr("Select in relation list"));
-            putValue(SHORT_DESCRIPTION, tr("Select relation in relation list."));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "selectionlist"));
-            updateEnabledState();
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            Relation relation = (Relation)model.getSelected().toArray()[0];
-            Main.map.relationListDialog.selectRelation(relation);
-        }
-
-        public void updateEnabledState() {
-            Object[] sel = model.getSelected().toArray();
-            setEnabled(sel.length == 1 && sel[0] instanceof Relation);
-        }
-
+        @Override
         public void valueChanged(ListSelectionEvent e) {
             updateEnabledState();
@@ -663,4 +632,5 @@
         /* interface EditLayerChangeListener                                        */
         /* ------------------------------------------------------------------------ */
+        @Override
         public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
             if (newLayer == null) {
@@ -676,4 +646,5 @@
         /* interface SelectionChangeListener                                        */
         /* ------------------------------------------------------------------------ */
+        @Override
         public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
             setJOSMSelection(newSelection);
@@ -683,4 +654,5 @@
         /* interface DataSetListener                                                */
         /* ------------------------------------------------------------------------ */
+        @Override
         public void dataChanged(DataChangedEvent event) {
             // refresh the whole list
@@ -688,4 +660,5 @@
         }
 
+        @Override
         public void nodeMoved(NodeMovedEvent event) {
             // may influence the display name of primitives, update the data
@@ -693,4 +666,5 @@
         }
 
+        @Override
         public void otherDatasetChange(AbstractDatasetChangedEvent event) {
             // may influence the display name of primitives, update the data
@@ -698,4 +672,5 @@
         }
 
+        @Override
         public void relationMembersChanged(RelationMembersChangedEvent event) {
             // may influence the display name of primitives, update the data
@@ -703,4 +678,5 @@
         }
 
+        @Override
         public void tagsChanged(TagsChangedEvent event) {
             // may influence the display name of primitives, update the data
@@ -708,4 +684,5 @@
         }
 
+        @Override
         public void wayNodesChanged(WayNodesChangedEvent event) {
             // may influence the display name of primitives, update the data
@@ -713,5 +690,7 @@
         }
 
+        @Override
         public void primitivesAdded(PrimitivesAddedEvent event) {/* ignored - handled by SelectionChangeListener */}
+        @Override
         public void primitivesRemoved(PrimitivesRemovedEvent event) {/* ignored - handled by SelectionChangeListener*/}
     }
@@ -731,4 +710,5 @@
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             org.openstreetmap.josm.actions.search.SearchAction.searchWithoutHistory(s);
@@ -811,4 +791,5 @@
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             Main.main.getCurrentDataSet().setSelected(sel);
@@ -832,45 +813,4 @@
                 add(new SelectionMenuItem(sel));
             }
-        }
-    }
-
-    /**
-     * Action for downloading incomplete members of selected relations
-     *
-     */
-    class DownloadSelectedIncompleteMembersAction extends AbstractAction implements ListSelectionListener {
-        public DownloadSelectedIncompleteMembersAction() {
-            putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
-            putValue(NAME, tr("Download incomplete members"));
-            updateEnabledState();
-        }
-
-        public Set<OsmPrimitive> buildSetOfIncompleteMembers(List<Relation> rels) {
-            Set<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
-            for(Relation r: rels) {
-                ret.addAll(r.getIncompleteMembers());
-            }
-            return ret;
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if (!isEnabled())
-                return;
-            List<Relation> rels = model.getSelectedRelationsWithIncompleteMembers();
-            if (rels.isEmpty()) return;
-            Main.worker.submit(new DownloadRelationMemberTask(
-                    rels,
-                    buildSetOfIncompleteMembers(rels),
-                    Main.map.mapView.getEditLayer()
-            ));
-        }
-
-        protected void updateEnabledState() {
-            setEnabled(!model.getSelectedRelationsWithIncompleteMembers().isEmpty());
-        }
-
-        public void valueChanged(ListSelectionEvent e) {
-            updateEnabledState();
         }
     }
@@ -897,4 +837,5 @@
         }
 
+        @Override
         public int compare(OsmPrimitive a, OsmPrimitive b) {
             if (a.getType().equals(b.getType()))
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 5792)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 5793)
@@ -53,4 +53,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
+import org.openstreetmap.josm.actions.relation.SelectMembersAction;
+import org.openstreetmap.josm.actions.relation.SelectRelationAction;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchMode;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
@@ -181,4 +184,10 @@
     private final JosmAction[] josmActions = new JosmAction[]{addAction, editAction, deleteAction};
 
+    // relation actions
+    private final DownloadSelectedIncompleteMembersAction downloadSelectedIncompleteMembersAction = new DownloadSelectedIncompleteMembersAction();
+    private final SelectRelationAction addRelationToSelectionAction = new SelectRelationAction(true);
+    private final SelectMembersAction addMembersToSelectionAction = new SelectMembersAction(true);
+    private final SelectRelationAction selectRelationAction = new SelectRelationAction(false);
+    
     @Override
     public void showNotify() {
@@ -379,13 +388,13 @@
         // setting up the membership table
         membershipMenu = new JPopupMenu();
-        membershipMenu.add(new SelectRelationAction(true));
-        membershipMenu.add(new SelectRelationAction(false));
-        membershipMenu.add(new SelectRelationMembersAction());
-        membershipMenu.add(new DownloadIncompleteMembersAction());
+        membershipMenu.add(addRelationToSelectionAction);
+        membershipMenu.add(selectRelationAction);
+        membershipMenu.add(addMembersToSelectionAction);
+        membershipMenu.add(downloadSelectedIncompleteMembersAction);
         membershipMenu.addSeparator();
         membershipMenu.add(helpAction);
 
         membershipData.setColumnIdentifiers(new String[]{tr("Member Of"),tr("Role"),tr("Position")});
-        membershipTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+        membershipTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         membershipTable.addMouseListener(new PopupMenuLauncher() {
             @Override
@@ -393,17 +402,18 @@
                 Point p = evt.getPoint();
                 int row = membershipTable.rowAtPoint(p);
-                if (row > -1) {
-                    membershipTable.changeSelection(row, 0, false, false);
-                    Relation relation = (Relation)membershipData.getValueAt(row, 0);
-                    for (Component c : membershipMenu.getComponents()) {
-                        if (c instanceof JMenuItem) {
-                            Action action = ((JMenuItem) c).getAction();
-                            if (action instanceof RelationRelated) {
-                                ((RelationRelated)action).setRelation(relation);
-                            }
-                        }
+                membershipTable.changeSelection(row, 0, false, false);
+                int idx[] = membershipTable.getSelectedRows();
+                List<Relation> rels =  new ArrayList<Relation>(10);
+                if (idx!=null) {
+                    for (int i: idx) {
+                        Relation r = (Relation) (membershipData.getValueAt(i, 0));
+                        rels.add(r);
                     }
-                    membershipMenu.show(membershipTable, p.x, p.y-3);
-                }
+                }
+                selectRelationAction.setRelations(rels);
+                addMembersToSelectionAction.setRelations(rels);
+                addMembersToSelectionAction.setRelations(rels);
+                downloadSelectedIncompleteMembersAction.setRelations(rels);
+                membershipMenu.show(membershipTable, p.x, p.y-3);
             }
         });
@@ -1044,93 +1054,4 @@
     }
 
-    public static interface RelationRelated {
-        public Relation getRelation();
-        public void setRelation(Relation relation);
-    }
-
-    static abstract class AbstractRelationAction extends AbstractAction implements RelationRelated {
-        protected Relation relation;
-        public Relation getRelation() {
-            return this.relation;
-        }
-        public void setRelation(Relation relation) {
-            this.relation = relation;
-        }
-    }
-
-    static class SelectRelationAction extends AbstractRelationAction {
-        boolean selectionmode;
-        public SelectRelationAction(boolean select) {
-            selectionmode = select;
-            if(select) {
-                putValue(NAME, tr("Select relation"));
-                putValue(SHORT_DESCRIPTION, tr("Select relation in main selection."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
-            } else {
-                putValue(NAME, tr("Select in relation list"));
-                putValue(SHORT_DESCRIPTION, tr("Select relation in relation list."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "relationlist"));
-            }
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if(selectionmode) {
-                Main.map.mapView.getEditLayer().data.setSelected(relation);
-            } else {
-                Main.map.relationListDialog.selectRelation(relation);
-                Main.map.relationListDialog.unfurlDialog();
-            }
-        }
-    }
-
-
-    /**
-     * Sets the current selection to the members of selected relation
-     *
-     */
-    class SelectRelationMembersAction extends AbstractRelationAction {
-        public SelectRelationMembersAction() {
-            putValue(SHORT_DESCRIPTION,tr("Select the members of selected relation"));
-            putValue(SMALL_ICON, ImageProvider.get("selectall"));
-            putValue(NAME, tr("Select members"));
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            HashSet<OsmPrimitive> members = new HashSet<OsmPrimitive>();
-            members.addAll(relation.getMemberPrimitives());
-            Main.map.mapView.getEditLayer().data.setSelected(members);
-        }
-
-    }
-
-    /**
-     * Action for downloading incomplete members of selected relation
-     *
-     */
-    class DownloadIncompleteMembersAction extends AbstractRelationAction {
-        public DownloadIncompleteMembersAction() {
-            putValue(SHORT_DESCRIPTION, tr("Download incomplete members of selected relations"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/relation", "downloadincompleteselected"));
-            putValue(NAME, tr("Download incomplete members"));
-        }
-
-        public Set<OsmPrimitive> buildSetOfIncompleteMembers(Relation r) {
-            Set<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
-            ret.addAll(r.getIncompleteMembers());
-            return ret;
-        }
-
-        public void actionPerformed(ActionEvent e) {
-            if (!relation.hasIncompleteMembers()) return;
-            ArrayList<Relation> rels = new ArrayList<Relation>();
-            rels.add(relation);
-            Main.worker.submit(new DownloadRelationMemberTask(
-                    rels,
-                    buildSetOfIncompleteMembers(relation),
-                    Main.map.mapView.getEditLayer()
-                    ));
-        }
-    }
-    
     class PasteValueAction extends AbstractAction {
         public PasteValueAction() {
