Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2715)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2716)
@@ -688,10 +688,12 @@
     }
 
-    /**
-     * Sort the relation members by the way they are linked.
-     */
-    void sort() {
-        RelationNodeMap map = new RelationNodeMap(members);
-
+    /*
+     * Sort a collection of relation members by the way they are linked.
+     * 
+     * @param relationMembers collection of relation members
+     * @return sorted collection of relation members
+     */
+    private ArrayList<RelationMember> sortMembers(ArrayList<RelationMember> relationMembers) {
+        RelationNodeMap map = new RelationNodeMap(relationMembers);
         // List of groups of linked members
         //
@@ -722,5 +724,4 @@
                 group.addFirst(next);
             }
-
         }
 
@@ -732,5 +733,33 @@
         for (LinkedList<Integer> tmpGroup : allGroups) {
             for (Integer p : tmpGroup) {
-                newMembers.add(members.get(p));
+                newMembers.add(relationMembers.get(p));
+            }
+        }
+        return newMembers;
+    }
+
+    /**
+     * Sort the relation members by the way they are linked.
+     */
+    void sort() {
+        ArrayList<RelationMember> selectedMembers = new ArrayList<RelationMember>(getSelectedMembers());
+        ArrayList<RelationMember> sortedMembers = null;
+        ArrayList<RelationMember> newMembers;
+        if (selectedMembers.isEmpty()) {
+            newMembers = sortMembers(members);
+        } else {
+            sortedMembers = sortMembers(selectedMembers);
+            List<Integer> selectedIndices = getSelectedIndices();
+            newMembers = new ArrayList<RelationMember>();
+            boolean inserted = false;
+            for (int i=0; i < members.size(); i++) {
+                if (selectedIndices.contains(i)) {
+                    if (!inserted) {
+                        newMembers.addAll(sortedMembers);
+                        inserted = true;
+                    }
+                } else {
+                    newMembers.add(members.get(i));
+                }
             }
         }
@@ -741,4 +770,5 @@
         members.addAll(newMembers);
         fireTableDataChanged();
+        setSelectedMembers(sortedMembers);
     }
 
