Index: src/uk/me/parabola/mkgmap/osmstyle/function/AreaSizeFunction.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/function/AreaSizeFunction.java	(revision 4168)
+++ src/uk/me/parabola/mkgmap/osmstyle/function/AreaSizeFunction.java	(working copy)
@@ -1,7 +1,5 @@
 package uk.me.parabola.mkgmap.osmstyle.function;
 
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
 import java.util.Locale;
 
 import uk.me.parabola.imgfmt.app.Coord;
@@ -24,7 +22,6 @@
  */
 public class AreaSizeFunction extends CachedFunction {
 
-	private final DecimalFormat nf = new DecimalFormat("0.0#####################", DecimalFormatSymbols.getInstance(Locale.US));
 	private final boolean orderByDecreasingArea = true;
 
 	public AreaSizeFunction() {
@@ -48,7 +45,7 @@
 				areaSize = Math.abs(areaSize);
 			} else
 				areaSize = MultiPolygonRelation.calcAreaSize(w.getPoints());
-			return nf.format(areaSize);
+			return String.format(Locale.US, "%.3f", areaSize);
 		}
 		return null;
 	}
Index: src/uk/me/parabola/mkgmap/reader/osm/MultiPolygonRelation.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/MultiPolygonRelation.java	(revision 4168)
+++ src/uk/me/parabola/mkgmap/reader/osm/MultiPolygonRelation.java	(working copy)
@@ -17,8 +17,6 @@
 import java.awt.Rectangle;
 import java.awt.geom.Area;
 import java.awt.geom.Line2D;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Collection;
@@ -1100,9 +1098,8 @@
 		}
 		String mpAreaSizeStr = null;
 		if (isAreaSizeCalculated()) {
-			// assign the area size of the whole multipolygon to all outer polygons
-			mpAreaSizeStr = new DecimalFormat("0.0####################", 
-					DecimalFormatSymbols.getInstance(Locale.US)).format(mpAreaSize);
+			// calculate tag value for mkgmap:cache_area_size only once
+			mpAreaSizeStr = String.format(Locale.US, "%.3f", mpAreaSize);
 		}
 		// Go through all original outer ways, create a copy, tag them
 		// with the mp tags and mark them only to be used for polyline processing
@@ -1144,8 +1141,8 @@
 		
 		if (isAreaSizeCalculated()) {
 			// assign the area size of the whole multipolygon to all outer polygons
-			String mpAreaSizeStr = new DecimalFormat("0.0####################", 
-					DecimalFormatSymbols.getInstance(Locale.US)).format(mpAreaSize);
+			String mpAreaSizeStr = String.format(Locale.US, "%.3f", mpAreaSize); 
+			addTag("mkgmap:cache_area_size", mpAreaSizeStr);
 			for (Way w : mpPolygons.values()) {
 				if ("outer".equals(w.getTag("mkgmap:mp_role"))) {
 					w.addTag("mkgmap:cache_area_size", mpAreaSizeStr);
Index: src/uk/me/parabola/mkgmap/reader/osm/POIGeneratorHook.java
===================================================================
--- src/uk/me/parabola/mkgmap/reader/osm/POIGeneratorHook.java	(revision 4168)
+++ src/uk/me/parabola/mkgmap/reader/osm/POIGeneratorHook.java	(working copy)
@@ -26,6 +26,7 @@
 import uk.me.parabola.imgfmt.app.Coord;
 import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.osmstyle.NameFinder;
+import uk.me.parabola.mkgmap.osmstyle.function.AreaSizeFunction;
 import uk.me.parabola.util.EnhancedProperties;
 
 /**
@@ -69,6 +70,7 @@
 	private boolean poisToAreas = false;
 	private boolean poisToLines = false;
 	private NameFinder nameFinder;
+	private AreaSizeFunction areaSizeFunction = new AreaSizeFunction();
 	
 	/** Name of the bool tag that is set to true if a POI is created from an area */
 	public static final short AREA2POI_TAG = TagDict.getInstance().xlate("mkgmap:area2poi");
@@ -158,8 +160,8 @@
 	
 	public void end() {
 		log.info(getClass().getSimpleName(), "started");
-		addPOIsToWays();
-		addPOIsToMPs();
+		addPOIsForWays();
+		addPOIsForMPs();
 		log.info(getClass().getSimpleName(), "finished");
 	}
 	
@@ -177,7 +179,7 @@
 		return -1;
 	}
 	
-	private void addPOIsToWays() {
+	private void addPOIsForWays() {
 		Map<Coord, Integer> labelCoords = new IdentityHashMap<Coord, Integer>(); 
 		
 		// save all coords with one of the placement tags to a map
@@ -235,7 +237,7 @@
 		if (poisToAreas == false) {
 			return;
 		}
-
+		
 		// get the coord where the poi is placed
 		Coord poiCoord = null;
 		// do we have some labeling coords?
@@ -262,7 +264,8 @@
 			// use the common center point of the area
 			poiCoord = polygon.getCofG();
 		}
-		
+		// add tag mkgmap:cache_area_size to the original polygon so that it is copied to the POI
+		areaSizeFunction.value(polygon);
 		Node poi = createPOI(polygon, poiCoord, AREA2POI_TAG); 
 		saver.addNode(poi);
 	}
@@ -340,7 +343,7 @@
 		
 	}
 
-	private void addPOIsToMPs() {
+	private void addPOIsForMPs() {
 		int mps2POI = 0;
 		for (Relation r : saver.getRelations().values()) {
 			
