Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1266)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1267)
@@ -117,10 +117,10 @@
 
         profilerVisibleNodes++;
-        
+
         IconElemStyle nodeStyle = (IconElemStyle)getPrimitiveStyle(n);
 
         if(profilerOmitDraw)
             return;
-            
+
         if (nodeStyle != null && isZoomOk(nodeStyle))
             drawNode(n, nodeStyle.icon, nodeStyle.annotate, n.selected);
@@ -161,4 +161,6 @@
 
         w.mappaintVisibleCode = 0;
+        if(fillAreas)
+            w.clearErrors();
 
         if(wayStyle==null)
@@ -185,4 +187,6 @@
                     profilerVisibleAreas++;
                     drawArea(polygon, w.selected ? selectedColor : ((AreaElemStyle)wayStyle).color);
+                    if(!w.isClosed())
+                        w.putError(tr("Area style way is not closed."), true);
                 }
                 drawWay(w, ((AreaElemStyle)wayStyle).line, ((AreaElemStyle)wayStyle).color, w.selected);
@@ -421,5 +425,5 @@
 
     public void visit(Relation r) {
-   
+
         r.mappaintVisibleCode = 0;
         /* TODO implement visible handling for relations too */
@@ -512,4 +516,5 @@
         {
             Boolean zoomok = isZoomOk(wayStyle);
+            Boolean visible = false;
             Collection<Way> join = new LinkedList<Way>();
 
@@ -541,6 +546,7 @@
                 r.putError(tr("No outer way for multipolygon ''{0}''.",
                 r.getName()), true);
-            }
-            else if(zoomok) 
+                visible = true; /* prevent killing remaining ways */
+            }
+            else if(zoomok)
             {
                 class PolyData {
@@ -638,7 +644,20 @@
                 for (PolyData pd : poly)
                 {
-                    drawArea(pd.get(), (pd.way.selected || r.selected) ? selectedColor
-                    : ((AreaElemStyle)wayStyle).color);
-                }
+                    if(isPolygonVisible(pd.get()))
+                    {
+                        drawArea(pd.get(), (pd.way.selected || r.selected) ? selectedColor
+                        : ((AreaElemStyle)wayStyle).color);
+                        visible = true;
+                    }
+                }
+            }
+            if(!visible) /* nothing visible, so disable relation and all its ways */
+            {
+                r.mappaintVisibleCode = viewid;
+                for (Way wInner : inner)
+                    wInner.mappaintVisibleCode = viewid;
+                for (Way wOuter : outer)
+                    wOuter.mappaintVisibleCode = viewid;
+                return;
             }
             for (Way wInner : inner)
@@ -647,5 +666,6 @@
                 if(innerStyle == null)
                 {
-                    if(zoomok)
+                    if(zoomok && (wInner.mappaintDrawnCode != paintid
+                    || outer.size() == 0))
                     {
                         drawWay(wInner, ((AreaElemStyle)wayStyle).line,
