Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2677)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2678)
@@ -398,3 +398,8 @@
         return super.isUsable() && !hasIncompleteNodes();
     }
+
+    @Override
+    public boolean isDrawable() {
+        return super.isDrawable() && !hasIncompleteNodes();
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintVisitor.java	(revision 2677)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintVisitor.java	(revision 2678)
@@ -190,5 +190,5 @@
     {
         Collection<PolyData> res = new LinkedList<PolyData>();
-        Object[] joinArray = join.toArray();
+        Way[] joinArray = join.toArray(new Way[join.size()]);
         int left = join.size();
         while(left != 0)
@@ -205,5 +205,5 @@
                     if(joinArray[i] != null)
                     {
-                        Way c = (Way)joinArray[i];
+                        Way c = joinArray[i];
                         if(w == null)
                         { w = c; selected = data.isSelected(w); joinArray[i] = null; --left; }
@@ -631,5 +631,5 @@
         for (PolyData pdOuter : outerPolygons)
         {
-            Integer c = pdOuter.contains(pdInner.poly);
+            int c = pdOuter.contains(pdInner.poly);
             if(c >= 1)
             {
@@ -664,12 +664,12 @@
         boolean drawn = false;
 
-        for (RelationMember m : r.getMembers())
-        {
+        // Fill inner and outer list with valid ways
+        for (RelationMember m : r.getMembers()) {
             if (m.getMember().isDeleted()) {
                 putError(r, tr("Deleted member ''{0}'' in relation.",
                         m.getMember().getDisplayName(DefaultNameFormatter.getInstance())), true);
-            } else if(m.getMember().isIncomplete()) {
+            } else if (m.getMember().isIncomplete()) {
                 incomplete = true;
-            } else {
+            } else if(m.getMember().isDrawable()) {
                 if(m.isWay()) {
                     Way w = m.getWay();
@@ -688,4 +688,5 @@
                             outer.add(w);
                         } else if(data.isSelected(r)) {
+                            // TODO Is this necessary?
                             drawSelectedMember(m.getMember(), styles != null
                                     ? getPrimitiveStyle(m.getMember()) : null, true, true);
@@ -701,11 +702,12 @@
         }
 
-        ElemStyle wayStyle = styles != null ? getPrimitiveStyle(r) : null;
-        if(styles != null && (wayStyle == null || !(wayStyle instanceof AreaElemStyle)))
-        {
-            for (Way w : outer)
-            {
-                if(wayStyle == null) {
-                    wayStyle = styles.getArea(w);
+        ElemStyle wayStyle = getPrimitiveStyle(r);
+
+        // If area style was not found for relation then use style of ways
+        if(styles != null && !(wayStyle instanceof AreaElemStyle)) {
+            for (Way w : outer) {
+                wayStyle = styles.getArea(w);
+                if(wayStyle != null) {
+                    break;
                 }
             }
@@ -713,6 +715,5 @@
         }
 
-        if(wayStyle != null && wayStyle instanceof AreaElemStyle)
-        {
+        if (wayStyle instanceof AreaElemStyle) {
             boolean zoomok = isZoomOk(wayStyle);
             boolean visible = false;
@@ -737,4 +738,6 @@
                 }
             }
+
+
             if(outerclosed.size() == 0 && outerjoin.size() == 0)
             {
@@ -771,4 +774,5 @@
                 }
             }
+
             if(!visible)
                 return drawn;
