Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1268)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1270)
@@ -41,8 +41,6 @@
     /* mappaint data */
     public ElemStyle mappaintStyle = null;
-    public boolean isMappaintArea = false;
     public Integer mappaintVisibleCode = 0;
     public Integer mappaintDrawnCode = 0;
-    public Integer mappaintDrawnAreaCode = 0;
     public Collection<String> errors;
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 1268)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 1270)
@@ -26,4 +26,9 @@
     public final List<Node> nodes = new ArrayList<Node>();
 
+    /* mappaint data */
+    public boolean isMappaintArea = false;
+    public Integer mappaintDrawnAreaCode = 0;
+    /* end of mappaint data */
+    
     public void visitNodes(Visitor v) {
         for (Node n : this.nodes)
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1268)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1270)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.gui.mappaint.AreaElemStyle;
 import org.openstreetmap.josm.gui.mappaint.ElemStyle;
@@ -38,7 +39,9 @@
     protected boolean useRealWidth;
     protected boolean zoomLevelDisplay;
-    protected boolean fillAreas;
+    protected int fillAreas;
     protected boolean drawMultipolygon;
-    protected boolean showName;
+    protected int showNames;
+    protected int showIcons;
+    protected int useStrokes;
     protected int fillAlpha;
     protected Color untaggedColor;
@@ -50,4 +53,5 @@
     protected ElemStyles.StyleSet styles;
     protected double circum;
+    protected double dist;
     protected String regionalNameOrder[];
     protected Boolean selectedCall;
@@ -84,16 +88,18 @@
         if(osm.mappaintStyle == null && styles != null) {
             osm.mappaintStyle =  styles.get(osm);
-            osm.isMappaintArea = styles.isArea(osm);
+            if(osm instanceof Way)
+                ((Way)osm).isMappaintArea = styles.isArea(osm);
         }
         return osm.mappaintStyle;
     }
 
-    public boolean isPrimitiveArea(OsmPrimitive osm) {
+    public boolean isPrimitiveArea(Way osm) {
         if(!useStyleCache)
-            return styles.isArea((Way)osm);
+            return styles.isArea(osm);
 
         if(osm.mappaintStyle == null && styles != null) {
             osm.mappaintStyle = styles.get(osm);
-            osm.isMappaintArea = styles.isArea(osm);
+            if(osm instanceof Way)
+                osm.isMappaintArea = styles.isArea(osm);
         }
         return osm.isMappaintArea;
@@ -123,5 +129,5 @@
             return;
 
-        if (nodeStyle != null && isZoomOk(nodeStyle))
+        if (nodeStyle != null && isZoomOk(nodeStyle) && showIcons > dist)
             drawNode(n, nodeStyle.icon, nodeStyle.annotate, n.selected);
         else if (n.selected)
@@ -161,5 +167,5 @@
 
         w.mappaintVisibleCode = 0;
-        if(fillAreas)
+        if(fillAreas > dist)
             w.clearErrors();
 
@@ -183,5 +189,5 @@
             if(!profilerOmitDraw)
             {
-                if (fillAreas)
+                if (fillAreas > dist)
                 {
                     profilerVisibleAreas++;
@@ -749,5 +755,5 @@
         int w = icon.getIconWidth(), h=icon.getIconHeight();
         icon.paintIcon ( Main.map.mapView, g, p.x-w/2, p.y-h/2 );
-        if(showName)
+        if(showNames > dist)
         {
             String name = getNodeName(n);
@@ -810,5 +816,5 @@
             Graphics2D g2d = (Graphics2D)g;
             g2d.setColor(inactive ? inactiveColor : currentColor);
-            if (currentStroke == null) {
+            if (currentStroke == null && useStrokes > dist) {
                 if (currentDashed)
                     g2d.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0));
@@ -817,5 +823,6 @@
             }
             g2d.draw(currentPath);
-            g2d.setStroke(new BasicStroke(1));
+            if(useStrokes > dist)
+                g2d.setStroke(new BasicStroke(1));
 
             currentPath = new GeneralPath();
@@ -846,5 +853,5 @@
                 g.drawRect(p.x - radius, p.y - radius, size, size);
 
-            if(showName)
+            if(showNames > dist)
             {
                 String name = getNodeName(n);
@@ -875,7 +882,9 @@
         
         useStyleCache = Main.pref.getBoolean("mappaint.cache",true);
-        fillAreas = Main.pref.getBoolean("mappaint.fillareas", true);
+        fillAreas = Main.pref.getInteger("mappaint.fillareas", 100000);
         fillAlpha = Math.min(255, Math.max(0, Integer.valueOf(Main.pref.getInteger("mappaint.fillalpha", 50))));
-        showName = Main.pref.getBoolean("mappaint.showname", true);
+        showNames = Main.pref.getInteger("mappaint.shownames", 100000);
+        showIcons = Main.pref.getInteger("mappaint.showicons", 100000);
+        useStrokes = Main.pref.getInteger("mappaint.strokes", 100000);
 
         long profilerStart = java.lang.System.currentTimeMillis();
@@ -885,5 +894,5 @@
             System.out.println("Mappaint Profiler (" +
                 (useStyleCache ? "cache=true, " : "cache=false, ") +
-                (fillAreas ? "fillareas=true, " : "fillareas=false, ") +
+                "fillareas " + fillAreas + ", " +
                 "fillalpha=" + fillAlpha + "%)");
 
@@ -908,4 +917,9 @@
         profilerVisibleSegments = 0;
 
+        LatLon ll1 = nc.getLatLon(0,0);
+        LatLon ll2 = nc.getLatLon(100,0);
+        dist = ll1.greatCircleDistance(ll2);
+        System.out.format("Circum   : %4f Dist: %f\n", circum, dist);
+        
         if(profiler)
         {
@@ -914,5 +928,5 @@
         }
 
-        if (fillAreas && styles != null && styles.hasAreas()) {
+        if (fillAreas > dist && styles != null && styles.hasAreas()) {
             Collection<Way> noAreaWays = new LinkedList<Way>();
 
@@ -959,5 +973,5 @@
             /*** WAYS ***/
             profilerN = 0;
-            fillAreas = false;
+            fillAreas = 0;
             for (final OsmPrimitive osm : noAreaWays)
             {
