Index: trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 15886)
+++ trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 15887)
@@ -699,4 +699,21 @@
         List<AssembledPolygon> boundaries = findBoundaryPolygons(preparedWays, discardedWays);
 
+        //  see #9599
+        if (discardedWays.stream().anyMatch(w -> !w.isNew())) {
+            for (int i = 0; i < boundaries.size(); i++) {
+                AssembledPolygon ring = boundaries.get(i);
+                for (int k = 0; k < ring.ways.size(); k++) {
+                    WayInPolygon ringWay = ring.ways.get(k);
+                    Way older = keepOlder(ringWay.way, oldestWayMap, discardedWays);
+
+                    if (ringWay.way != older) {
+                        WayInPolygon repl = new WayInPolygon(older, ringWay.insideToTheRight);
+                        ring.ways.set(k, repl);
+                    }
+                }
+            }
+            commitCommands(marktr("Keep older versions"));
+        }
+
         //find polygons
         List<AssembledMultipolygon> preparedPolygons = findPolygons(boundaries);
@@ -731,25 +748,4 @@
 
         commitCommands(marktr("Delete relations"));
-
-        // see #9599: result should contain original way(s) where possible
-        if (discardedWays.stream().anyMatch(w -> !w.isNew())) {
-            for (int i = 0; i < polygons.size(); i++) {
-                Multipolygon mp = polygons.get(i);
-                for (int k = 0; k < mp.getInnerWays().size(); k++) {
-                    Way inner = mp.getInnerWays().get(k);
-                    Way older = keepOlder(inner, oldestWayMap, discardedWays);
-                    if (inner != older) {
-                        mp.getInnerWays().set(k, older);
-                    }
-                }
-                Way older = keepOlder(mp.outerWay, oldestWayMap, discardedWays);
-                if (older != mp.outerWay) {
-                    Multipolygon mpNew = new Multipolygon(older);
-                    mpNew.innerWays.addAll(mp.getInnerWays());
-                    polygons.set(i, mpNew);
-                }
-            }
-            commitCommands(marktr("Keep older versions"));
-        }
 
         // Delete the discarded inner ways
@@ -795,5 +791,5 @@
             copy.setNodes(way.getNodes());
             cmds.add(new ChangeCommand(oldest, copy));
-            return copy;
+            return oldest;
         }
         return way;
