Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5081)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5082)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.Point;
@@ -26,5 +27,4 @@
 import javax.swing.JList;
 import javax.swing.JMenuItem;
-import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
 import javax.swing.SwingUtilities;
@@ -34,4 +34,8 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -55,4 +59,5 @@
 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;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -80,4 +85,5 @@
     private DeleteAction deleteAction;
     private NewAction newAction;
+    private AddToRelation addToRelation;
     /** the popup menu */
     private RelationDialogPopupMenu popupMenu;
@@ -145,4 +151,5 @@
         //displaylist.getActionMap().put("deleteRelation", deleteAction);
 
+        addToRelation = new AddToRelation();
         popupMenu = new RelationDialogPopupMenu(displaylist);
     }
@@ -152,4 +159,5 @@
         newAction.updateEnabledState();
         DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT);
+        DataSet.addSelectionListener(addToRelation);
         dataChanged(null);
     }
@@ -158,4 +166,5 @@
         MapView.removeLayerChangeListener(newAction);
         DatasetEventManager.getInstance().removeDatasetListener(this);
+        DataSet.removeSelectionListener(addToRelation);
     }
 
@@ -578,4 +587,38 @@
         public void valueChanged(ListSelectionEvent e) {
             updateEnabledState();
+        }
+    }
+
+    class AddToRelation extends AbstractAction implements ListSelectionListener, SelectionChangedListener {
+
+        public AddToRelation() {
+            super("", ImageProvider.get("dialogs/conflict", "copyendright"));
+            putValue(SHORT_DESCRIPTION, tr("Add all objects selected in the current dataset after the last member"));
+            setEnabled(false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            Collection<Command> cmds = new LinkedList<Command>();
+            for (Relation orig : getSelectedRelations()) {
+                Command c = GenericRelationEditor.addPrimitivesToRelation(orig, Main.main.getCurrentDataSet().getSelected());
+                if (c != null) {
+                    cmds.add(c);
+                }
+            }
+            if (!cmds.isEmpty()) {
+                Main.main.undoRedo.add(new SequenceCommand(tr("Add selection to relation"), cmds));
+            }
+        }
+
+        @Override
+        public void valueChanged(ListSelectionEvent e) {
+            putValue(NAME, trn("Add selection to {0} relation", "Add selection to {0} relations",
+                    getSelectedRelations().size(), getSelectedRelations().size()));
+        }
+
+        @Override
+        public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+            setEnabled(newSelection != null && !newSelection.isEmpty());
         }
     }
@@ -795,9 +838,7 @@
 
             // -- download members action
-            //
             add(new DownloadMembersAction());
 
             // -- download incomplete members action
-            //
             add(new DownloadSelectedIncompleteMembersAction());
 
@@ -805,12 +846,14 @@
 
             // -- select members action
-            //
             add(new SelectMembersAction(false));
             add(new SelectMembersAction(true));
 
             // -- select action
-            //
             add(new SelectAction(false));
             add(new SelectAction(true));
+
+            addSeparator();
+
+            add(addToRelation);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 5081)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 5082)
@@ -47,4 +47,5 @@
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.ConflictAddCommand;
 import org.openstreetmap.josm.data.conflict.Conflict;
@@ -688,53 +689,72 @@
     }
 
-    static class AddAbortException extends Exception  {
-    }
-
-    abstract class  AddFromSelectionAction extends AbstractAction {
+    static class AddAbortException extends Exception {
+    }
+
+    static boolean confirmAddingPrimtive(OsmPrimitive primitive) throws AddAbortException {
+        String msg = tr("<html>This relation already has one or more members referring to<br>"
+                + "the object ''{0}''<br>"
+                + "<br>"
+                + "Do you really want to add another relation member?</html>",
+                primitive.getDisplayName(DefaultNameFormatter.getInstance())
+            );
+        int ret = ConditionalOptionPaneUtil.showOptionDialog(
+                "add_primitive_to_relation",
+                Main.parent,
+                msg,
+                tr("Multiple members referring to same object."),
+                JOptionPane.YES_NO_CANCEL_OPTION,
+                JOptionPane.WARNING_MESSAGE,
+                null,
+                null
+        );
+        switch(ret) {
+        case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION : return true;
+        case JOptionPane.YES_OPTION: return true;
+        case JOptionPane.NO_OPTION: return false;
+        case JOptionPane.CLOSED_OPTION: return false;
+        case JOptionPane.CANCEL_OPTION: throw new AddAbortException();
+        }
+        // should not happen
+        return false;
+    }
+
+    static void warnOfCircularReferences(OsmPrimitive primitive) {
+        String msg = tr("<html>You are trying to add a relation to itself.<br>"
+                + "<br>"
+                + "This creates circular references and is therefore discouraged.<br>"
+                + "Skipping relation ''{0}''.</html>",
+                primitive.getDisplayName(DefaultNameFormatter.getInstance()));
+        JOptionPane.showMessageDialog(
+                Main.parent,
+                msg,
+                tr("Warning"),
+                JOptionPane.WARNING_MESSAGE);
+    }
+
+    public static Command addPrimitivesToRelation(final Relation orig, Collection<? extends OsmPrimitive> primitivesToAdd) {
+        try {
+            Relation relation = new Relation(orig);
+            boolean modified = false;
+            for (OsmPrimitive p : primitivesToAdd) {
+                if (p instanceof Relation && orig != null && orig.equals(p)) {
+                    warnOfCircularReferences(p);
+                    continue;
+                } else if (MemberTableModel.hasMembersReferringTo(relation.getMembers(), Collections.singleton(p))
+                        && !confirmAddingPrimtive(p)) {
+                    continue;
+                }
+                relation.addMember(new RelationMember("", p));
+                modified = true;
+            }
+            return modified ? new ChangeCommand(orig, relation) : null;
+        } catch (AddAbortException ign) {
+            return null;
+        }
+    }
+
+    abstract class AddFromSelectionAction extends AbstractAction {
         protected boolean isPotentialDuplicate(OsmPrimitive primitive) {
             return memberTableModel.hasMembersReferringTo(Collections.singleton(primitive));
-        }
-
-        protected boolean confirmAddingPrimtive(OsmPrimitive primitive)  throws AddAbortException {
-            String msg = tr("<html>This relation already has one or more members referring to<br>"
-                    + "the object ''{0}''<br>"
-                    + "<br>"
-                    + "Do you really want to add another relation member?</html>",
-                    primitive.getDisplayName(DefaultNameFormatter.getInstance())
-            );
-            int ret = ConditionalOptionPaneUtil.showOptionDialog(
-                    "add_primitive_to_relation",
-                    Main.parent,
-                    msg,
-                    tr("Multiple members referring to same object."),
-                    JOptionPane.YES_NO_CANCEL_OPTION,
-                    JOptionPane.WARNING_MESSAGE,
-                    null,
-                    null
-            );
-            switch(ret) {
-            case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION : return true;
-            case JOptionPane.YES_OPTION: return true;
-            case JOptionPane.NO_OPTION: return false;
-            case JOptionPane.CLOSED_OPTION: return false;
-            case JOptionPane.CANCEL_OPTION: throw new AddAbortException();
-            }
-            // should not happen
-            return false;
-        }
-
-        protected void warnOfCircularReferences(OsmPrimitive primitive) {
-            String msg = tr("<html>You are trying to add a relation to itself.<br>"
-                    + "<br>"
-                    + "This creates circular references and is therefore discouraged.<br>"
-                    + "Skipping relation ''{0}''.</html>",
-                    primitive.getDisplayName(DefaultNameFormatter.getInstance())
-            );
-            JOptionPane.showMessageDialog(
-                    Main.parent,
-                    msg,
-                    tr("Warning"),
-                    JOptionPane.WARNING_MESSAGE
-            );
         }
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 5081)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 5082)
@@ -560,7 +560,8 @@
 
     /**
-     * Replies true if there is at least one relation member in this model
-     * which refers to at least on the primitives in <code>primitives</code>.
-     *
+     * Replies true if there is at least one relation member given as {@code members}
+     * which refers to at least on the primitives in {@code primitives}.
+     *
+     * @param members the members
      * @param primitives the collection of primitives
      * @return true if there is at least one relation member in this model
@@ -568,18 +569,31 @@
      * otherwise
      */
+    public static boolean hasMembersReferringTo(Collection<RelationMember> members, Collection<OsmPrimitive> primitives) {
+        if (primitives == null || primitives.isEmpty()) {
+            return false;
+        }
+        HashSet<OsmPrimitive> referrers = new HashSet<OsmPrimitive>();
+        for (RelationMember member : members) {
+            referrers.add(member.getMember());
+        }
+        for (OsmPrimitive referred : primitives) {
+            if (referrers.contains(referred)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Replies true if there is at least one relation member in this model
+     * which refers to at least on the primitives in <code>primitives</code>.
+     *
+     * @param primitives the collection of primitives
+     * @return true if there is at least one relation member in this model
+     * which refers to at least on the primitives in <code>primitives</code>; false
+     * otherwise
+     */
     public boolean hasMembersReferringTo(Collection<OsmPrimitive> primitives) {
-        if (primitives == null || primitives.isEmpty())
-            return false;
-        HashSet<OsmPrimitive> referrers = new HashSet<OsmPrimitive>();
-        for(RelationMember member : members) {
-            referrers.add(member.getMember());
-        }
-        Iterator<OsmPrimitive> it = primitives.iterator();
-        while(it.hasNext()) {
-            OsmPrimitive referred = it.next();
-            if (referrers.contains(referred))
-                return true;
-        }
-        return false;
+        return hasMembersReferringTo(members, primitives);
     }
 
