Index: src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 18637)
+++ src/org/openstreetmap/josm/actions/CombineWayAction.java	(working copy)
@@ -232,8 +232,15 @@
     }
 
     protected static List<Node> tryJoin(Collection<Way> ways) {
-        List<Node> path = joinWithMultipolygonCode(ways);
+        List<Node> path = Collections.emptyList();
         if (path.isEmpty()) {
+            NodeGraph graph = NodeGraph.createDirectedGraphFromWays(ways);
+            path = graph.buildSpanningPathNoRemove();
+        }
+        if (path.isEmpty()) {
+            path = joinWithMultipolygonCode(ways);
+        }
+        if (path.isEmpty()) {
             NodeGraph graph = NodeGraph.createNearlyUndirectedGraphFromNodeWays(ways);
             path = graph.buildSpanningPathNoRemove();
         }
Index: src/org/openstreetmap/josm/data/osm/NodeGraph.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/NodeGraph.java	(revision 18637)
+++ src/org/openstreetmap/josm/data/osm/NodeGraph.java	(working copy)
@@ -271,7 +271,12 @@
                     dupCheck.add(cur);
                     if (isSpanningWay(path))
                         return buildPathFromNodePairs(path);
-                    nextPairs.addAll(getOutboundPairs(path.peekLast()));
+                    List<NodePair> followers = getOutboundPairs(cur);
+                    if (addedEdges != numUndirectedEges && followers.size() == 2) {
+                        final NodePair swapped = cur.swap();
+                        followers.remove(swapped);
+                    }
+                    nextPairs.addAll(followers);
                 }
             }
         }
@@ -369,8 +374,9 @@
             sortedMap.computeIfAbsent(e.getValue(), x -> new LinkedHashSet<>()).add(e.getKey());
         }
         LinkedHashSet<Node> result = new LinkedHashSet<>();
+        final int threshold = numUndirectedEges == addedEdges ? 2 : 4;
         for (Entry<Integer, Set<Node>> e : sortedMap.entrySet()) {
-            if (e.getKey() > 4 || result.isEmpty()) {
+            if (e.getKey() > threshold || result.isEmpty()) {
                 result.addAll(e.getValue());
             }
         }
Index: src/org/openstreetmap/josm/data/osm/NodePair.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/NodePair.java	(revision 18637)
+++ src/org/openstreetmap/josm/data/osm/NodePair.java	(working copy)
@@ -77,9 +77,9 @@
     public String toString() {
         return new StringBuilder()
         .append('[')
-        .append(a.getId())
+        .append(a.getUniqueId())
         .append(',')
-        .append(b.getId())
+        .append(b.getUniqueId())
         .append(']')
         .toString();
     }
