Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2885)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 2886)
@@ -546,5 +546,17 @@
             }
         }
-
+        setSelectedMembersIdx(selectedIndices);
+    }
+
+    /**
+     * Selects the members in the collection selectedIndices
+     *
+     * @param selectedIndices the collection of selected member indices
+     */
+    public void setSelectedMembersIdx(Collection<Integer> selectedIndices) {
+        if (selectedIndices == null || selectedIndices.isEmpty()) {
+            getSelectionModel().clearSelection();
+            return;
+        }
         // select the members
         //
@@ -740,5 +752,5 @@
 
     /**
-     * Sort the relation members by the way they are linked.
+     * Sort the selected relation members by the way they are linked.
      */
     void sort() {
@@ -746,6 +758,7 @@
         ArrayList<RelationMember> sortedMembers = null;
         ArrayList<RelationMember> newMembers;
-        if (selectedMembers.isEmpty()) {
+        if (selectedMembers.size() <= 1) {
             newMembers = sortMembers(members);
+            sortedMembers = newMembers;
         } else {
             sortedMembers = sortMembers(selectedMembers);
@@ -774,12 +787,4 @@
 
     /**
-     * Reverse the relation members.
-     */
-    void reverse() {
-        Collections.reverse(members);
-        fireTableDataChanged();
-    }
-
-    /**
      * Determines the direction of way k with respect to the way ref_i.
      * The way ref_i is assumed to have the direction ref_direction and
@@ -790,5 +795,5 @@
      * Else the direction is given as follows:
      * Let the relation be a route of oneway streets, and someone travels them in the given order.
-     * Direction is FORWARD for if it is legel and BACKWARD if it is illegal to do so for the given way.
+     * Direction is FORWARD if it is legel and BACKWARD if it is illegal to do so for the given way.
      *
      **/
@@ -855,5 +860,5 @@
      * determine, if the way i is a roundabout and if yes, what type of roundabout
      */
-    private Direction roundaboutType(int i) { //FIXME
+    private Direction roundaboutType(int i) {
         RelationMember m = members.get(i);
         if (m == null || !m.isWay()) return NONE;
@@ -894,4 +899,32 @@
 
     /**
+     * Reverse the relation members.
+     */
+    void reverse() {
+        List<Integer> selectedIndices = getSelectedIndices();
+        List<Integer> selectedIndicesReversed = getSelectedIndices();
+
+        if (selectedIndices.size() <= 1) {
+            Collections.reverse(members);
+            fireTableDataChanged();
+            setSelectedMembers(members);
+        } else {
+            Collections.reverse(selectedIndicesReversed);
+
+            ArrayList<RelationMember> newMembers = new ArrayList<RelationMember>(members);
+
+            for (int i=0; i < selectedIndices.size(); i++) {
+                newMembers.set(selectedIndices.get(i), members.get(selectedIndicesReversed.get(i)));
+            }
+
+            if (members.size() != newMembers.size()) throw new AssertionError();
+            members.clear();
+            members.addAll(newMembers);
+            fireTableDataChanged();
+            setSelectedMembersIdx(selectedIndices);
+        }
+    }
+
+    /**
      * refresh the cache of member WayConnectionTypes
      */
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java	(revision 2885)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java	(revision 2886)
@@ -88,5 +88,4 @@
 
             if (nodeLinks.getValue().size() < 2) {
-//                System.err.println("DELETE: "+nodeLinks.getKey()+" "+nodeLinks.getValue());
                 if (nodeLinks.getValue().size() != 1) throw new AssertionError();
 
@@ -98,14 +97,5 @@
                 continue;
             }
-//            System.err.println(nodeLinks.getKey()+" "+nodeLinks.getValue());
-
         }
-//        System.err.println("");
-//        System.err.println(remaining);
-//        System.err.println("");
-//        System.err.println(nodesMap);
-//        System.err.println("");
-//        System.err.println(waysMap);
-
     }
 
@@ -132,9 +122,6 @@
      */
     public Integer popAdjacent(Integer i) {
-//        System.err.print("Adjacent["+i+"]:");
         TreeSet<Node> nodes = waysMap.get(i);
-//        System.err.print(nodes);
         for (Node n : nodes) {
-//            System.err.print(" {"+n.getId()+"} ");
             TreeSet<Integer> adj = nodesMap.get(n);
             if (!adj.isEmpty()) {
@@ -142,5 +129,4 @@
                 done(j);
                 waysMap.get(j).remove(n);
-//                System.err.println(j);
                 return j;
             }
