Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 16584)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 16585)
@@ -16,5 +16,5 @@
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -36,4 +36,5 @@
 
 import org.openstreetmap.josm.actions.AdaptableAction;
+import org.openstreetmap.josm.actions.CreateMultipolygonAction;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
@@ -48,4 +49,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler.Match;
@@ -55,4 +57,5 @@
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
@@ -70,4 +73,5 @@
 import org.openstreetmap.josm.tools.ImageResource;
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.StreamUtils;
 import org.openstreetmap.josm.tools.Utils;
@@ -401,14 +405,27 @@
             }
         } else if (answer == DIALOG_ANSWER_NEW_RELATION) {
-            final Relation r = new Relation();
-            final Collection<RelationMember> members = new HashSet<>();
+            Relation calculated = null;
+            if (getChangedTags().stream().anyMatch(t -> "boundary".equals(t.get("type")) || "multipolygon".equals(t.get("type")))) {
+                Pair<Relation, Relation> res = CreateMultipolygonAction.createMultipolygonRelation(ds.getSelectedWays(), true);
+                if (res != null) {
+                    calculated = res.b;
+                }
+            }
+            final Relation r = calculated != null ? calculated : new Relation();
+            final Collection<RelationMember> members = new LinkedHashSet<>();
+            members.addAll(r.getMembers());
             for (Tag t : getChangedTags()) {
                 r.put(t.getKey(), t.getValue());
             }
             for (OsmPrimitive osm : ds.getSelected()) {
+                if (r == calculated && osm instanceof Way)
+                    continue;
                 String role = suggestRoleForOsmPrimitive(osm);
                 RelationMember rm = new RelationMember(role == null ? "" : role, osm);
                 r.addMember(rm);
                 members.add(rm);
+            }
+            if (r.isMultipolygon() && r != calculated) {
+                r.setMembers(RelationSorter.sortMembersByConnectivity(r.getMembers()));
             }
             SwingUtilities.invokeLater(() -> RelationEditor.getEditor(
