Index: src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 15620)
+++ src/org/openstreetmap/josm/actions/CombineWayAction.java	(working copy)
@@ -14,6 +14,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.swing.JOptionPane;
@@ -106,7 +107,19 @@
      * @throws UserCancelException if the user cancelled a dialog.
      */
     public static Pair<Way, Command> combineWaysWorker(Collection<Way> ways) throws UserCancelException {
+        return combineWaysWorker(ways, false);
+    }
 
+    /**
+     * Combine multiple ways into one.
+     * @param ways the way to combine to one way
+     * @param checkOutsideNodes if true, don't allow combination at nodes outside the download area
+     * @return null if ways cannot be combined. Otherwise returns the combined ways and the commands to combine
+     * @throws UserCancelException if the user cancelled a dialog.
+     * @since xxx
+     */
+    public static Pair<Way, Command> combineWaysWorker(Collection<Way> ways, boolean checkOutsideNodes) throws UserCancelException {
+
         // prepare and clean the list of ways to combine
         //
         if (ways == null || ways.isEmpty())
@@ -116,7 +129,7 @@
         // remove duplicates, preserving order
         ways = new LinkedHashSet<>(ways);
         // remove incomplete ways
-        ways.removeIf(w -> w.isIncomplete() || w.isOutsideDownloadArea());
+        ways.removeIf(OsmPrimitive::isIncomplete);
         // we need at least two ways
         if (ways.size() < 2)
             return null;
@@ -132,6 +145,27 @@
             warnCombiningImpossible();
             return null;
         }
+        if (checkOutsideNodes) {
+            for (Node n : path) {
+                if (n.isOutsideDownloadArea() && !n.isNew()) {
+                    int count = 0;
+                    Set<Way> parentWays = n.referrers(Way.class).collect(Collectors.toSet());
+                    for (Way w : ways) {
+                        if (parentWays.contains(w))
+                            count++;
+                    }
+                    if (count > 1) {
+                        String msg = tr("Could not combine ways<br>"
+                                + "(A shared node is outside of download area)");
+                        new Notification(msg)
+                        .setIcon(JOptionPane.INFORMATION_MESSAGE)
+                        .show();
+                        return null;
+                    }
+                }
+            }
+        }
+
         // check whether any ways have been reversed in the process
         // and build the collection of tags used by the ways to combine
         //
@@ -283,7 +317,7 @@
         // combine and update gui
         Pair<Way, Command> combineResult;
         try {
-            combineResult = combineWaysWorker(selectedWays);
+            combineResult = combineWaysWorker(selectedWays, true);
         } catch (UserCancelException ex) {
             Logging.trace(ex);
             return;
@@ -325,8 +359,7 @@
         int numWays = 0;
         if (OsmUtils.isOsmCollectionEditable(selection)) {
             for (OsmPrimitive osm : selection) {
-                if (osm instanceof Way && !osm.isIncomplete() && !((Way) osm).isOutsideDownloadArea()
-                        && ++numWays >= 2) {
+                if (osm instanceof Way && !osm.isIncomplete() && ++numWays >= 2) {
                     break;
                 }
             }
