Index: /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 6596)
+++ /trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 6597)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -54,12 +55,22 @@
 public class CreateMultipolygonAction extends JosmAction {
 
+    private final boolean update;
+
     /**
      * Constructs a new {@code CreateMultipolygonAction}.
      */
-    public CreateMultipolygonAction() {
-        super(tr("Create multipolygon"), "multipoly_create", tr("Create multipolygon"),
-            Shortcut.registerShortcut("tools:multipoly", tr("Tool: {0}", tr("Create multipolygon")),
-            KeyEvent.VK_A, Shortcut.ALT_CTRL), true);
-    }
+    public CreateMultipolygonAction(final boolean update) {
+        super(getName(update), "multipoly_create", getName(update),
+                update
+                        ? null
+                        : Shortcut.registerShortcut("tools:multipoly", tr("Tool: {0}", getName(false)), KeyEvent.VK_A, Shortcut.ALT_CTRL),
+                true, update ? "multipoly_update" : "multipoly_create", true);
+        this.update = update;
+    }
+
+    private static String getName(boolean update) {
+        return update ? tr("Update multipolygon") : tr("Create multipolygon");
+    }
+
     /**
      * The action button has been clicked
@@ -92,5 +103,7 @@
         }
 
-        final Relation multipolygonRelation = getSelectedMultipolygonRelation(selectedRelations);
+        final Relation multipolygonRelation = update
+                ? getSelectedMultipolygonRelation(selectedWays, selectedRelations)
+                : null;
         if (multipolygonRelation != null && (multipolygonRelation.isIncomplete() || multipolygonRelation.hasIncompleteMembers())) {
             new Notification(
@@ -102,5 +115,5 @@
         }
 
-        final Pair<SequenceCommand, Relation> commandAndRelation = createMultipolygonCommand(selectedWays, selectedRelations);
+        final Pair<SequenceCommand, Relation> commandAndRelation = createMultipolygonCommand(selectedWays, multipolygonRelation);
         if (commandAndRelation == null) {
             return;
@@ -131,8 +144,18 @@
     }
 
-    private static Relation getSelectedMultipolygonRelation(Collection<Relation> selectedRelations) {
-        return  selectedRelations.size() == 1 && "multipolygon".equals(selectedRelations.iterator().next().get("type"))
-                ? selectedRelations.iterator().next()
-                : null;
+    private Relation getSelectedMultipolygonRelation() {
+        return getSelectedMultipolygonRelation(getCurrentDataSet().getSelectedWays(), getCurrentDataSet().getSelectedRelations());
+    }
+
+    private static Relation getSelectedMultipolygonRelation(Collection<Way> selectedWays, Collection<Relation> selectedRelations) {
+        if (selectedRelations.size() == 1 && "multipolygon".equals(selectedRelations.iterator().next().get("type"))) {
+            return selectedRelations.iterator().next();
+        } else {
+            final HashSet<Relation> relatedRelations = new HashSet<Relation>();
+            for (final Way w : selectedWays) {
+                relatedRelations.addAll(Utils.filteredCollection(w.getReferrers(), Relation.class));
+            }
+            return relatedRelations.size() == 1 ? relatedRelations.iterator().next() : null;
+        }
     }
 
@@ -140,20 +163,26 @@
      * Returns a {@link Pair} of the old multipolygon {@link Relation} (or null) and the newly created/modified multipolygon {@link Relation}.
      */
-    public static Pair<Relation, Relation> createMultipolygonRelation(Collection<Way> selectedWays, Collection<Relation> selectedRelations) {
-
-        final Relation selectedMultipolygonRelation = getSelectedMultipolygonRelation(selectedRelations);
-        if (selectedMultipolygonRelation != null) {
-            // add ways of existing relation to include them in polygon analysis
-            selectedWays = new HashSet<Way>(selectedWays);
-            selectedWays.addAll(selectedMultipolygonRelation.getMemberPrimitives(Way.class));
-        }
+    public static Pair<Relation, Relation> updateMultipolygonRelation(Collection<Way> selectedWays, Relation selectedMultipolygonRelation) {
+
+        // add ways of existing relation to include them in polygon analysis
+        selectedWays = new HashSet<Way>(selectedWays);
+        selectedWays.addAll(selectedMultipolygonRelation.getMemberPrimitives(Way.class));
 
         final MultipolygonCreate polygon = analyzeWays(selectedWays);
         if (polygon == null) {
             return null; //could not make multipolygon.
-        }
-
-        if (selectedMultipolygonRelation != null) {
+        } else {
             return Pair.create(selectedMultipolygonRelation, createRelation(polygon, new Relation(selectedMultipolygonRelation)));
+        }
+    }
+
+    /**
+     * Returns a {@link Pair} null and the newly created/modified multipolygon {@link Relation}.
+     */
+    public static Pair<Relation, Relation> createMultipolygonRelation(Collection<Way> selectedWays) {
+
+        final MultipolygonCreate polygon = analyzeWays(selectedWays);
+        if (polygon == null) {
+            return null; //could not make multipolygon.
         } else {
             return Pair.create(null, createRelation(polygon, new Relation()));
@@ -164,7 +193,9 @@
      * Returns a pair of a multipolygon creating/modifying {@link Command} as well as the multipolygon {@link Relation}.
      */
-    public static Pair<SequenceCommand, Relation> createMultipolygonCommand(Collection<Way> selectedWays, Collection<Relation> selectedRelations) {
-
-        final Pair<Relation, Relation> rr = createMultipolygonRelation(selectedWays, selectedRelations);
+    public static Pair<SequenceCommand, Relation> createMultipolygonCommand(Collection<Way> selectedWays, Relation selectedMultipolygonRelation) {
+
+        final Pair<Relation, Relation> rr = selectedMultipolygonRelation == null
+                ? createMultipolygonRelation(selectedWays)
+                : updateMultipolygonRelation(selectedWays, selectedMultipolygonRelation);
         if (rr == null) {
             return null;
@@ -177,8 +208,8 @@
         if (existingRelation == null) {
             list.add(new AddCommand(relation));
-            commandName = tr("Create multipolygon");
+            commandName = getName(false);
         } else {
             list.add(new ChangeCommand(existingRelation, relation));
-            commandName = tr("Update multipolygon");
+            commandName = getName(true);
         }
         return Pair.create(new SequenceCommand(commandName, list), relation);
@@ -200,9 +231,9 @@
       */
     @Override protected void updateEnabledState(Collection < ? extends OsmPrimitive > selection) {
-        setEnabled(selection != null && !selection.isEmpty());
-        putValue(NAME, getSelectedMultipolygonRelation(getCurrentDataSet().getSelectedRelations()) != null
-                ? tr("Update multipolygon")
-                : tr("Create multipolygon")
-        );
+        if (update) {
+            setEnabled(getSelectedMultipolygonRelation() != null);
+        } else {
+            setEnabled(!getCurrentDataSet().getSelectedWays().isEmpty());
+        }
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 6596)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java	(revision 6597)
@@ -184,6 +184,5 @@
 
             // Create new multipolygon using the logics from CreateMultipolygonAction and see if roles match.
-            final Pair<Relation, Relation> newMP = CreateMultipolygonAction.createMultipolygonRelation(
-                    r.getMemberPrimitives(Way.class), Collections.singleton(new Relation()));
+            final Pair<Relation, Relation> newMP = CreateMultipolygonAction.createMultipolygonRelation(r.getMemberPrimitives(Way.class));
             if (newMP != null) {
                 for (RelationMember member : r.getMembers()) {
Index: /trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 6596)
+++ /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 6597)
@@ -254,5 +254,7 @@
     public final JoinAreasAction joinAreas = new JoinAreasAction();
     /** Tools -> Create multipolygon */
-    public final CreateMultipolygonAction createMultipolygon = new CreateMultipolygonAction();
+    public final CreateMultipolygonAction createMultipolygon = new CreateMultipolygonAction(false);
+    /** Tools -> Update multipolygon */
+    public final CreateMultipolygonAction updateMultipolygon = new CreateMultipolygonAction(true);
 
     /* Selection menu */
@@ -733,4 +735,5 @@
         add(toolsMenu, joinAreas);
         add(toolsMenu, createMultipolygon);
+        add(toolsMenu, updateMultipolygon);
 
         // -- changeset manager toggle action
Index: /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.groovy
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.groovy	(revision 6596)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.groovy	(revision 6597)
@@ -18,5 +18,5 @@
     }
 
-    def getRefToRoleMap(Relation relation) {
+    static def getRefToRoleMap(Relation relation) {
         def refToRole = new TreeMap<String, String>()
         for (i in relation.getMembers()) {
@@ -28,5 +28,5 @@
     void testCreate1() {
         def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ds.getWays(), Collections.emptyList())
+        def mp = CreateMultipolygonAction.createMultipolygonCommand(ds.getWays(), null)
         assert mp.a.getDescriptionText() == "Sequence: Create multipolygon"
         assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer, 1.1.2:outer, 1.2:inner]"
@@ -36,5 +36,5 @@
         def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
         def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1.", false, false))
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, Collections.emptyList())
+        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
         assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1.1:inner, 1.1.2:inner]"
     }
@@ -43,9 +43,9 @@
         def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
         def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=\".*1\$\"", false, true))
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, Collections.emptyList())
+        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
         assert mp.b.getMembersCount() == 3
         assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer]"
         def ways2 = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1.2", false, true))
-        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, Collections.singleton(mp.b))
+        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, mp.b)
         assert mp2.b.getMembersCount() == 4
         assert getRefToRoleMap(mp2.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer, 1.2:inner]"
@@ -55,8 +55,8 @@
         def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
         def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1.1", false, false))
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, Collections.emptyList())
+        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
         assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1.1:inner]"
         def ways2 = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1.1 OR ref=1.2 OR ref=1.1.2", false, true))
-        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, Collections.singleton(mp.b))
+        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, mp.b)
         assert getRefToRoleMap(mp2.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer, 1.1.2:outer, 1.2:inner]"
     }
