Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java	(revision 8516)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java	(revision 8517)
@@ -6,4 +6,5 @@
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -12,7 +13,10 @@
 import java.util.Map.Entry;
 
+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.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.tools.AlphanumComparator;
+import org.openstreetmap.josm.tools.Utils;
 
 public class RelationSorter {
@@ -91,8 +95,38 @@
         }
 
+        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
         public List<RelationMember> sortMembers(List<RelationMember> list) {
-            // Retain order from original relation
-            return list;
+            final Map<String, RelationMember> platformByName = new HashMap<>();
+            for (RelationMember i : list) {
+                if ("platform".equals(i.getRole())) {
+                    final RelationMember old = platformByName.put(getStopName(i.getMember()), i);
+                    if (old != null) {
+                        // Platform with same name present. Stop to avoid damaging complicated relations.
+                        // This case can happily be handled differently.
+                        return list;
+                    }
+                }
+            }
+            final List<RelationMember> sorted = new ArrayList<>(list.size());
+            for (RelationMember i : list) {
+                if ("stop".equals(i.getRole())) {
+                    sorted.add(i);
+                    final RelationMember platform = platformByName.remove(getStopName(i.getMember()));
+                    if (platform != null) {
+                        sorted.add(platform);
+                    }
+                }
+            }
+            sorted.addAll(platformByName.values());
+            return sorted;
         }
     }
