Index: /trunk/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java	(revision 9369)
+++ /trunk/src/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferable.java	(revision 9369)
@@ -0,0 +1,61 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.datatransfer;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.PrimitiveData;
+import org.openstreetmap.josm.gui.DefaultNameFormatter;
+
+public class PrimitiveTransferable implements Transferable {
+
+    public static final DataFlavor PRIMITIVE_DATA = new DataFlavor(PrimitiveData.class, PrimitiveData.class.getName());
+    private final Collection<OsmPrimitive> primitives;
+
+    public PrimitiveTransferable(Collection<OsmPrimitive> members) {
+        this.primitives = members;
+    }
+
+    @Override
+    public DataFlavor[] getTransferDataFlavors() {
+        return new DataFlavor[]{PRIMITIVE_DATA, DataFlavor.stringFlavor};
+    }
+
+    @Override
+    public boolean isDataFlavorSupported(DataFlavor flavor) {
+        return flavor == PRIMITIVE_DATA;
+    }
+
+    @Override
+    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
+        if (DataFlavor.stringFlavor.equals(flavor)) {
+            return getStringData();
+        } else if (PRIMITIVE_DATA.equals(flavor)) {
+            return getRelationMemberData();
+        }
+        throw new UnsupportedFlavorException(flavor);
+    }
+
+    protected String getStringData() {
+        final StringBuilder sb = new StringBuilder();
+        for (OsmPrimitive primitive : primitives) {
+            sb.append(primitive.getType());
+            sb.append(" ").append(primitive.getUniqueId());
+            sb.append(" # ").append(primitive.getDisplayName(DefaultNameFormatter.getInstance()));
+            sb.append("\n");
+        }
+        return sb.toString().replace("\u200E", "").replace("\u200F", "");
+    }
+
+    protected Collection<PrimitiveData> getRelationMemberData() {
+        final Collection<PrimitiveData> r = new ArrayList<>(primitives.size());
+        for (OsmPrimitive primitive : primitives) {
+            r.add(primitive.save());
+        }
+        return r;
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 9368)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 9369)
@@ -7,4 +7,5 @@
 import java.awt.Component;
 import java.awt.Rectangle;
+import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -24,8 +25,10 @@
 import javax.swing.AbstractListModel;
 import javax.swing.DefaultListSelectionModel;
+import javax.swing.JComponent;
 import javax.swing.JList;
 import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
 import javax.swing.ListSelectionModel;
+import javax.swing.TransferHandler;
 import javax.swing.event.ListDataEvent;
 import javax.swing.event.ListDataListener;
@@ -66,4 +69,5 @@
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -108,6 +112,6 @@
         lstPrimitives.setSelectionModel(selectionModel);
         lstPrimitives.setCellRenderer(new OsmPrimitivRenderer());
-        // Fix #6290. Drag & Drop is not supported anyway and Copy/Paste is better propagated to main window
-        lstPrimitives.setTransferHandler(null);
+        lstPrimitives.setTransferHandler(new SelectionTransferHandler());
+        lstPrimitives.setDragEnabled(true);
 
         lstPrimitives.getSelectionModel().addListSelectionListener(actSelect);
@@ -855,3 +859,19 @@
         }
     }
+
+    /**
+     * A transfer handler class for drag-and-drop support.
+     */
+    protected class SelectionTransferHandler extends TransferHandler {
+
+        @Override
+        public int getSourceActions(JComponent c) {
+            return COPY;
+        }
+
+        @Override
+        protected Transferable createTransferable(JComponent c) {
+            return new PrimitiveTransferable(getSelectedPrimitives());
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 9368)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 9369)
@@ -423,20 +423,9 @@
 
     private void addMembersAtIndex(List<? extends OsmPrimitive> primitives, int index) {
-        final Collection<TaggingPreset> presets = TaggingPresets.getMatchingPresets(EnumSet.of(TaggingPresetType.RELATION),
-                presetHandler.getSelection().iterator().next().getKeys(), false);
         if (primitives == null)
             return;
         int idx = index;
         for (OsmPrimitive primitive : primitives) {
-            Set<String> potentialRoles = new TreeSet<>();
-            for (TaggingPreset tp : presets) {
-                String suggestedRole = tp.suggestRoleForOsmPrimitive(primitive);
-                if (suggestedRole != null) {
-                    potentialRoles.add(suggestedRole);
-                }
-            }
-            // TODO: propose user to choose role among potential ones instead of picking first one
-            final String role = potentialRoles.isEmpty() ? null : potentialRoles.iterator().next();
-            RelationMember member = new RelationMember(role == null ? "" : role, primitive);
+            final RelationMember member = getRelationMemberForPrimitive(primitive);
             members.add(idx++, member);
         }
@@ -445,4 +434,19 @@
         getSelectionModel().addSelectionInterval(index, index + primitives.size() - 1);
         fireMakeMemberVisible(index);
+    }
+
+    RelationMember getRelationMemberForPrimitive(final OsmPrimitive primitive) {
+        final Collection<TaggingPreset> presets = TaggingPresets.getMatchingPresets(EnumSet.of(TaggingPresetType.RELATION),
+                presetHandler.getSelection().iterator().next().getKeys(), false);
+        Collection<String> potentialRoles = new TreeSet<>();
+        for (TaggingPreset tp : presets) {
+            String suggestedRole = tp.suggestRoleForOsmPrimitive(primitive);
+            if (suggestedRole != null) {
+                potentialRoles.add(suggestedRole);
+            }
+        }
+        // TODO: propose user to choose role among potential ones instead of picking first one
+        final String role = potentialRoles.isEmpty() ? "" : potentialRoles.iterator().next();
+        return new RelationMember(role == null ? "" : role, primitive);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java	(revision 9368)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java	(revision 9369)
@@ -16,7 +16,10 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.PrimitiveData;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
+import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
 import org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable;
+import org.openstreetmap.josm.tools.Utils.Function;
 
 class MemberTransferHandler extends TransferHandler {
@@ -36,37 +39,71 @@
     public boolean canImport(TransferSupport support) {
         support.setShowDropLocation(true);
-        return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA);
+        return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)
+                || support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA);
     }
 
     @Override
     public boolean importData(TransferSupport support) {
+        final MemberTable destination = (MemberTable) support.getComponent();
         final int insertRow = ((JTable.DropLocation) support.getDropLocation()).getRow();
-        final Collection<RelationMemberData> memberData;
+
         try {
-            //noinspection unchecked
-            memberData = (Collection<RelationMemberData>) support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA);
-        } catch (UnsupportedFlavorException | IOException e) {
+            if (support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)) {
+                importRelationMemberData(support, destination, insertRow);
+            } else if (support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA)) {
+                importPrimitiveData(support, destination, insertRow);
+            }
+        } catch (Exception e) {
             Main.warn(e);
             return false;
         }
-        final MemberTable destination = (MemberTable) support.getComponent();
 
-        try {
-            importRelationMemberData(memberData, destination, insertRow);
-        } catch (Exception e) {
-            Main.warn(e);
-            throw e;
-        }
         return true;
     }
 
-    protected void importRelationMemberData(Collection<RelationMemberData> memberData, MemberTable destination, int insertRow) {
+    protected void importRelationMemberData(TransferSupport support, final MemberTable destination, int insertRow)
+            throws UnsupportedFlavorException, IOException {
+        //noinspection unchecked
+        final Collection<RelationMemberData> memberData = (Collection<RelationMemberData>)
+                support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA);
+        importData(destination, insertRow, memberData, new Function<RelationMemberData, RelationMember>() {
+            @Override
+            public RelationMember apply(RelationMemberData member) {
+                final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(member.getUniqueId(), member.getType());
+                if (p == null) {
+                    Main.warn(tr("Cannot add {0} since it is not part of dataset", member));
+                    return null;
+                } else {
+                    return new RelationMember(member.getRole(), p);
+                }
+            }
+        });
+    }
+
+    protected void importPrimitiveData(TransferSupport support, final MemberTable destination, int insertRow)
+            throws UnsupportedFlavorException, IOException {
+        //noinspection unchecked
+        final Collection<PrimitiveData> data = (Collection<PrimitiveData>)
+                support.getTransferable().getTransferData(PrimitiveTransferable.PRIMITIVE_DATA);
+        importData(destination, insertRow, data, new Function<PrimitiveData, RelationMember>() {
+            @Override
+            public RelationMember apply(PrimitiveData data) {
+                final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(data);
+                if (p == null) {
+                    Main.warn(tr("Cannot add {0} since it is not part of dataset", data));
+                    return null;
+                } else {
+                    return destination.getMemberTableModel().getRelationMemberForPrimitive(p);
+                }
+            }
+        });
+    }
+
+    protected <T> void importData(MemberTable destination, int insertRow, Collection<T> memberData, Function<T, RelationMember> toMemberFunction) {
         final Collection<RelationMember> membersToAdd = new ArrayList<>(memberData.size());
-        for (RelationMemberData member : memberData) {
-            final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(member.getUniqueId(), member.getType());
-            if (p != null) {
-                membersToAdd.add(new RelationMember(member.getRole(), p));
-            } else {
-                Main.warn(tr("Cannot add {0} since it is not part of dataset", member));
+        for (T i : memberData) {
+            final RelationMember member = toMemberFunction.apply(i);
+            if (member != null) {
+                membersToAdd.add(member);
             }
         }
