Index: src/org/openstreetmap/josm/data/osm/NodeGraph.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/NodeGraph.java	(revision 15542)
+++ src/org/openstreetmap/josm/data/osm/NodeGraph.java	(working copy)
@@ -4,14 +4,17 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
 import java.util.Stack;
+import java.util.TreeMap;
 
 import org.openstreetmap.josm.tools.Pair;
 
@@ -239,7 +242,7 @@
         return nodes;
     }
 
-    protected boolean isSpanningWay(Stack<NodePair> way) {
+    protected boolean isSpanningWay(Collection<NodePair> way) {
         return numUndirectedEges == way.size();
     }
 
@@ -296,8 +299,9 @@
         // In the worst case this loops over all nodes which is very slow for large ways.
         //
         Set<Node> nodes = getTerminalNodes();
+        nodes = nodes.isEmpty() ? getMostFrequentVisitedNodes() : nodes;
         nodes = nodes.isEmpty() ? getNodes() : nodes;
-        for (Node n: nodes) {
+        for (Node n:nodes) {
             List<Node> path = buildSpanningPath(n);
             if (!path.isEmpty())
                 return path;
@@ -304,4 +308,25 @@
         }
         return null;
     }
+
+    /**
+     * @return a set of those nodes which appear most often in the edges.
+     */
+    private Set<Node> getMostFrequentVisitedNodes() {
+        if (edges.isEmpty())
+            return Collections.emptyNavigableSet();
+        Map<Node, Integer> counters = new HashMap<>();
+        for (NodePair pair : edges) {
+            Integer c = counters.get(pair.getA());
+            counters.put(pair.getA(), c == null ? 1 : c + 1);
+            c = counters.get(pair.getB());
+            counters.put(pair.getB(), c == null ? 1 : c + 1);
+        }
+        TreeMap<Integer, Set<Node>> sorted = new TreeMap<>();
+        for (Entry<Node, Integer> e : counters.entrySet()) {
+            sorted.computeIfAbsent(e.getValue(), LinkedHashSet::new).add(e.getKey());
+        }
+        return sorted.lastEntry().getValue();
+    }
+
 }
