Index: src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 16053)
+++ src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(working copy)
@@ -598,6 +598,10 @@
             while (joined && left > 0) {
                 joined = false;
                 for (int i = 0; i < joinArray.length && left != 0; ++i) {
+                    if (nodes != null && nodes.get(0) == nodes.get(nodes.size()-1)) {
+                        // see 18861: Stop joining when a ring is closed
+                        break;
+                    }
                     if (joinArray[i] != null) {
                         Way c = joinArray[i];
                         if (c.getNodesCount() == 0) {
@@ -613,28 +617,19 @@
                             int cl = c.getNodesCount()-1;
                             int nl;
                             if (nodes == null) {
-                                nl = w.getNodesCount()-1;
-                                if (w.getNode(nl) == c.getNode(0)) {
-                                    mode = 21;
-                                } else if (w.getNode(nl) == c.getNode(cl)) {
-                                    mode = 22;
-                                } else if (w.getNode(0) == c.getNode(0)) {
-                                    mode = 11;
-                                } else if (w.getNode(0) == c.getNode(cl)) {
-                                    mode = 12;
-                                }
-                            } else {
-                                nl = nodes.size()-1;
-                                if (nodes.get(nl) == c.getNode(0)) {
-                                    mode = 21;
-                                } else if (nodes.get(0) == c.getNode(cl)) {
-                                    mode = 12;
-                                } else if (nodes.get(0) == c.getNode(0)) {
-                                    mode = 11;
-                                } else if (nodes.get(nl) == c.getNode(cl)) {
-                                    mode = 22;
-                                }
+                                nodes = new ArrayList<>(w.getNodes());
+                                wayIds.add(w.getUniqueId());
                             }
+                            nl = nodes.size()-1;
+                            if (nodes.get(nl) == c.getNode(0)) {
+                                mode = 21;
+                            } else if (nodes.get(0) == c.getNode(cl)) {
+                                mode = 12;
+                            } else if (nodes.get(0) == c.getNode(0)) {
+                                mode = 11;
+                            } else if (nodes.get(nl) == c.getNode(cl)) {
+                                mode = 22;
+                            }
                             if (mode != 0) {
                                 joinArray[i] = null;
                                 joined = true;
@@ -642,10 +637,6 @@
                                     selected = true;
                                 }
                                 --left;
-                                if (nodes == null) {
-                                    nodes = new ArrayList<>(w.getNodes());
-                                    wayIds.add(w.getUniqueId());
-                                }
                                 if (mode == 21) {
                                     nodes.addAll(c.getNodes().subList(1, cl + 1));
                                 } else if (mode == 12) {
