diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
index ee9bbf6..796a33c 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
@@ -539,7 +539,7 @@ public class StyledMapRenderer extends AbstractMapRenderer {
 
     public void drawArea(Relation r, Color color, MapImage fillImage, boolean disabled, TextElement text) {
         Multipolygon multipolygon = MultipolygonCache.getInstance().get(nc, r);
-        if (!r.isDisabled() && !multipolygon.getOuterWays().isEmpty()) {
+        if (!r.isDisabled() && !multipolygon.getOuterWays().isEmpty() && multipolygon.isDrawEncouraged()) {
             for (PolyData pd : multipolygon.getCombinedPolygons()) {
                 Path2D.Double p = pd.get();
                 if (!isAreaVisible(p)) {
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
index d338709..7a726e5 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
@@ -26,6 +26,7 @@ import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData.Intersection;
+import org.openstreetmap.josm.tools.Geometry;
 
 /**
  * Multipolygon data used to represent complex areas, see <a href="https://wiki.openstreetmap.org/wiki/Relation:multipolygon">wiki</a>.
@@ -592,4 +593,29 @@ public class Multipolygon {
     public List<PolyData> getCombinedPolygons() {
         return combinedPolygons;
     }
+
+    public boolean isDrawEncouraged() {
+        if (!isIncomplete()) {
+            return true;
+        } else if (Main.pref.getBoolean("mappaint.multipolygon.incomplete", false)) {
+            return true;
+        }
+
+        // Determines if inner nodes lie on both sides of the line through the first and last node.
+        // If this is the case, then drawing and incomplete multipolygon is problematic.
+        int seenValues = 0;
+        for (PolyData pd : getCombinedPolygons()) {
+            final Node first = pd.nodes.get(0);
+            final Node last = pd.nodes.get(pd.nodes.size() - 1);
+            for (Node n : pd.nodes.subList(1, pd.nodes.size() - 2)) {
+                final boolean isClockwise = Geometry.angleIsClockwise(first, last, n);
+                seenValues |= isClockwise ? 0b10 : 0b01;
+                if (seenValues == 0b11) {
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java b/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
index af28bf4..0cf7330 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
@@ -246,6 +246,10 @@ public class ElemStyles {
                 }
                 final Multipolygon multipolygon = MultipolygonCache.getInstance().get(nc, ref);
 
+                if (!multipolygon.isDrawEncouraged()) {
+                    continue;
+                }
+
                 if (multipolygon.getInnerWays().contains(osm)) {
                     p = generateStyles(osm, scale, false);
                     boolean hasIndependentElemStyle = false;
