Index: trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 8964)
+++ trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 8965)
@@ -567,4 +567,5 @@
             newSelection.add(way);
         }
+        final int indexOfWayToKeep = newWays.indexOf(wayToKeep);
         newWays.remove(wayToKeep);
 
@@ -677,8 +678,19 @@
 
                         int j = i_c;
-                        for (Way wayToAdd : newWays) {
+                        final List<Way> waysToAddBefore = newWays.subList(0, indexOfWayToKeep);
+                        for (Way wayToAdd : waysToAddBefore) {
                             RelationMember em = new RelationMember(rm.getRole(), wayToAdd);
                             j++;
-                            if ((backwards != null) && backwards) {
+                            if (Boolean.TRUE.equals(backwards)) {
+                                c.addMember(i_c + 1, em);
+                            } else {
+                                c.addMember(j - 1, em);
+                            }
+                        }
+                        final List<Way> waysToAddAfter = newWays.subList(indexOfWayToKeep, newWays.size());
+                        for (Way wayToAdd : waysToAddAfter) {
+                            RelationMember em = new RelationMember(rm.getRole(), wayToAdd);
+                            j++;
+                            if (Boolean.TRUE.equals(backwards)) {
                                 c.addMember(i_c, em);
                             } else {
Index: trunk/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java	(revision 8964)
+++ trunk/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java	(revision 8965)
@@ -2,8 +2,11 @@
 package org.openstreetmap.josm.actions;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Iterator;
 
 import org.junit.BeforeClass;
@@ -12,6 +15,10 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -94,3 +101,82 @@
         }
     }
+
+    @Test
+    public void testRouteRelation() {
+        doTestRouteRelation(false, 0);
+        doTestRouteRelation(false, 1);
+        doTestRouteRelation(false, 2);
+        doTestRouteRelation(false, 3);
+        doTestRouteRelation(true, 0);
+        doTestRouteRelation(true, 1);
+        doTestRouteRelation(true, 2);
+        doTestRouteRelation(true, 3);
+    }
+
+    void doTestRouteRelation(final boolean wayIsReversed, final int indexOfWayToKeep) {
+        final DataSet dataSet = new DataSet();
+        final OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
+        final Node n1 = new Node(new LatLon(1, 0));
+        final Node n2 = new Node(new LatLon(2, 0));
+        final Node n3 = new Node(new LatLon(3, 0));
+        final Node n4 = new Node(new LatLon(4, 0));
+        final Node n5 = new Node(new LatLon(5, 0));
+        final Node n6 = new Node(new LatLon(6, 0));
+        final Node n7 = new Node(new LatLon(7, 0));
+        final Way w1 = new Way();
+        final Way w2 = new Way();
+        final Way w3 = new Way();
+        final Relation route = new Relation();
+        for (OsmPrimitive p : Arrays.asList(n1, n2, n3, n4, n5, n6, n7, w1, w2, w3, route)) {
+            dataSet.addPrimitive(p);
+        }
+        w1.setNodes(Arrays.asList(n1, n2));
+        w2.setNodes(wayIsReversed
+                ? Arrays.asList(n6, n5, n4, n3, n2)
+                : Arrays.asList(n2, n3, n4, n5, n6)
+        );
+        w3.setNodes(Arrays.asList(n6, n7));
+        route.put("type", "route");
+        route.addMember(new RelationMember("", w1));
+        route.addMember(new RelationMember("", w2));
+        route.addMember(new RelationMember("", w3));
+        dataSet.setSelected(Arrays.asList(w2, n3, n4, n5));
+
+
+        final SplitWayAction.Strategy strategy = new SplitWayAction.Strategy() {
+
+            @Override
+            public Way determineWayToKeep(Iterable<Way> wayChunks) {
+                final Iterator<Way> it = wayChunks.iterator();
+                for (int i = 0; i < indexOfWayToKeep; i++) {
+                    it.next();
+                }
+                return it.next();
+            }
+        };
+        final SplitWayAction.SplitWayResult result = SplitWayAction.splitWay(
+                layer, w2, SplitWayAction.buildSplitChunks(w2, Arrays.asList(n3, n4, n5)), new ArrayList<OsmPrimitive>(), strategy);
+        Main.main.undoRedo.add(result.getCommand());
+
+        assertEquals(6, route.getMembersCount());
+        assertEquals(w1, route.getMemberPrimitivesList().get(0));
+        assertEquals(w3, route.getMemberPrimitivesList().get(5));
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(0)), n1);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(0)), n2);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(1)), n2);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(1)), n3);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(2)), n3);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(2)), n4);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(3)), n4);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(3)), n5);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(4)), n5);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(4)), n6);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(5)), n6);
+        assertFirstLastNodeIs(((Way) route.getMemberPrimitivesList().get(5)), n7);
+
+    }
+
+    static void assertFirstLastNodeIs(Way way, Node node) {
+        assertTrue("First/last node of " + way + " should be " + node, node.equals(way.firstNode()) || node.equals(way.lastNode()));
+    }
 }
