Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 630)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 631)
@@ -182,17 +182,19 @@
 			}
 			orderNumber++;
-			//  drawSegment(lastN, n, w.selected && !inactive ? selectedColor : wayColor, showDirectionArrow);
-
-			if (area && fillAreas)
-				//Draw segments in a different colour so direction arrows show against the fill
-				drawSeg(lastN, n, w.selected ? selectedColor : untaggedColor, showDirection, width, true);
-			else
-				if (area)
+
+			if (area && fillAreas) {
+                // hack to make direction arrows visible against filled background
+				if (showDirection)
+				    drawSeg(lastN, n, w.selected ? selectedColor : untaggedColor, showDirection, width, true);
+			} else {
+				if (area) {
 					drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, true);
-				else
-					if (realWidth > 0 && useRealWidth && !showDirection){
+				} else {
+					if (realWidth > 0 && useRealWidth && !showDirection) {
 						int tmpWidth = (int) (100 /  (float) (circum / realWidth));
 						if (tmpWidth > width) width = tmpWidth;
 					}
+                }
+            }
 
 			drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, dashed);
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 630)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 631)
@@ -10,6 +10,9 @@
 import java.awt.Graphics;
 import java.awt.GridBagLayout;
+import java.awt.image.BufferedImage;
 import java.awt.Point;
+import java.awt.Transparency;
 import java.awt.event.ActionEvent;
+import java.awt.image.BufferedImage;
 import java.io.File;
 import java.util.Collection;
@@ -172,8 +175,12 @@
 		else
 		{
-			standardMapPainter.setGraphics(g);
-			standardMapPainter.setNavigatableComponent(mv);
-			standardMapPainter.inactive = inactive;
-			standardMapPainter.visitAll(data);
+            // MapPaintVisitor paints calls fillPolygon() with an alpha
+            // channel -- this is slow, speed it up by rendering to a BufferedImage:
+            BufferedImage bim = new BufferedImage(mv.getWidth(), mv.getHeight(), Transparency.OPAQUE);
+            standardMapPainter.setGraphics(bim.createGraphics());
+            standardMapPainter.setNavigatableComponent(mv);
+            standardMapPainter.inactive = inactive;
+            standardMapPainter.visitAll(data);
+            g.drawImage(bim, 0, 0, null);
 		}
 		Main.map.conflictDialog.paintConflicts(g, mv);
