Index: src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java	(revision 18999)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java	(working copy)
@@ -199,9 +199,15 @@
      * @since 17862 (signature change, generics)
      */
     public static <T extends IRelationMember<? extends IPrimitive>> List<T> sortMembersByConnectivity(List<T> defaultMembers) {
-        List<T> newMembers;
+        List<T> orderedMembers = defaultMembers;
+        // see #23517
+        if (defaultMembers.stream().allMatch(rm -> ("outer".equals(rm.getRole()) || "inner".equals(rm.getRole())))) {
+            orderedMembers = defaultMembers.stream()
+                    .sorted((m1, m2) -> m2.getRole().compareTo(m1.getRole())) // outer first
+                    .collect(Collectors.toList());
+        }
 
-        RelationNodeMap<T> map = new RelationNodeMap<>(defaultMembers);
+        RelationNodeMap<T> map = new RelationNodeMap<>(orderedMembers);
         // List of groups of linked members
         //
         List<LinkedList<Integer>> allGroups = new ArrayList<>();
@@ -232,11 +238,12 @@
             }
         }
 
-        newMembers = allGroups.stream().flatMap(Collection::stream).map(defaultMembers::get).collect(Collectors.toList());
+        List<T> newMembers;
+        newMembers = allGroups.stream().flatMap(Collection::stream).map(orderedMembers::get).collect(Collectors.toList());
 
         // Finally, add members that have not been sorted at all
         for (Integer i : map.getNotSortableMembers()) {
-            newMembers.add(defaultMembers.get(i));
+            orderedMembers.add(defaultMembers.get(i));
         }
 
         return newMembers;
