Index: trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 9951)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 9952)
@@ -1386,8 +1386,6 @@
         @Override
         protected Long getNumber(OsmPrimitive osm) {
-            if (!(osm instanceof Way && ((Way) osm).isClosed()))
-                return null;
-            Way way = (Way) osm;
-            return (long) Geometry.closedWayArea(way);
+            final Double area = Geometry.computeArea(osm);
+            return area == null ? null : area.longValue();
         }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 9951)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 9952)
@@ -652,5 +652,5 @@
                 }
                 if (extent != null) {
-                    if (!usePartialFill(pd.getAreaAndPerimeter(), extent, extentThreshold)) {
+                    if (!usePartialFill(pd.getAreaAndPerimeter(null), extent, extentThreshold)) {
                         extent = null;
                     } else if (!pd.isClosed()) {
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 9951)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 9952)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData.Intersection;
+import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Geometry.AreaAndPerimeter;
@@ -375,10 +376,16 @@
         }
 
-        public AreaAndPerimeter getAreaAndPerimeter() {
-            AreaAndPerimeter ap = Geometry.getAreaAndPerimeter(nodes);
+        /**
+         * Calculate area and perimeter length in the given projection.
+         *
+         * @param projection the projection to use for the calculation, {@code null} defaults to {@link Main#getProjection()}
+         * @return area and perimeter
+         */
+        public AreaAndPerimeter getAreaAndPerimeter(Projection projection) {
+            AreaAndPerimeter ap = Geometry.getAreaAndPerimeter(nodes, projection);
             double area = ap.getArea();
             double perimeter = ap.getPerimeter();
             for (PolyData inner : inners) {
-                AreaAndPerimeter apInner = inner.getAreaAndPerimeter();
+                AreaAndPerimeter apInner = inner.getAreaAndPerimeter(projection);
                 area -= apInner.getArea();
                 perimeter += apInner.getPerimeter();
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 9951)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 9952)
@@ -531,15 +531,12 @@
 
         /**
-         * Returns the area of a closed way in square meters or {@code null}.
-         * @param env the environment
-         * @return the area of a closed way in square meters or {@code null}
-         * @see Geometry#closedWayArea(Way)
+         * Returns the area of a closed way or multipolygon in square meters or {@code null}.
+         * @param env the environment
+         * @return the area of a closed way or multipolygon in square meters or {@code null}
+         * @see Geometry#computeArea(OsmPrimitive)
          */
         public static Float areasize(final Environment env) {
-            if (env.osm instanceof Way && ((Way) env.osm).isClosed()) {
-                return (float) Geometry.closedWayArea((Way) env.osm);
-            } else {
-                return null;
-            }
+            final Double area = Geometry.computeArea(env.osm);
+            return area == null ? null : area.floatValue();
         }
 
Index: trunk/src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 9951)
+++ trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 9952)
@@ -27,8 +27,11 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.NodePositionComparator;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.Projections;
@@ -638,4 +641,37 @@
     public static double closedWayArea(Way way) {
         return getAreaAndPerimeter(way.getNodes(), Projections.getProjectionByCode("EPSG:54008")).getArea();
+    }
+
+    /**
+     * Returns area of a multipolygon in square meters.
+     *
+     * @param multipolygon the multipolygon to measure
+     * @return area of the multipolygon.
+     */
+    public static double multipolygonArea(Relation multipolygon) {
+        double area = 0.0;
+        final Multipolygon mp = Main.map == null || Main.map.mapView == null
+                ? new Multipolygon(multipolygon)
+                : MultipolygonCache.getInstance().get(Main.map.mapView, multipolygon);
+        for (Multipolygon.PolyData pd : mp.getCombinedPolygons()) {
+            area += pd.getAreaAndPerimeter(Projections.getProjectionByCode("EPSG:54008")).getArea();
+        }
+        return area;
+    }
+
+    /**
+     * Computes the area of a closed way and multipolygon in square meters, or {@code null} for other primitives
+     *
+     * @param osm the primitive to measure
+     * @return area of the primitive, or {@code null}
+     */
+    public static Double computeArea(OsmPrimitive osm) {
+        if (osm instanceof Way && ((Way) osm).isClosed()) {
+            return closedWayArea((Way) osm);
+        } else if (osm instanceof Relation && ((Relation) osm).isMultipolygon() && !((Relation) osm).hasIncompleteMembers()) {
+            return multipolygonArea((Relation) osm);
+        } else {
+            return null;
+        }
     }
 
