Index: trunk/src/org/openstreetmap/josm/data/ReorderableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/ReorderableModel.java	(revision 15236)
+++ trunk/src/org/openstreetmap/josm/data/ReorderableModel.java	(revision 15238)
@@ -73,14 +73,20 @@
      * @param delta negative or positive delta
      * @param selectedRows rows to move
-     * @return {@code true} if rows have been moved down
+     * @return {@code true} if rows have been moved
      */
     default boolean doMove(int delta, int... selectedRows) {
-        for (int row: selectedRows) {
-            T t1 = getValue(row);
-            T t2 = getValue(row + delta);
-            setValue(row, t2);
-            setValue(row + delta, t1);
+        if (delta != 0) {
+            if (delta < 0) {
+                for (int row: selectedRows) {
+                    setValue(row + delta, setValue(row, getValue(row + delta)));
+                }
+            } else {
+                for (int i = selectedRows.length - 1; i >= 0; i--) {
+                    int row = selectedRows[i];
+                    setValue(row + delta, setValue(row, getValue(row + delta)));
+                }
+            }
         }
-        return true;
+        return delta != 0 && selectedRows.length > 0;
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 15236)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 15238)
@@ -298,12 +298,15 @@
             return;
         int offset = 0;
+        final ListSelectionModel selectionModel = getSelectionModel();
+        selectionModel.setValueIsAdjusting(true);
         for (int row : selectedRows) {
             row -= offset;
             if (members.size() > row) {
                 members.remove(row);
-                getSelectionModel().removeIndexInterval(row, row);
+                selectionModel.removeIndexInterval(row, row);
                 offset++;
             }
         }
+        selectionModel.setValueIsAdjusting(false);
         fireTableDataChanged();
     }
