Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java	(revision 33508)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java	(revision 33509)
@@ -24,5 +24,5 @@
 import org.openstreetmap.josm.plugins.pt_assistant.actions.EditHighlightedRelationsAction;
 import org.openstreetmap.josm.plugins.pt_assistant.actions.RepeatLastFixAction;
-import org.openstreetmap.josm.plugins.pt_assistant.actions.SortPTStopsAction;
+import org.openstreetmap.josm.plugins.pt_assistant.actions.SortPTRouteMembersAction;
 import org.openstreetmap.josm.plugins.pt_assistant.actions.SplitRoundaboutAction;
 import org.openstreetmap.josm.plugins.pt_assistant.data.PTRouteSegment;
@@ -74,5 +74,5 @@
         editHighlightedRelationsMenu = MainMenu.add(Main.main.menu.toolsMenu, editHighlightedRelationsAction);
         MainMenu.add(Main.main.menu.toolsMenu, new SplitRoundaboutAction());
-        MainMenu.add(Main.main.menu.toolsMenu, new SortPTStopsAction());
+        MainMenu.add(Main.main.menu.toolsMenu, new SortPTRouteMembersAction());
         MainMenu.add(Main.main.menu.toolsMenu, new CreatePlatformNodeAction());
     }
Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTRouteMembersAction.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTRouteMembersAction.java	(revision 33509)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTRouteMembersAction.java	(revision 33509)
@@ -0,0 +1,309 @@
+// License: GPL. For details, see LICENSE file.
+
+package org.openstreetmap.josm.plugins.pt_assistant.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+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.dialogs.relation.DownloadRelationMemberTask;
+import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter;
+import org.openstreetmap.josm.plugins.pt_assistant.data.PTStop;
+import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
+import org.openstreetmap.josm.plugins.pt_assistant.utils.StopToWayAssigner;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Sorts the members of a PT route. It orders first the ways, then the stops
+ * according to the assigned ways
+ *
+ * @author giacomo
+ *
+ */
+public class SortPTRouteMembersAction extends JosmAction {
+
+    private static final String ACTION_NAME = "Sort PT Route Members";
+
+    /**
+     * Creates a new SortPTRouteMembersAction
+     */
+    public SortPTRouteMembersAction() {
+        super(ACTION_NAME, "icons/sortptroutemembers", ACTION_NAME, null, true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+
+        for (Relation rel : getLayerManager().getEditDataSet().getSelectedRelations()) {
+            if (rel.hasIncompleteMembers()) {
+                if (JOptionPane.YES_OPTION == JOptionPane.showOptionDialog(Main.parent,
+                    tr("The relation has incomplete members. Do you want to download them and continue with the sorting?"),
+                    tr("Incomplete Members"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
+                    null, null, null)) {
+
+                    List<Relation> incomplete = Collections.singletonList(rel);
+                    Future<?> future = Main.worker.submit(new DownloadRelationMemberTask(
+                            incomplete,
+                            DownloadSelectedIncompleteMembersAction.buildSetOfIncompleteMembers(incomplete),
+                            Main.getLayerManager().getEditLayer()));
+
+                        Main.worker.submit(() -> {
+                            try {
+                                future.get();
+                                continueAfterDownload(rel);
+                            } catch (InterruptedException | ExecutionException e1) {
+                                 Main.error(e1);
+                                return;
+                            }
+                        });
+                } else
+                    return;
+            } else
+                continueAfterDownload(rel);
+        }
+    }
+
+    private void continueAfterDownload(Relation rel) {
+        Relation newRel = new Relation(rel);
+        sortPTRouteMembers(newRel);
+        Main.main.undoRedo.add(new ChangeCommand(rel, newRel));
+    }
+
+    /***
+     * Sort the members of the PT route.
+     *
+     * @param rel route to be sorted
+     */
+    public static void sortPTRouteMembers(Relation rel) {
+        if (!RouteUtils.isVersionTwoPTRoute(rel)) {
+            return;
+        }
+
+        List<RelationMember> members = new ArrayList<>();
+        List<RelationMember> oldMembers = rel.getMembers();
+        for (int i = 0; i < oldMembers.size(); i++) {
+            RelationMember rm = oldMembers.get(i);
+            if (!PTStop.isPTPlatform(rm) && !PTStop.isPTStopPosition(rm))
+                members.add(new RelationMember("", rm.getMember()));
+            else
+                members.add(rm);
+            rel.removeMember(0);
+        }
+        members = new RelationSorter().sortMembers(members);
+
+        List<RelationMember> stops = new ArrayList<>();
+        List<RelationMember> wayMembers = new ArrayList<>();
+        List<Way> ways = new ArrayList<>();
+        for (int i = 0; i < members.size(); i++) {
+            RelationMember rm = members.get(i);
+            if (PTStop.isPTPlatform(rm) || PTStop.isPTStopPosition(rm))
+                stops.add(rm);
+            else {
+                wayMembers.add(rm);
+                if (rm.getType() == OsmPrimitiveType.WAY)
+                    ways.add(rm.getWay());
+            }
+        }
+
+        Map<String, PTStop> stopsByName = new HashMap<>();
+        List<PTStop> unnamed = new ArrayList<>();
+        stops.forEach(rm -> {
+            String name = getStopName(rm.getMember());
+            if (name != null) {
+                if (!stopsByName.containsKey(name))
+                    stopsByName.put(name, new PTStop(rm));
+                else
+                    stopsByName.get(name).addStopElement(rm);
+            } else {
+                unnamed.add(new PTStop(rm));
+            }
+        });
+
+        StopToWayAssigner assigner = new StopToWayAssigner(ways);
+        List<PTStop> ptstops = new ArrayList<>(stopsByName.values());
+        Map<Way, List<PTStop>> wayStop = new HashMap<>();
+        ptstops.forEach(stop -> {
+            Way way = assigner.get(stop);
+            if (!wayStop.containsKey(way))
+                wayStop.put(way, new ArrayList<PTStop>());
+            wayStop.get(way).add(stop);
+        });
+
+        unnamed.forEach(stop -> {
+            Way way = assigner.get(stop);
+            if (!wayStop.containsKey(way))
+                wayStop.put(way, new ArrayList<PTStop>());
+            wayStop.get(way).add(stop);
+        });
+
+        for (int i = 0; i < wayMembers.size(); i++) {
+            RelationMember wm = wayMembers.get(i);
+            Way prev = null;
+            Way next = null;
+            if (i > 0) {
+                RelationMember wmp = wayMembers.get(i-1);
+                if (wmp.getType() == OsmPrimitiveType.WAY)
+                    prev = wmp.getWay();
+            }
+            if (i < wayMembers.size() - 1) {
+                RelationMember wmn = wayMembers.get(i+1);
+                if (wmn.getType() == OsmPrimitiveType.WAY)
+                    next = wmn.getWay();
+            }
+
+            if (wm.getType() == OsmPrimitiveType.WAY) {
+                Way curr = wm.getWay();
+                List<PTStop> stps = wayStop.get(curr);
+                if (stps != null) {
+                    if (stps.size() > 1)
+                        stps = sortSameWayStops(stps, curr, prev, next);
+                    stps.forEach(stop -> {
+                        if (stop != null) {
+                            if (stop.getStopPositionRM() != null)
+                                rel.addMember(stop.getStopPositionRM());
+                            if (stop.getPlatformRM() != null)
+                                rel.addMember(stop.getPlatformRM());
+                        }
+                    });
+                }
+            }
+        }
+
+        wayMembers.forEach(rel::addMember);
+    }
+
+    private static List<PTStop> sortSameWayStops(List<PTStop> stps, Way way, Way prev, Way next) {
+        Map<Node, List<PTStop>> closeNodes = new HashMap<>();
+        List<PTStop> noLocationStops = new ArrayList<>();
+        List<Node> nodes = way.getNodes();
+        for (PTStop stop : stps) {
+            Node closest = findClosestNode(stop, nodes);
+            if (closest == null) {
+                noLocationStops.add(stop);
+                continue;
+            }
+            if (!closeNodes.containsKey(closest)) {
+                closeNodes.put(closest, new ArrayList<>());
+            }
+            closeNodes.get(closest).add(stop);
+        }
+
+        boolean reverse = false;
+
+        if (prev != null) {
+            reverse = prev.firstNode().equals(way.lastNode())
+                        || prev.lastNode().equals(way.lastNode());
+        } else if (next != null) {
+            reverse = next.firstNode().equals(way.firstNode())
+                    || next.lastNode().equals(way.firstNode());
+        }
+
+        if (reverse)
+            Collections.reverse(nodes);
+
+        List<PTStop> ret = getSortedStops(nodes, closeNodes);
+        ret.addAll(noLocationStops);
+        return ret;
+    }
+
+    private static List<PTStop> getSortedStops(List<Node> nodes,
+            Map<Node, List<PTStop>> closeNodes) {
+
+        List<PTStop> ret = new ArrayList<>();
+        for (int i = 0; i < nodes.size(); i++) {
+            Node n = nodes.get(i);
+            Node prevNode = i > 0 ? nodes.get(i - 1) : n;
+            List<PTStop> stops = closeNodes.get(n);
+            if (stops != null) {
+                if (stops.size() > 1) {
+                    stops.sort((s1, s2) -> {
+                        Double d1 = stopEastNorth(s1).distance(prevNode.getEastNorth());
+                        Double d2 = stopEastNorth(s2).distance(prevNode.getEastNorth());
+                        return d1.compareTo(d2);
+                    });
+                }
+                stops.forEach(ret::add);
+            }
+        }
+
+        return ret;
+    }
+
+    private static Node findClosestNode(PTStop stop, List<Node> nodes) {
+        EastNorth stopEN = stopEastNorth(stop);
+        if (stopEN == null)
+            return null;
+        double minDist = Double.MAX_VALUE;
+        Node closest = null;
+        for (Node node : nodes) {
+            double dist = node.getEastNorth().distance(stopEN);
+            if (dist < minDist) {
+                minDist = dist;
+                closest = node;
+            }
+        }
+        return closest;
+    }
+
+    private static EastNorth stopEastNorth(PTStop stop) {
+        if (stop.getStopPosition() != null)
+            return stop.getStopPosition().getEastNorth();
+        OsmPrimitive prim = stop.getPlatform();
+        if (prim.getType() == OsmPrimitiveType.WAY)
+            return ((Way) prim).firstNode().getEastNorth();
+        else if (prim.getType() == OsmPrimitiveType.NODE)
+            return ((Node) prim).getEastNorth();
+        else
+            return null;
+    }
+
+    private static String getStopName(OsmPrimitive p) {
+        for (Relation ref : Utils.filteredCollection(p.getReferrers(), Relation.class)) {
+            if (ref.hasTag("type", "public_transport")
+                    && ref.hasTag("public_transport", "stop_area")
+                    && ref.getName() != null) {
+                return ref.getName();
+            }
+        }
+        return p.getName();
+    }
+
+    @Override
+    protected void updateEnabledState(
+            Collection<? extends OsmPrimitive> selection) {
+        if (selection.isEmpty()) {
+            setEnabled(false);
+            return;
+        }
+
+        for (OsmPrimitive sel : selection) {
+            if (sel.getType() != OsmPrimitiveType.RELATION || !RouteUtils.isPTRoute((Relation) sel)) {
+                setEnabled(false);
+                return;
+            }
+        }
+
+        setEnabled(true);
+    }
+}
Index: plications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTStopsAction.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTStopsAction.java	(revision 33508)
+++ 	(revision )
@@ -1,299 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-
-package org.openstreetmap.josm.plugins.pt_assistant.actions;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-import javax.swing.JOptionPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
-import org.openstreetmap.josm.command.ChangeCommand;
-import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-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.dialogs.relation.DownloadRelationMemberTask;
-import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter;
-import org.openstreetmap.josm.plugins.pt_assistant.data.PTStop;
-import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
-import org.openstreetmap.josm.plugins.pt_assistant.utils.StopToWayAssigner;
-import org.openstreetmap.josm.tools.Utils;
-
-/**
- * Sorts the stop positions in a PT route according to the assigned ways
- *
- * @author giacomo
- *
- */
-public class SortPTStopsAction extends JosmAction {
-
-    private static final String ACTION_NAME = "Sort PT Stops";
-
-    /**
-     * Creates a new SortPTStopsAction
-     */
-    public SortPTStopsAction() {
-        super(ACTION_NAME, "icons/sortptstops", ACTION_NAME, null, true);
-    }
-
-    @Override
-    public void actionPerformed(ActionEvent e) {
-
-        for (Relation rel : getLayerManager().getEditDataSet().getSelectedRelations()) {
-            if (rel.hasIncompleteMembers()) {
-                if (JOptionPane.YES_OPTION == JOptionPane.showOptionDialog(Main.parent,
-                    tr("The relation has incomplete members. Do you want to download them and continue with the sorting?"),
-                    tr("Incomplete Members"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
-                    null, null, null)) {
-
-                    List<Relation> incomplete = Collections.singletonList(rel);
-                    Future<?> future = Main.worker.submit(new DownloadRelationMemberTask(
-                            incomplete,
-                            DownloadSelectedIncompleteMembersAction.buildSetOfIncompleteMembers(incomplete),
-                            Main.getLayerManager().getEditLayer()));
-
-                        Main.worker.submit(() -> {
-                            try {
-                                future.get();
-                                continueAfterDownload(rel);
-                            } catch (InterruptedException | ExecutionException e1) {
-                                 Main.error(e1);
-                                return;
-                            }
-                        });
-                } else
-                    return;
-            } else
-                continueAfterDownload(rel);
-        }
-    }
-
-    private void continueAfterDownload(Relation rel) {
-        Relation newRel = new Relation(rel);
-        sortPTStops(newRel);
-        Main.main.undoRedo.add(new ChangeCommand(rel, newRel));
-    }
-
-    public void sortPTStops(Relation rel) {
-        List<RelationMember> members = new ArrayList<>();
-        List<RelationMember> oldMembers = rel.getMembers();
-        for (int i = 0; i < oldMembers.size(); i++) {
-            RelationMember rm = oldMembers.get(i);
-            if (!PTStop.isPTPlatform(rm) && !PTStop.isPTStopPosition(rm))
-                members.add(new RelationMember("", rm.getMember()));
-            else
-                members.add(rm);
-            rel.removeMember(0);
-        }
-        members = new RelationSorter().sortMembers(members);
-
-        List<RelationMember> stops = new ArrayList<>();
-        List<RelationMember> wayMembers = new ArrayList<>();
-        List<Way> ways = new ArrayList<>();
-        for (int i = 0; i < members.size(); i++) {
-            RelationMember rm = members.get(i);
-            if (PTStop.isPTPlatform(rm) || PTStop.isPTStopPosition(rm))
-                stops.add(rm);
-            else {
-                wayMembers.add(rm);
-                if (rm.getType() == OsmPrimitiveType.WAY)
-                    ways.add(rm.getWay());
-            }
-        }
-
-        Map<String, PTStop> stopsByName = new HashMap<>();
-        List<PTStop> unnamed = new ArrayList<>();
-        stops.forEach(rm -> {
-            String name = getStopName(rm.getMember());
-            if (name != null) {
-                if (!stopsByName.containsKey(name))
-                    stopsByName.put(name, new PTStop(rm));
-                else
-                    stopsByName.get(name).addStopElement(rm);
-            } else {
-                unnamed.add(new PTStop(rm));
-            }
-        });
-
-        StopToWayAssigner assigner = new StopToWayAssigner(ways);
-        List<PTStop> ptstops = new ArrayList<>(stopsByName.values());
-        Map<Way, List<PTStop>> wayStop = new HashMap<>();
-        ptstops.forEach(stop -> {
-            Way way = assigner.get(stop);
-            if (!wayStop.containsKey(way))
-                wayStop.put(way, new ArrayList<PTStop>());
-            wayStop.get(way).add(stop);
-        });
-
-        unnamed.forEach(stop -> {
-            Way way = assigner.get(stop);
-            if (!wayStop.containsKey(way))
-                wayStop.put(way, new ArrayList<PTStop>());
-            wayStop.get(way).add(stop);
-        });
-
-        for (int i = 0; i < wayMembers.size(); i++) {
-            RelationMember wm = wayMembers.get(i);
-            Way prev = null;
-            Way next = null;
-            if (i > 0) {
-                RelationMember wmp = wayMembers.get(i-1);
-                if (wmp.getType() == OsmPrimitiveType.WAY)
-                    prev = wmp.getWay();
-            }
-            if (i < wayMembers.size() - 1) {
-                RelationMember wmn = wayMembers.get(i+1);
-                if (wmn.getType() == OsmPrimitiveType.WAY)
-                    next = wmn.getWay();
-            }
-
-            if (wm.getType() == OsmPrimitiveType.WAY) {
-                Way curr = wm.getWay();
-                List<PTStop> stps = wayStop.get(curr);
-                if (stps != null) {
-                    if (stps.size() > 1)
-                        stps = sortSameWayStops(stps, curr, prev, next);
-                    stps.forEach(stop -> {
-                        if (stop != null) {
-                            if (stop.getStopPositionRM() != null)
-                                rel.addMember(stop.getStopPositionRM());
-                            if (stop.getPlatformRM() != null)
-                                rel.addMember(stop.getPlatformRM());
-                        }
-                    });
-                }
-            }
-        }
-
-        wayMembers.forEach(rel::addMember);
-    }
-
-    private List<PTStop> sortSameWayStops(List<PTStop> stps, Way way, Way prev, Way next) {
-        Map<Node, List<PTStop>> closeNodes = new HashMap<>();
-        List<PTStop> noLocationStops = new ArrayList<>();
-        List<Node> nodes = way.getNodes();
-        for (PTStop stop : stps) {
-            Node closest = findClosestNode(stop, nodes);
-            if (closest == null) {
-                noLocationStops.add(stop);
-                continue;
-            }
-            if (!closeNodes.containsKey(closest)) {
-                closeNodes.put(closest, new ArrayList<>());
-            }
-            closeNodes.get(closest).add(stop);
-        }
-
-        boolean reverse = false;
-
-        if (prev != null) {
-            reverse = prev.firstNode().equals(way.lastNode())
-                        || prev.lastNode().equals(way.lastNode());
-        } else if (next != null) {
-            reverse = next.firstNode().equals(way.firstNode())
-                    || next.lastNode().equals(way.firstNode());
-        }
-
-        if (reverse)
-            Collections.reverse(nodes);
-
-        List<PTStop> ret = getSortedStops(nodes, closeNodes);
-        ret.addAll(noLocationStops);
-        return ret;
-    }
-
-    private List<PTStop> getSortedStops(List<Node> nodes,
-            Map<Node, List<PTStop>> closeNodes) {
-
-        List<PTStop> ret = new ArrayList<>();
-        for (int i = 0; i < nodes.size(); i++) {
-            Node n = nodes.get(i);
-            Node prevNode = i > 0 ? nodes.get(i - 1) : n;
-            List<PTStop> stops = closeNodes.get(n);
-            if (stops != null) {
-                if (stops.size() > 1) {
-                    stops.sort((s1, s2) -> {
-                        Double d1 = stopEastNorth(s1).distance(prevNode.getEastNorth());
-                        Double d2 = stopEastNorth(s2).distance(prevNode.getEastNorth());
-                        return d1.compareTo(d2);
-                    });
-                }
-                stops.forEach(ret::add);
-            }
-        }
-
-        return ret;
-    }
-
-    private Node findClosestNode(PTStop stop, List<Node> nodes) {
-        EastNorth stopEN = stopEastNorth(stop);
-        if (stopEN == null)
-            return null;
-        double minDist = Double.MAX_VALUE;
-        Node closest = null;
-        for (Node node : nodes) {
-            double dist = node.getEastNorth().distance(stopEN);
-            if (dist < minDist) {
-                minDist = dist;
-                closest = node;
-            }
-        }
-        return closest;
-    }
-
-    private EastNorth stopEastNorth(PTStop stop) {
-        if (stop.getStopPosition() != null)
-            return stop.getStopPosition().getEastNorth();
-        OsmPrimitive prim = stop.getPlatform();
-        if (prim.getType() == OsmPrimitiveType.WAY)
-            return ((Way) prim).firstNode().getEastNorth();
-        else if (prim.getType() == OsmPrimitiveType.NODE)
-            return ((Node) prim).getEastNorth();
-        else
-            return null;
-    }
-
-    private static String getStopName(OsmPrimitive p) {
-        for (Relation ref : Utils.filteredCollection(p.getReferrers(), Relation.class)) {
-            if (ref.hasTag("type", "public_transport")
-                    && ref.hasTag("public_transport", "stop_area")
-                    && ref.getName() != null) {
-                return ref.getName();
-            }
-        }
-        return p.getName();
-    }
-
-    @Override
-    protected void updateEnabledState(
-            Collection<? extends OsmPrimitive> selection) {
-        if (selection.isEmpty()) {
-            setEnabled(false);
-            return;
-        }
-
-        for (OsmPrimitive sel : selection) {
-            if (sel.getType() != OsmPrimitiveType.RELATION || !RouteUtils.isPTRoute((Relation) sel)) {
-                setEnabled(false);
-                return;
-            }
-        }
-
-        setEnabled(true);
-    }
-}
Index: /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/RouteChecker.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/RouteChecker.java	(revision 33508)
+++ /applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/RouteChecker.java	(revision 33509)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction;
 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionTypeCalculator;
+import org.openstreetmap.josm.plugins.pt_assistant.actions.SortPTRouteMembersAction;
 import org.openstreetmap.josm.plugins.pt_assistant.data.PTRouteDataManager;
 import org.openstreetmap.josm.plugins.pt_assistant.data.PTStop;
@@ -328,49 +329,7 @@
         Relation originalRelation = (Relation) primitives.iterator().next();
 
-        // separate ways from stops (because otherwise the order of
-        // stops/platforms can be messed up by the sorter:
-        List<RelationMember> members = originalRelation.getMembers();
-        final List<RelationMember> stops = new ArrayList<>();
-        final List<RelationMember> ways = new ArrayList<>();
-        for (RelationMember member : members) {
-            if (RouteUtils.isPTWay(member)) {
-                if ("".equals(member.getRole())) {
-                    ways.add(member);
-                } else {
-                    RelationMember modifiedMember = new RelationMember("", member.getWay());
-                    ways.add(modifiedMember);
-                }
-            } else { // stops:
-                if ("stop_positon".equals(member.getRole())) {
-                    // it is not expected that stop_positions could
-                    // be relations
-                    if (member.getType().equals(OsmPrimitiveType.NODE)) {
-                        RelationMember modifiedMember = new RelationMember("stop", member.getNode());
-                        stops.add(modifiedMember);
-                    } else { // if it is a primitive of type way:
-                        RelationMember modifiedMember = new RelationMember("stop", member.getWay());
-                        stops.add(modifiedMember);
-                    }
-                } else { // if it is not a stop_position:
-                    stops.add(member);
-                }
-            }
-        }
-
-        // sort the ways:
-        RelationSorter sorter = new RelationSorter();
-        List<RelationMember> sortedWays = sorter.sortMembers(ways);
-
         // create a new relation to pass to the command:
         Relation sortedRelation = new Relation(originalRelation);
-        List<RelationMember> sortedRelationMembers = new ArrayList<>(members.size());
-        for (RelationMember rm : stops) {
-            sortedRelationMembers.add(rm);
-        }
-        for (RelationMember rm : sortedWays) {
-            sortedRelationMembers.add(rm);
-        }
-        sortedRelation.setMembers(sortedRelationMembers);
-
+        SortPTRouteMembersAction.sortPTRouteMembers(sortedRelation);
         return new ChangeCommand(originalRelation, sortedRelation);
     }
Index: /applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTRouteMembersActionTest.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTRouteMembersActionTest.java	(revision 33509)
+++ /applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTRouteMembersActionTest.java	(revision 33509)
@@ -0,0 +1,115 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.pt_assistant.actions;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.plugins.pt_assistant.AbstractTest;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+/**
+ * Unit tests for class {@link SortPTRouteMembersAction}.
+ *
+ * @author giack
+ *
+ */
+public class SortPTRouteMembersActionTest extends AbstractTest {
+
+    /**
+     * Setup test.
+     */
+    @Rule
+    public JOSMTestRules rules = new JOSMTestRules().preferences().platform();
+
+    private DataSet ds;
+
+    @Before
+    public void init() throws FileNotFoundException, IllegalDataException {
+        ds = OsmReader.parseDataSet(new FileInputStream(AbstractTest.PATH_TO_SORT_PT_STOPS), null);
+    }
+
+    @Test
+    public void test1() {
+        Relation rel = (Relation) ds.getPrimitiveById(
+                new SimplePrimitiveId(7367762L, OsmPrimitiveType.RELATION));
+        SortPTRouteMembersAction.sortPTRouteMembers(rel);
+
+        assertEquals("Acitillo - Istituto Fortunato", rel.getMember(0).getNode().getName());
+        assertEquals("Ribera - Gemito", rel.getMember(1).getNode().getName());
+        assertEquals("Gemito - Stadio Collana", rel.getMember(2).getNode().getName());
+        assertEquals("Cilea 21", rel.getMember(3).getNode().getName());
+        assertEquals("Cimarosa", rel.getMember(4).getNode().getName());
+        assertEquals("Cimarosa Floridiana - Farmacia Orlando", rel.getMember(5).getNode().getName());
+        assertEquals("Bernini - Fuga", rel.getMember(6).getNode().getName());
+        assertEquals("Bernini - Solimene", rel.getMember(7).getNode().getName());
+        assertEquals("Bernini-Fanzago - Centro Diagnostico Basile", rel.getMember(8).getNode().getName());
+        assertEquals("Fiore-Santobono - Centro Diagnostico Basile", rel.getMember(9).getNode().getName());
+        assertEquals("Niutta Medaglie d'Oro - Analisi Cliniche Pasteur", rel.getMember(10).getNode().getName());
+        assertEquals("Niutta Muzii - Analisi Cliche Pasteur", rel.getMember(11).getNode().getName());
+        assertEquals("Arenella Muzii - La Padella Rosticceria", rel.getMember(12).getNode().getName());
+        assertEquals("Gigante - Orsi", rel.getMember(13).getNode().getName());
+        assertEquals("Della Costituzione - Sottopasso", rel.getMember(14).getNode().getName());
+        assertEquals("Della Costituzione - Isola B", rel.getMember(15).getNode().getName());
+        assertEquals("Della Costituzione - Moro", rel.getMember(16).getNode().getName());
+        assertEquals("Aulisio", rel.getMember(17).getNode().getName());
+        assertEquals("Aulisio - Palazzo di Giustizia", rel.getMember(18).getNode().getName());
+        assertEquals("Grimaldi - Procura", rel.getMember(19).getNode().getName());
+        assertEquals("Biscradi", rel.getMember(20).getNode().getName());
+        assertEquals("Nuova Poggioreale 160", rel.getMember(21).getNode().getName());
+        assertEquals("Nuova Poggioreale Caramanico - Medicina Futura", rel.getMember(22).getNode().getName());
+        assertEquals("Emiciclo Poggoreale", rel.getMember(23).getNode().getName());
+    }
+
+    @Test
+    public void test2() {
+        Relation rel = (Relation) ds.getPrimitives(p -> p.getType() == OsmPrimitiveType.RELATION &&
+                "150 Piazza Garibaldi → Osp. Monaldi".equals(p.getName())).iterator().next();
+        SortPTRouteMembersAction.sortPTRouteMembers(rel);
+
+        assertNull(rel.getMember(0).getNode().getName());
+        assertEquals("Alibus Airport Shuttle", rel.getMember(1).getNode().getName());
+        assertEquals("Piazza Garibaldi - Poerio", rel.getMember(2).getNode().getName());
+        assertEquals("Piazza Principe Umberto", rel.getMember(3).getNode().getName());
+        assertEquals("Ponte Casanova - Ist. Sogliano", rel.getMember(4).getNode().getName());
+        assertEquals("Ponte Casanova - Novara", rel.getMember(5).getNode().getName());
+        assertEquals("Piazza Nazionale", rel.getMember(6).getNode().getName());
+        assertEquals("Nuova Poggioreale - Corso Malta", rel.getMember(7).getNode().getName());
+        assertEquals("Grimaldi - Procura", rel.getMember(8).getNode().getName());
+        assertEquals("D'Aulisio 14 FR", rel.getMember(9).getNode().getName());
+        assertEquals("Della Costituzione - Moro", rel.getMember(10).getNode().getName());
+        assertEquals("Della Costituzione - Isola G", rel.getMember(11).getNode().getName());
+        assertEquals("Malta - Zara", rel.getMember(12).getNode().getName());
+        assertEquals("Arenella Muzzi - La Padella Rosticceria", rel.getMember(13).getNode().getName());
+        assertEquals("Palermo - Arenella", rel.getMember(14).getNode().getName());
+        assertEquals("Fontana 60", rel.getMember(15).getNode().getName());
+        assertEquals("Fontana - Massari", rel.getMember(16).getNode().getName());
+        assertEquals("Fontana - Presutti", rel.getMember(17).getNode().getName());
+        assertEquals("Cavallino - Parco Ice Snei", rel.getMember(18).getNode().getName());
+        assertEquals("Cavallino - Scuola Materna", rel.getMember(19).getNode().getName());
+        assertEquals("Cavallino 77", rel.getMember(20).getNode().getName());
+        assertEquals("Bernardo Cavallino - Pronto Soccorso Cardarelli", rel.getMember(21).getNode().getName());
+        assertNull(rel.getMember(22).getNode().getName());
+        assertEquals("Cardarelli - Ospedale", rel.getMember(23).getNode().getName());
+        assertEquals("Pietravalle - Gatto", rel.getMember(24).getNode().getName());
+        assertEquals("Pietravalle - De Amicis", rel.getMember(25).getNode().getName());
+        assertEquals("Pansini - Policlinico", rel.getMember(26).getNode().getName());
+        assertEquals("Montesano - Parcheggio M1", rel.getMember(27).getNode().getName());
+        assertEquals("Montesano - Cangiani", rel.getMember(28).getNode().getName());
+        assertEquals("L. Bianchi - Parco Angiola", rel.getMember(29).getNode().getName());
+        assertEquals("Bianchi - Cangiani", rel.getMember(30).getNode().getName());
+        assertEquals("Bianchi - Montelungo", rel.getMember(31).getNode().getName());
+        assertNull(rel.getMember(32).getNode().getName());
+    }
+}
Index: plications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTStopsActionTest.java
===================================================================
--- /applications/editors/josm/plugins/pt_assistant/test/unit/org/openstreetmap/josm/plugins/pt_assistant/actions/SortPTStopsActionTest.java	(revision 33508)
+++ 	(revision )
@@ -1,115 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.pt_assistant.actions;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.io.IllegalDataException;
-import org.openstreetmap.josm.io.OsmReader;
-import org.openstreetmap.josm.plugins.pt_assistant.AbstractTest;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-/**
- * Unit tests for class {@link SortPTStopsAction}.
- *
- * @author giack
- *
- */
-public class SortPTStopsActionTest extends AbstractTest {
-
-    /**
-     * Setup test.
-     */
-    @Rule
-    public JOSMTestRules rules = new JOSMTestRules().preferences().platform();
-
-    private DataSet ds;
-
-    @Before
-    public void init() throws FileNotFoundException, IllegalDataException {
-        ds = OsmReader.parseDataSet(new FileInputStream(AbstractTest.PATH_TO_SORT_PT_STOPS), null);
-    }
-
-    @Test
-    public void test1() {
-        Relation rel = (Relation) ds.getPrimitiveById(
-                new SimplePrimitiveId(7367762L, OsmPrimitiveType.RELATION));
-        new SortPTStopsAction().sortPTStops(rel);
-
-        assertEquals("Acitillo - Istituto Fortunato", rel.getMember(0).getNode().getName());
-        assertEquals("Ribera - Gemito", rel.getMember(1).getNode().getName());
-        assertEquals("Gemito - Stadio Collana", rel.getMember(2).getNode().getName());
-        assertEquals("Cilea 21", rel.getMember(3).getNode().getName());
-        assertEquals("Cimarosa", rel.getMember(4).getNode().getName());
-        assertEquals("Cimarosa Floridiana - Farmacia Orlando", rel.getMember(5).getNode().getName());
-        assertEquals("Bernini - Fuga", rel.getMember(6).getNode().getName());
-        assertEquals("Bernini - Solimene", rel.getMember(7).getNode().getName());
-        assertEquals("Bernini-Fanzago - Centro Diagnostico Basile", rel.getMember(8).getNode().getName());
-        assertEquals("Fiore-Santobono - Centro Diagnostico Basile", rel.getMember(9).getNode().getName());
-        assertEquals("Niutta Medaglie d'Oro - Analisi Cliniche Pasteur", rel.getMember(10).getNode().getName());
-        assertEquals("Niutta Muzii - Analisi Cliche Pasteur", rel.getMember(11).getNode().getName());
-        assertEquals("Arenella Muzii - La Padella Rosticceria", rel.getMember(12).getNode().getName());
-        assertEquals("Gigante - Orsi", rel.getMember(13).getNode().getName());
-        assertEquals("Della Costituzione - Sottopasso", rel.getMember(14).getNode().getName());
-        assertEquals("Della Costituzione - Isola B", rel.getMember(15).getNode().getName());
-        assertEquals("Della Costituzione - Moro", rel.getMember(16).getNode().getName());
-        assertEquals("Aulisio", rel.getMember(17).getNode().getName());
-        assertEquals("Aulisio - Palazzo di Giustizia", rel.getMember(18).getNode().getName());
-        assertEquals("Grimaldi - Procura", rel.getMember(19).getNode().getName());
-        assertEquals("Biscradi", rel.getMember(20).getNode().getName());
-        assertEquals("Nuova Poggioreale 160", rel.getMember(21).getNode().getName());
-        assertEquals("Nuova Poggioreale Caramanico - Medicina Futura", rel.getMember(22).getNode().getName());
-        assertEquals("Emiciclo Poggoreale", rel.getMember(23).getNode().getName());
-    }
-
-    @Test
-    public void test2() {
-        Relation rel = (Relation) ds.getPrimitives(p -> p.getType() == OsmPrimitiveType.RELATION &&
-                "150 Piazza Garibaldi → Osp. Monaldi".equals(p.getName())).iterator().next();
-        new SortPTStopsAction().sortPTStops(rel);
-
-        assertNull(rel.getMember(0).getNode().getName());
-        assertEquals("Alibus Airport Shuttle", rel.getMember(1).getNode().getName());
-        assertEquals("Piazza Garibaldi - Poerio", rel.getMember(2).getNode().getName());
-        assertEquals("Piazza Principe Umberto", rel.getMember(3).getNode().getName());
-        assertEquals("Ponte Casanova - Ist. Sogliano", rel.getMember(4).getNode().getName());
-        assertEquals("Ponte Casanova - Novara", rel.getMember(5).getNode().getName());
-        assertEquals("Piazza Nazionale", rel.getMember(6).getNode().getName());
-        assertEquals("Nuova Poggioreale - Corso Malta", rel.getMember(7).getNode().getName());
-        assertEquals("Grimaldi - Procura", rel.getMember(8).getNode().getName());
-        assertEquals("D'Aulisio 14 FR", rel.getMember(9).getNode().getName());
-        assertEquals("Della Costituzione - Moro", rel.getMember(10).getNode().getName());
-        assertEquals("Della Costituzione - Isola G", rel.getMember(11).getNode().getName());
-        assertEquals("Malta - Zara", rel.getMember(12).getNode().getName());
-        assertEquals("Arenella Muzzi - La Padella Rosticceria", rel.getMember(13).getNode().getName());
-        assertEquals("Palermo - Arenella", rel.getMember(14).getNode().getName());
-        assertEquals("Fontana 60", rel.getMember(15).getNode().getName());
-        assertEquals("Fontana - Massari", rel.getMember(16).getNode().getName());
-        assertEquals("Fontana - Presutti", rel.getMember(17).getNode().getName());
-        assertEquals("Cavallino - Parco Ice Snei", rel.getMember(18).getNode().getName());
-        assertEquals("Cavallino - Scuola Materna", rel.getMember(19).getNode().getName());
-        assertEquals("Cavallino 77", rel.getMember(20).getNode().getName());
-        assertEquals("Bernardo Cavallino - Pronto Soccorso Cardarelli", rel.getMember(21).getNode().getName());
-        assertNull(rel.getMember(22).getNode().getName());
-        assertEquals("Cardarelli - Ospedale", rel.getMember(23).getNode().getName());
-        assertEquals("Pietravalle - Gatto", rel.getMember(24).getNode().getName());
-        assertEquals("Pietravalle - De Amicis", rel.getMember(25).getNode().getName());
-        assertEquals("Pansini - Policlinico", rel.getMember(26).getNode().getName());
-        assertEquals("Montesano - Parcheggio M1", rel.getMember(27).getNode().getName());
-        assertEquals("Montesano - Cangiani", rel.getMember(28).getNode().getName());
-        assertEquals("L. Bianchi - Parco Angiola", rel.getMember(29).getNode().getName());
-        assertEquals("Bianchi - Cangiani", rel.getMember(30).getNode().getName());
-        assertEquals("Bianchi - Montelungo", rel.getMember(31).getNode().getName());
-        assertNull(rel.getMember(32).getNode().getName());
-    }
-}
