Index: trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 17405)
+++ trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 17406)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
 import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.ChangeMembersCommand;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
@@ -112,15 +113,14 @@
                 return;
             }
-            final Command command = commandAndRelation.a;
 
             // to avoid EDT violations
             SwingUtilities.invokeLater(() -> {
-                if (multipolygonRelation != null) {
-                    // rather ugly: update generated a ChangeMembersCommand with a copy of the member list, so clear the list now
-                    commandAndRelation.b.setMembers(null); // #see 19885
-                }
-                UndoRedoHandler.getInstance().add(command);
+                UndoRedoHandler.getInstance().add(commandAndRelation.a);
+                Relation calculatedRel = commandAndRelation.b;
+                if (calculatedRel.getDataSet() == null) {
+                    calculatedRel.setMembers(null); // see #19885
+                }
                 final Relation relation = (Relation) MainApplication.getLayerManager().getEditDataSet()
-                        .getPrimitiveById(commandAndRelation.b);
+                        .getPrimitiveById(calculatedRel);
                 if (relation == null || relation.getDataSet() == null)
                     return; // should not happen
@@ -350,5 +350,8 @@
         } else {
             if (!unchanged) {
-                list.add(new ChangeMembersCommand(existingRelation, new ArrayList<>(relation.getMembers())));
+                if (relation.getKeys().equals(existingRelation.getKeys()))
+                    list.add(new ChangeMembersCommand(existingRelation, new ArrayList<>(relation.getMembers())));
+                else
+                    list.add(new ChangeCommand(existingRelation, relation));
             }
             if (list.isEmpty()) {
Index: trunk/test/data/regress/20230/data.osm
===================================================================
--- trunk/test/data/regress/20230/data.osm	(revision 17406)
+++ trunk/test/data/regress/20230/data.osm	(revision 17406)
@@ -0,0 +1,18 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='never' generator='JOSM'>
+  <node id='-101772' action='modify' visible='true' lat='48.98752364296' lon='16.49944662685' />
+  <node id='-101773' action='modify' visible='true' lat='48.98864367177' lon='16.51184337777' />
+  <node id='-101774' action='modify' visible='true' lat='48.97851148839' lon='16.51396902643' />
+  <node id='-101775' action='modify' visible='true' lat='48.97739123185' lon='16.50157227551' />
+  <way id='-106430' action='modify' visible='true'>
+    <nd ref='-101772' />
+    <nd ref='-101773' />
+    <nd ref='-101774' />
+    <nd ref='-101775' />
+    <nd ref='-101772' />
+    <tag k='building' v='yes' />
+  </way>
+  <relation id='-99755' action='modify' visible='true'>
+    <tag k='type' v='multipolygon' />
+  </relation>
+</osm>
Index: trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java	(revision 17405)
+++ trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java	(revision 17406)
@@ -174,3 +174,20 @@
         assertEquals(numCoastlineWays, ds.getWays().stream().filter(w -> "coastline".equals(w.get("natural"))).count());
     }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/20230">Bug #20230</a>.
+     * @throws Exception if an error occurs
+     */
+    @Test
+    void testTicket20230() throws Exception {
+        DataSet ds = OsmReader.parseDataSet(TestUtils.getRegressionDataStream(20230, "data.osm"), null);
+        assertEquals(1, ds.getRelations().size());
+        Relation mp = ds.getRelations().iterator().next();
+        Relation modMp = createMultipolygon(ds.getWays(), "type:way", mp, true);
+        assertNotNull(modMp);
+        assertEquals(1, ds.getRelations().size());
+        modMp = ds.getRelations().iterator().next();
+        assertTrue(modMp.hasTag("building", "yes"));
+        assertEquals(0, ds.getWays().stream().filter(w -> w.hasTag("building", "yes")).count());
+    }
 }
