Index: /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 17407)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 17408)
@@ -339,7 +339,7 @@
             return null;
         }
-        boolean unchanged = rr.a == rr.b;
+        boolean changedMembers = rr.a != rr.b;
         final Relation existingRelation = rr.a;
-        final Relation relation = rr.b;
+        final Relation relation = changedMembers ? rr.b : new Relation(rr.a);
 
         final List<Command> list = removeTagsFromWaysIfNeeded(relation);
@@ -349,12 +349,14 @@
             commandName = getName(false);
         } else {
-            if (!unchanged) {
-                if (relation.getKeys().equals(existingRelation.getKeys()))
-                    list.add(new ChangeMembersCommand(existingRelation, new ArrayList<>(relation.getMembers())));
-                else
-                    list.add(new ChangeCommand(existingRelation, relation));
+            boolean changedKeys = !relation.getKeys().equals(existingRelation.getKeys());
+            if (changedKeys && changedMembers)
+                list.add(new ChangeCommand(existingRelation, relation));
+            else if (changedMembers) {
+                list.add(new ChangeMembersCommand(existingRelation, new ArrayList<>(relation.getMembers())));
+            } else if (changedKeys) {
+                list.add(ChangePropertyCommand.build(existingRelation, relation));
             }
             if (list.isEmpty()) {
-                if (unchanged) {
+                if (!changedMembers) {
                     MultipolygonTest mpTest = new MultipolygonTest();
                     mpTest.visit(existingRelation);
Index: /trunk/test/data/regress/20238/data.osm
===================================================================
--- /trunk/test/data/regress/20238/data.osm	(revision 17408)
+++ /trunk/test/data/regress/20238/data.osm	(revision 17408)
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='never' generator='JOSM'>
+  <node id='-101831' action='modify' lat='48.98323500254' lon='16.50635777123' />
+  <node id='-101832' action='modify' lat='48.98328900327' lon='16.50695540658' />
+  <node id='-101833' action='modify' lat='48.9828005353' lon='16.50705788205' />
+  <node id='-101834' action='modify' lat='48.98274653404' lon='16.5064602467' />
+  <way id='-106679' action='modify'>
+    <nd ref='-101831' />
+    <nd ref='-101832' />
+    <nd ref='-101833' />
+    <nd ref='-101834' />
+    <nd ref='-101831' />
+    <tag k='building' v='yes' />
+  </way>
+  <relation id='-99785' action='modify'>
+    <member type='way' ref='-106679' role='outer' />
+    <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 17407)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java	(revision 17408)
@@ -191,3 +191,26 @@
         assertEquals(0, ds.getWays().stream().filter(w -> w.hasTag("building", "yes")).count());
     }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/20238">Bug #20238</a>.
+     * @throws Exception if an error occurs
+     */
+    @Test
+    void testTicket20238() throws Exception {
+        DataSet ds = OsmReader.parseDataSet(TestUtils.getRegressionDataStream(20238, "data.osm"), null);
+        assertEquals(1, ds.getRelations().size());
+        Relation mp = ds.getRelations().iterator().next();
+        assertFalse(ds.getRelations().iterator().next().hasTag("building", "yes"));
+        assertEquals(1, ds.getWays().stream().filter(w -> w.hasTag("building", "yes")).count());
+        Pair<SequenceCommand, Relation> cmd = CreateMultipolygonAction.createMultipolygonCommand(ds.getWays(), mp);
+        assertNotNull(cmd);
+        cmd.a.executeCommand();
+        assertEquals(1, ds.getRelations().size());
+        assertTrue(ds.getRelations().iterator().next().hasTag("building", "yes"));
+        assertEquals(0, ds.getWays().stream().filter(w -> w.hasTag("building", "yes")).count());
+        cmd.a.undoCommand();
+        assertEquals(1, ds.getRelations().size());
+        assertFalse(ds.getRelations().iterator().next().hasTag("building", "yes"));
+        assertEquals(1, ds.getWays().stream().filter(w -> w.hasTag("building", "yes")).count());
+    }
 }
