Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 8504)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 8505)
@@ -33,4 +33,5 @@
 import javax.swing.BorderFactory;
 import javax.swing.InputMap;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
@@ -56,4 +57,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.CopyAction;
+import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.command.AddCommand;
@@ -114,4 +116,8 @@
      */
     private JMenuItem windowMenuItem;
+    /**
+     * Button for performing the {@link org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.SortBelowAction}.
+     */
+    private JButton sortBelowButton;
 
     /**
@@ -508,4 +514,8 @@
         memberTableModel.addTableModelListener(sortAction);
         tb.add(sortAction);
+        final SortBelowAction sortBelowAction = new SortBelowAction();
+        memberTableModel.addTableModelListener(sortBelowAction);
+        memberTableModel.getSelectionModel().addListSelectionListener(sortBelowAction);
+        sortBelowButton = tb.add(sortBelowAction);
 
         // -- reverse action
@@ -603,4 +613,5 @@
         super.setVisible(visible);
         if (visible) {
+            sortBelowButton.setVisible(ExpertToggleAction.isExpert());
             RelationDialogManager.getRelationDialogManager().positionOnScreen(this);
             if(windowMenuItem == null) {
@@ -1059,4 +1070,32 @@
     }
 
+    class SortBelowAction extends AbstractAction implements TableModelListener, ListSelectionListener {
+        public SortBelowAction() {
+            putValue(SMALL_ICON, ImageProvider.get("dialogs", "sort_below"));
+            putValue(NAME, tr("Sort below"));
+            putValue(SHORT_DESCRIPTION, tr("Sort the selected relation members and all members below"));
+            updateEnabledState();
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            memberTableModel.sortBelow();
+        }
+
+        protected void updateEnabledState() {
+            setEnabled(memberTableModel.getRowCount() > 0 && !memberTableModel.getSelectionModel().isSelectionEmpty());
+        }
+
+        @Override
+        public void tableChanged(TableModelEvent e) {
+            updateEnabledState();
+        }
+
+        @Override
+        public void valueChanged(ListSelectionEvent e) {
+            updateEnabledState();
+        }
+    }
+
     class ReverseAction extends AbstractAction implements TableModelListener {
         public ReverseAction() {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 8504)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 8505)
@@ -718,4 +718,16 @@
     }
 
+    /**
+     * Sort the selected relation members and all members below by the way they are linked.
+     */
+    void sortBelow() {
+        final List<RelationMember> subList = members.subList(getSelectionModel().getMinSelectionIndex(), members.size());
+        final List<RelationMember> sorted = relationSorter.sortMembers(subList);
+        subList.clear();
+        subList.addAll(sorted);
+        fireTableDataChanged();
+        setSelectedMembers(sorted);
+    }
+
     WayConnectionType getWayConnection(int i) {
         if (connectionType == null) {
