Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java	(revision 9059)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java	(revision 9061)
@@ -49,4 +49,8 @@
     /** Preference: should only the data area outline be drawn */
     private boolean outlineOnly;
+    /** Preference: if unclosed areas should be drawn differently for partial fill */
+    private boolean unclosedAreaHighlight;
+    /** Preference: width of unclosed area highlight */
+    private double unclosedAreaHighlightWidth;
     /** Color Preference for selected objects */
     private Color selectedColor;
@@ -106,4 +110,6 @@
 
         outlineOnly = Main.pref.getBoolean("draw.data.area_outline_only", false);
+        unclosedAreaHighlight = Main.pref.getBoolean("draw.unclosed_area_partial_fill_highlight", true);
+        unclosedAreaHighlightWidth = Main.pref.getDouble("draw.unclosed_area_partial_fill_highlight.width", 80);
     }
 
@@ -346,3 +352,20 @@
         return outlineOnly;
     }
+
+    /**
+     * Determines if unclosed areas should be drawn differently for partial fill.
+     * 
+     * @return {@code true} if unclosed areas should be drawn differently for partial fill
+     */
+    public boolean isUnclosedAreaHighlight() {
+        return unclosedAreaHighlight;
+    }
+
+    /**
+     * Returns the width of unclosed area highlight
+     * @return the width of unclosed area highlight
+     */
+    public double getUnclosedAreaHighlightWidth() {
+        return unclosedAreaHighlightWidth;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 9059)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 9061)
@@ -333,4 +333,6 @@
     private boolean showIcons;
     private boolean isOutlineOnly;
+    private boolean isUnclosedAreaHighlight;
+    private double unclosedAreaHighlightWidth;
 
     private Font orderFont;
@@ -451,5 +453,23 @@
     }
 
-    protected void drawArea(OsmPrimitive osm, Path2D.Double path, Color color, MapImage fillImage, Float extent,
+    /**
+     * Worker function for drawing areas.
+     * 
+     * @param osm the primitive
+     * @param path the path object for the area that should be drawn; in case
+     * of multipolygons, this can path can be a complex shape with one outer
+     * polygon and one or more inner polygons
+     * @param color The color to fill the area with.
+     * @param fillImage The image to fill the area with. Overrides color.
+     * @param extent if not null, area will be filled partially; specifies, how
+     * far to fill from the boundary towards the center of the area;
+     * if null, area will be filled completely
+     * @param unClosedHighlight true, if the fact that the way / multipolygon is not
+     * properly closed should be highlighted; this parameter is only used
+     * for partial fill ({@code extent != null}), otherwise it is ignored 
+     * @param disabled If this should be drawn with a special disabled style.
+     * @param text The text to write on the area.
+     */
+    protected void drawArea(OsmPrimitive osm, Path2D.Double path, Color color, MapImage fillImage, Float extent, boolean unClosedHighlight,
             boolean disabled, TextElement text) {
 
@@ -466,9 +486,15 @@
                     g.fill(area);
                 } else {
-                    Shape clip = g.getClip();
-                    g.clip(area);
-                    g.setStroke(new BasicStroke(2 * extent, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
-                    g.draw(area);
-                    g.setClip(clip);
+                    if (unClosedHighlight) {
+                        g.setStroke(new BasicStroke((int)(unclosedAreaHighlightWidth / 100 * extent),
+                                BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
+                        g.draw(area);
+                    } else {
+                        Shape clip = g.getClip();
+                        g.clip(area);
+                        g.setStroke(new BasicStroke(2 * extent, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
+                        g.draw(area);
+                        g.setClip(clip);
+                    }
                 }
             } else {
@@ -483,9 +509,15 @@
                     g.fill(area);
                 } else {
-                    Shape clip = g.getClip();
-                    BasicStroke stroke = new BasicStroke(2 * extent, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
-                    g.clip(stroke.createStrokedShape(area));
-                    g.fill(area);
-                    g.setClip(clip);
+                    if (unClosedHighlight) {
+                        g.setStroke(new BasicStroke((int)(unclosedAreaHighlightWidth / 100 * extent),
+                                BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
+                        g.draw(area);
+                    } else {
+                        Shape clip = g.getClip();
+                        BasicStroke stroke = new BasicStroke(2 * extent, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
+                        g.clip(stroke.createStrokedShape(area));
+                        g.fill(area);
+                        g.setClip(clip);
+                    }
                 }
                 g.setPaintMode();
@@ -592,5 +624,7 @@
                 drawArea(r, p,
                         pd.selected ? paintSettings.getRelationSelectedColor(color.getAlpha()) : color,
-                        fillImage, extent, disabled, text);
+                        fillImage, extent,
+                        isUnclosedAreaHighlight && extent != null && !pd.isClosed(),
+                        disabled, text);
             }
         }
@@ -609,5 +643,5 @@
      */
     public void drawArea(Way w, Color color, MapImage fillImage, Float extent, boolean disabled, TextElement text) {
-        drawArea(w, getPath(w), color, fillImage, extent, disabled, text);
+        drawArea(w, getPath(w), color, fillImage, extent, isUnclosedAreaHighlight && !w.isClosed(), disabled, text);
     }
 
@@ -1464,4 +1498,6 @@
         showIcons = paintSettings.getShowIconsDistance() > circum;
         isOutlineOnly = paintSettings.isOutlineOnly();
+        isUnclosedAreaHighlight = paintSettings.isUnclosedAreaHighlight();
+        unclosedAreaHighlightWidth = paintSettings.getUnclosedAreaHighlightWidth();
         orderFont = new Font(Main.pref.get("mappaint.font", "Droid Sans"), Font.PLAIN, Main.pref.getInteger("mappaint.fontsize", 8));
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 9059)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 9061)
@@ -360,4 +360,12 @@
                 resetNodes(event.getDataset());
             }
+        }
+
+        public boolean isClosed() {
+            if (nodes.size() < 3 || nodes.get(0) != nodes.get(nodes.size() - 1)) return false;
+            for (PolyData inner : inners) {
+                if (!inner.isClosed()) return false;
+            }
+            return true;
         }
     }
