Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(revision 3697)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java	(revision 3698)
@@ -6,4 +6,5 @@
 import java.awt.geom.Area;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -107,4 +108,40 @@
             }
 
+            // To avoid false positives on upload (only modified primitives
+            // are visited), we have to check possible connection to ways
+            // that are not in the set of validated primitives.
+            if (headWays == 0) {
+                Collection<OsmPrimitive> refs = head.getReferrers();
+                for (OsmPrimitive ref : refs) {
+                    if (ref != c1 && isCoastline(ref)) {
+                        // ref cannot be in <code>coastlines</code>, otherwise we would
+                        // have picked it up already
+                        headWays++;
+                        next = (Way) ref;
+
+                        if (head.equals(next.firstNode())) {
+                            headReversed = true;
+                        } else if (!head.equals(next.lastNode())) {
+                            headUnordered = true;
+                        }
+                    }
+                }
+            }
+            if (tailWays == 0) {
+                Collection<OsmPrimitive> refs = tail.getReferrers();
+                for (OsmPrimitive ref : refs) {
+                    if (ref != c1 && isCoastline(ref)) {
+                        tailWays++;
+                        prev = (Way) ref;
+
+                        if (tail.equals(prev.lastNode())) {
+                            tailReversed = true;
+                        } else if (!tail.equals(prev.firstNode())) {
+                            tailUnordered = true;
+                        }
+                    }
+                }
+            }
+
             List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
             primitives.add(c1);
@@ -130,9 +167,5 @@
 
             boolean unordered = false;
-            boolean reversed = false;
-
-            if (headWays == 1 && headReversed && tailWays == 1 && tailReversed) {
-                reversed = true;
-            }
+            boolean reversed = headWays == 1 && headReversed && tailWays == 1 && tailReversed;
 
             if (headWays > 1 || tailWays > 1) {
@@ -177,9 +210,11 @@
             return;
 
-        String natural = way.get("natural");
-        if (natural == null || !natural.equals("coastline"))
-            return;
-
-        coastlines.add(way);
+        if (isCoastline(way)) {
+            coastlines.add(way);
+        }
+    }
+
+    private static boolean isCoastline(OsmPrimitive osm) {
+        return osm instanceof Way && "coastline".equals(osm.get("natural"));
     }
 
