Index: src/org/openstreetmap/josm/data/DataSource.java
===================================================================
--- src/org/openstreetmap/josm/data/DataSource.java	(revision 11228)
+++ src/org/openstreetmap/josm/data/DataSource.java	(working copy)
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.data;
 
 import java.awt.geom.Area;
+import java.awt.geom.Path2D;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -76,12 +77,12 @@
         if (dataSources == null || dataSources.isEmpty()) {
             return null;
         }
-        Area a = new Area();
+        Path2D.Double p = new Path2D.Double();
         for (DataSource source : dataSources) {
             // create area from data bounds
-            a.add(new Area(source.bounds.asRect()));
+            p.append(source.bounds.asRect(), false);
         }
-        return a;
+        return new Area(p);
     }
 
     /**
Index: src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/Node.java	(revision 11228)
+++ src/org/openstreetmap/josm/data/osm/Node.java	(working copy)
@@ -409,7 +409,7 @@
 
     @Override
     public boolean isOutsideDownloadArea() {
-        return !isNewOrUndeleted() && getDataSet() != null && getDataSet().getDataSourceArea() != null
-                && getCoor() != null && !getCoor().isIn(getDataSet().getDataSourceArea());
+        java.awt.geom.Area dsArea = getDataSet() == null ? null : getDataSet().getDataSourceArea();
+        return !isNewOrUndeleted() && dsArea != null && isLatLonKnown() && !getCoor().isIn(dsArea);
     }
 }
Index: src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java	(revision 11228)
+++ src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java	(working copy)
@@ -3,8 +3,11 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.geom.Area;
 import java.util.List;
 
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -13,6 +16,7 @@
 import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.mappaint.ElemStyles;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 
 /**
  * Checks for ways connected to areas.
@@ -19,6 +23,7 @@
  * @since 4682
  */
 public class WayConnectedToArea extends Test {
+    private Area dsArea;
 
     /**
      * Constructs a new {@code WayConnectedToArea} test.
@@ -28,6 +33,13 @@
     }
 
     @Override
+    public void startTest(ProgressMonitor monitor) {
+        super.startTest(monitor);
+        DataSet dataSet = Main.getLayerManager().getEditDataSet();
+        dsArea = dataSet == null ? null : dataSet.getDataSourceArea();
+    }
+
+    @Override
     public void visit(Way w) {
         if (!w.isUsable() || w.isClosed() || !w.hasKey("highway")) {
             return;
@@ -62,7 +74,9 @@
     }
 
     private void testForError(Way w, Node wayNode, OsmPrimitive p) {
-        if (wayNode.isOutsideDownloadArea()) {
+        // wayNode.isOutsideDownloadArea()
+        if (!wayNode.isNewOrUndeleted() && dsArea != null
+                && wayNode.isLatLonKnown() && !wayNode.getCoor().isIn(dsArea)) {
             return;
         } else if (wayNode.getReferrers().stream().anyMatch(p1 -> p1.hasTag("route", "ferry"))) {
             return;
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 11228)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(working copy)
@@ -16,6 +16,7 @@
 import java.awt.TexturePaint;
 import java.awt.event.ActionEvent;
 import java.awt.geom.Area;
+import java.awt.geom.Path2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.io.File;
@@ -401,15 +402,18 @@
             // on some platforms viewport bounds seem to be offset from the left,
             // over-grow it just to be sure
             b.grow(100, 100);
-            Area a = new Area(b);
+            Path2D p = new Path2D.Double();
 
-            // now successively subtract downloaded areas
+            // combine successively downloaded areas
             for (Bounds bounds : data.getDataSourceBounds()) {
                 if (bounds.isCollapsed()) {
                     continue;
                 }
-                a.subtract(mv.getState().getArea(bounds));
+                p.append(mv.getState().getArea(bounds), false);
             }
+            // subtract combined areas
+            Area a = new Area(b);
+            a.subtract(new Area(p));
 
             // paint remainder
             MapViewPoint anchor = mv.getState().getPointFor(new EastNorth(0, 0));
