Index: trunk/src/org/openstreetmap/josm/tools/DefaultGeoProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/DefaultGeoProperty.java	(revision 11264)
+++ trunk/src/org/openstreetmap/josm/tools/DefaultGeoProperty.java	(revision 11264)
@@ -0,0 +1,53 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import java.awt.geom.Area;
+import java.util.Collection;
+
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.BBox;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * Implementation of simple boolean {@link GeoProperty}.
+ */
+public class DefaultGeoProperty implements GeoProperty<Boolean> {
+
+    private Area area;
+
+    /**
+     * Create DefaultGeoProperty based on a collection of closed ways.
+     *
+     * @param ways the ways forming the area
+     */
+    public DefaultGeoProperty(Collection<Way> ways) {
+        for (Way w : ways) {
+            Area tmp = Geometry.getAreaLatLon(w.getNodes());
+            if (area == null) {
+                area = tmp;
+            } else {
+                area.add(tmp);
+            }
+        }
+    }
+
+    @Override
+    public Boolean get(LatLon ll) {
+        return area.contains(ll.lon(), ll.lat());
+    }
+
+    @Override
+    public Boolean get(BBox box) {
+        Area abox = new Area(box.toRectangle());
+        Geometry.PolygonIntersection is = Geometry.polygonIntersection(abox, area, 1e-10 /* using deg and not meters */ );
+        switch (is) {
+            case FIRST_INSIDE_SECOND:
+                return Boolean.TRUE;
+            case OUTSIDE:
+                return Boolean.FALSE;
+            default:
+                return null;
+        }
+    }
+
+}
Index: trunk/src/org/openstreetmap/josm/tools/GeoProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/GeoProperty.java	(revision 11264)
+++ trunk/src/org/openstreetmap/josm/tools/GeoProperty.java	(revision 11264)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.BBox;
+
+/**
+ * A method to look up a property of the earth surface.
+ * 
+ * User input for the {@link GeoPropertyIndex}.
+ * @param <T> the property
+ */
+public interface GeoProperty<T> {
+
+    /**
+     * Look up the property for a point.
+     * @param ll the point coordinates
+     * @return property value at that point. Must not be null.
+     */
+    T get(LatLon ll);
+
+    /**
+     * Look up the property for a coordinate rectangle.
+     * @param box the rectangle
+     * @return the property, if it is the same in the entire rectangle;
+     * null otherwise
+     */
+    T get(BBox box);
+
+}
Index: trunk/src/org/openstreetmap/josm/tools/GeoPropertyIndex.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/GeoPropertyIndex.java	(revision 11259)
+++ trunk/src/org/openstreetmap/josm/tools/GeoPropertyIndex.java	(revision 11264)
@@ -19,26 +19,4 @@
  */
 public class GeoPropertyIndex<T> {
-
-    /**
-     * A method to look up a property of the earth surface.
-     * (User input for the index.)
-     * @param <T> the property
-     */
-    public interface GeoProperty<T> {
-        /**
-         * Look up the property for a point.
-         * @param ll the point coordinates
-         * @return property value at that point. Must not be null.
-         */
-        T get(LatLon ll);
-
-        /**
-         * Look up the property for a coordinate rectangle.
-         * @param box the rectangle
-         * @return the property, if it is the same in the entire rectangle;
-         * null otherwise
-         */
-        T get(BBox box);
-    }
 
     private final int maxLevel;
Index: trunk/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java	(revision 11259)
+++ trunk/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java	(revision 11264)
@@ -2,5 +2,4 @@
 package org.openstreetmap.josm.tools;
 
-import java.awt.geom.Area;
 import java.io.File;
 import java.io.FileInputStream;
@@ -24,5 +23,4 @@
 import org.openstreetmap.josm.actions.PurgeAction;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -34,6 +32,4 @@
 import org.openstreetmap.josm.io.OsmWriter;
 import org.openstreetmap.josm.io.OsmWriterFactory;
-import org.openstreetmap.josm.tools.GeoPropertyIndex.GeoProperty;
-import org.openstreetmap.josm.tools.Geometry.PolygonIntersection;
 
 /**
@@ -46,31 +42,5 @@
     private static final String RIGHT = "right";
 
-    private static class RLTrafficGeoProperty implements GeoProperty<Boolean> {
-
-        @Override
-        public Boolean get(LatLon ll) {
-            for (Area a : leftHandTrafficPolygons) {
-                if (a.contains(ll.lon(), ll.lat()))
-                    return Boolean.TRUE;
-            }
-            return Boolean.FALSE;
-        }
-
-        @Override
-        public Boolean get(BBox box) {
-            Area abox = new Area(box.toRectangle());
-            for (Area a : leftHandTrafficPolygons) {
-                PolygonIntersection is = Geometry.polygonIntersection(abox, a, 1e-10 /* using deg and not meters */);
-                if (is == PolygonIntersection.FIRST_INSIDE_SECOND)
-                    return Boolean.TRUE;
-                if (is != PolygonIntersection.OUTSIDE)
-                    return null;
-            }
-            return Boolean.FALSE;
-        }
-    }
-
-    static volatile Collection<Area> leftHandTrafficPolygons;
-    static volatile GeoPropertyIndex<Boolean> rlCache;
+    private static volatile GeoPropertyIndex<Boolean> rlCache;
 
     private RightAndLefthandTraffic() {
@@ -93,5 +63,4 @@
      */
     public static synchronized void initialize() {
-        leftHandTrafficPolygons = new ArrayList<>();
         Collection<Way> optimizedWays = loadOptimizedBoundaries();
         if (optimizedWays.isEmpty()) {
@@ -99,8 +68,5 @@
             saveOptimizedBoundaries(optimizedWays);
         }
-        for (Way w : optimizedWays) {
-            leftHandTrafficPolygons.add(Geometry.getAreaLatLon(w.getNodes()));
-        }
-        rlCache = new GeoPropertyIndex<>(new RLTrafficGeoProperty(), 24);
+        rlCache = new GeoPropertyIndex<>(new DefaultGeoProperty(optimizedWays), 24);
     }
 
