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;
+        }
     }
 
Index: /trunk/test/data/multipolygon.osm
===================================================================
--- /trunk/test/data/multipolygon.osm	(revision 9952)
+++ /trunk/test/data/multipolygon.osm	(revision 9952)
@@ -0,0 +1,68 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='true' generator='JOSM'>
+  <node id='-11' action='modify' visible='true' lat='47.26512462106' lon='11.28482073184' />
+  <node id='-13' action='modify' visible='true' lat='47.25317505515' lon='11.26155436598' />
+  <node id='-15' action='modify' visible='true' lat='47.23274480805' lon='11.30170905918' />
+  <node id='-17' action='modify' visible='true' lat='47.25500424514' lon='11.30287686905' />
+  <node id='-19' action='modify' visible='true' lat='47.25616269946' lon='11.28230544904' />
+  <node id='-21' action='modify' visible='true' lat='47.24927257199' lon='11.27718505192' />
+  <node id='-23' action='modify' visible='true' lat='47.24299140935' lon='11.29856495568' />
+  <node id='-25' action='modify' visible='true' lat='47.2535408982' lon='11.29667849359' />
+  <node id='-27' action='modify' visible='true' lat='47.2523167702' lon='11.2883734975' />
+  <node id='-29' action='modify' visible='true' lat='47.25145444588' lon='11.28405410467' />
+  <node id='-31' action='modify' visible='true' lat='47.24645268793' lon='11.29459850483' />
+  <node id='-33' action='modify' visible='true' lat='47.25171314465' lon='11.29332809517' />
+  <node id='-35' action='modify' visible='true' lat='47.26137032787' lon='11.28545155529' />
+  <node id='-37' action='modify' visible='true' lat='47.25731797438' lon='11.27478011416' />
+  <node id='-39' action='modify' visible='true' lat='47.25671440584' lon='11.28786533364' />
+  <node id='-41' action='modify' visible='true' lat='47.25456741409' lon='11.28579656409' />
+  <node id='-43' action='modify' visible='true' lat='47.2535308723' lon='11.28193380837' />
+  <node id='-45' action='modify' visible='true' lat='47.25267723441' lon='11.28534740645' />
+  <way id='-47' action='modify' visible='true'>
+    <nd ref='-11' />
+    <nd ref='-13' />
+    <nd ref='-15' />
+    <nd ref='-17' />
+    <nd ref='-11' />
+    <tag k='ref' v='1' />
+  </way>
+  <way id='-49' action='modify' visible='true'>
+    <nd ref='-19' />
+    <nd ref='-21' />
+    <nd ref='-23' />
+    <nd ref='-25' />
+    <nd ref='-19' />
+    <tag k='ref' v='1.1' />
+  </way>
+  <way id='-51' action='modify' visible='true'>
+    <nd ref='-27' />
+    <nd ref='-29' />
+    <nd ref='-31' />
+    <nd ref='-33' />
+    <nd ref='-27' />
+    <tag k='ref' v='1.1.1' />
+  </way>
+  <way id='-53' action='modify' visible='true'>
+    <nd ref='-35' />
+    <nd ref='-37' />
+    <nd ref='-39' />
+    <nd ref='-35' />
+    <tag k='ref' v='1.2' />
+  </way>
+  <way id='-55' action='modify' visible='true'>
+    <nd ref='-41' />
+    <nd ref='-43' />
+    <nd ref='-45' />
+    <nd ref='-41' />
+    <tag k='ref' v='1.1.2' />
+  </way>
+  <relation id='-65' action='modify' visible='true'>
+    <member type='way' ref='-51' role='outer' />
+    <member type='way' ref='-55' role='outer' />
+    <member type='way' ref='-47' role='outer' />
+    <member type='way' ref='-53' role='inner' />
+    <member type='way' ref='-49' role='inner' />
+    <tag k='landuse' v='forest' />
+    <tag k='type' v='multipolygon' />
+  </relation>
+</osm>
Index: /trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java	(revision 9951)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/GeometryTest.java	(revision 9952)
@@ -13,4 +13,5 @@
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.io.OsmReader;
@@ -72,4 +73,20 @@
             Way closedWay = (Way) Utils.filter(ds.allPrimitives(), SearchCompiler.compile("landuse=forest")).iterator().next();
             Assert.assertEquals(5760015.7353515625, Geometry.closedWayArea(closedWay), 1e-3);
+            Assert.assertEquals(5760015.7353515625, Geometry.computeArea(closedWay), 1e-3);
+        }
+    }
+
+    /**
+     * Test of {@link Geometry#multipolygonArea(Relation)}} method.
+     *
+     * @throws Exception if an error occurs
+     */
+    @Test
+    public void testMultipolygonArea() throws Exception {
+        try (FileInputStream in = new FileInputStream(TestUtils.getTestDataRoot() + "multipolygon.osm")) {
+            DataSet ds = OsmReader.parseDataSet(in, null);
+            final Relation r = ds.getRelations().iterator().next();
+            Assert.assertEquals(4401735.20703125, Geometry.multipolygonArea(r), 1e-3);
+            Assert.assertEquals(4401735.20703125, Geometry.computeArea(r), 1e-3);
         }
     }
