Index: src/org/openstreetmap/josm/data/osm/MultipolygonCreate.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/MultipolygonCreate.java	(revision 6837)
+++ src/org/openstreetmap/josm/data/osm/MultipolygonCreate.java	(working copy)
@@ -3,6 +3,7 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.geom.Area;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -25,11 +26,13 @@
         public final List<Way> ways;
         public final List<Boolean> reversed;
         public final List<Node> nodes;
+        public final Area area;
 
         public JoinedPolygon(List<Way> ways, List<Boolean> reversed) {
             this.ways = ways;
             this.reversed = reversed;
             this.nodes = this.getNodes();
+            this.area = Geometry.getArea(nodes);
         }
 
         /**
@@ -37,12 +40,9 @@
          * @param way the way to form the polygon
          */
         public JoinedPolygon(Way way) {
-            this.ways = Collections.singletonList(way);
-            this.reversed = Collections.singletonList(Boolean.FALSE);
-            this.nodes = this.getNodes();
+            this(Collections.singletonList(way), Collections.singletonList(Boolean.FALSE));
         }
 
-
         /**
          * Builds a list of nodes for this polygon. First node is not duplicated as last node.
          * @return list of nodes
@@ -232,7 +232,12 @@
                     continue;
                 }
 
-                PolygonIntersection intersection = Geometry.polygonIntersection(outerWay.nodes, innerWay.nodes);
+                //long start = System.currentTimeMillis();
+                PolygonIntersection intersection = Geometry.polygonIntersection(outerWay.area, innerWay.area);
+                //long time = System.currentTimeMillis() - start;
+                //if (time > 2) {
+                    //System.err.println(time + " ms for comparing "+outerWay+" and "+innerWay);
+                //}
 
                 if (intersection == PolygonIntersection.FIRST_INSIDE_SECOND) {
                     outerGood = false;  // outer is inside another polygon
Index: src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- src/org/openstreetmap/josm/tools/Geometry.java	(revision 6837)
+++ src/org/openstreetmap/josm/tools/Geometry.java	(working copy)
@@ -440,7 +440,12 @@
         return dy1 * dx2 - dx1 * dy2 > 0;
     }
 
-    private static Area getArea(List<Node> polygon) {
+    /**
+     * Returns the Area of a polygon, from its list of nodes.
+     * @param polygon List of nodes forming polygon
+     * @return Area for the given list of nodes
+     */
+    public static Area getArea(List<Node> polygon) {
         Path2D path = new Path2D.Double();
 
         boolean begin = true;
@@ -461,19 +466,38 @@
 
     /**
      * Tests if two polygons intersect.
-     * @param first
-     * @param second
+     * @param first List of nodes forming first polygon
+     * @param second List of nodes forming second polygon
      * @return intersection kind
      */
     public static PolygonIntersection polygonIntersection(List<Node> first, List<Node> second) {
-
+        //long start = System.currentTimeMillis();
         Area a1 = getArea(first);
         Area a2 = getArea(second);
+        /*long time = System.currentTimeMillis() - start;
+        if (time > 2) {
+            System.err.println(time + " ms for computing areas");
+        }*/
+        return polygonIntersection(a1, a2);
+    }
 
+    /**
+     * Tests if two polygons intersect.
+     * @param a1 Area of first polygon
+     * @param a2 Area of second polygon
+     * @return intersection kind
+     */
+    public static PolygonIntersection polygonIntersection(Area a1, Area a2) {
+
+        //long start = System.currentTimeMillis();
         Area inter = new Area(a1);
         inter.intersect(a2);
 
         Rectangle bounds = inter.getBounds();
+        /*long time = System.currentTimeMillis() - start;
+        if (time > 2) {
+            System.err.println(time + " ms for computing intersection");
+        }*/
 
         if (inter.isEmpty() || bounds.getHeight()*bounds.getWidth() <= 1.0) {
             return PolygonIntersection.OUTSIDE;
