diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
index 3d41fd3..0c7444f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
@@ -6,14 +6,19 @@
 import java.awt.Container;
 import java.awt.Dimension;
 import java.awt.KeyboardFocusManager;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
 import javax.swing.AbstractAction;
+import javax.swing.DropMode;
 import javax.swing.JComponent;
 import javax.swing.JPopupMenu;
 import javax.swing.JTable;
@@ -21,6 +26,7 @@
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
 import javax.swing.SwingUtilities;
+import javax.swing.TransferHandler;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
@@ -82,6 +88,82 @@ protected void init() {
         //
         getActionMap().put("selectNextColumnCell", new SelectNextColumnCellAction());
         getActionMap().put("selectPreviousColumnCell", new SelectPreviousColumnCellAction());
+
+        setTransferHandler(new MemberTransferHandler());
+        setDragEnabled(true);
+        setDropMode(DropMode.INSERT_ROWS);
+    }
+
+    static class MemberTransferHandler extends TransferHandler {
+
+        @Override
+        public int getSourceActions(JComponent c) {
+            return MOVE;
+        }
+
+        @Override
+        protected Transferable createTransferable(JComponent c) {
+            final MemberTable source = (MemberTable) c;
+            return new MemberTransferable(source.getMemberTableModel().getSelectedMembers());
+        }
+
+        @Override
+        public boolean canImport(TransferSupport support) {
+            support.setShowDropLocation(true);
+            return support.isDataFlavorSupported(MemberTransferable.MEMBERS);
+        }
+
+        @Override
+        public boolean importData(TransferSupport support) {
+            final int insertRow = ((JTable.DropLocation) support.getDropLocation()).getRow();
+            final Collection<RelationMember> members;
+            try {
+                //noinspection unchecked
+                members = (Collection<RelationMember>) support.getTransferable().getTransferData(MemberTransferable.MEMBERS);
+            } catch (UnsupportedFlavorException | IOException e) {
+                Main.warn(e);
+                return false;
+            }
+            final MemberTable destination = (MemberTable) support.getComponent();
+            destination.getMemberTableModel().addMembersAtIndex(members, insertRow);
+            return true;
+        }
+
+        @Override
+        protected void exportDone(JComponent sourceComponent, Transferable data, int action) {
+            if (action != MOVE) {
+                return;
+            }
+            final MemberTable source = (MemberTable) sourceComponent;
+            final MemberTableModel model = source.getMemberTableModel();
+            model.remove(source.getSelectedRows());
+            model.selectionChanged(null);
+        }
+    }
+
+    static class MemberTransferable implements Transferable {
+
+        private static final DataFlavor MEMBERS = new DataFlavor(MemberTransferable.class, "MemberTransferable");
+        private final Collection<RelationMember> members;
+
+        public MemberTransferable(Collection<RelationMember> members) {
+            this.members = members;
+        }
+
+        @Override
+        public DataFlavor[] getTransferDataFlavors() {
+            return new DataFlavor[]{MEMBERS};
+        }
+
+        @Override
+        public boolean isDataFlavorSupported(DataFlavor flavor) {
+            return flavor == MEMBERS;
+        }
+
+        @Override
+        public Collection<RelationMember> getTransferData(DataFlavor flavor) {
+            return members;
+        }
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
index f87ef71..6047f94 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
@@ -446,6 +446,14 @@ private void addMembersAtIndex(List<? extends OsmPrimitive> primitives, int inde
         fireMakeMemberVisible(index);
     }
 
+    void addMembersAtIndex(final Iterable<RelationMember> newMembers, final int index) {
+        int idx = index;
+        for (RelationMember member : newMembers) {
+            members.add(idx++, member);
+        }
+        fireTableRowsInserted(index, idx - 1);
+    }
+
     public void addMembersAtBeginning(List<? extends OsmPrimitive> primitives) {
         addMembersAtIndex(primitives, 0);
     }
