Index: /trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9124)
@@ -588,7 +588,14 @@
     public Bounds getWorldBoundsLatLon() {
         if (bounds != null) return bounds;
-        return new Bounds(
-            new LatLon(-90.0, -180.0),
-            new LatLon(90.0, 180.0));
+        Bounds ab = proj.getAlgorithmBounds();
+        if (ab != null) {
+            double minlon = Math.max(ab.getMinLon() + lon0 + pm, -180);
+            double maxlon = Math.min(ab.getMaxLon() + lon0 + pm, 180);
+            return new Bounds(ab.getMinLat(), minlon, ab.getMaxLat(), maxlon, false);
+        } else {
+            return new Bounds(
+                new LatLon(-90.0, -180.0),
+                new LatLon(90.0, 180.0));
+        }
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/DoubleStereographic.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/DoubleStereographic.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/DoubleStereographic.java	(revision 9124)
@@ -16,4 +16,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
@@ -28,5 +29,4 @@
  * Sec. 1.3.7.1 Oblique and Equatorial Stereographic, http://www.epsg.org/GuidanceNotes
  */
-
 public class DoubleStereographic implements Proj {
 
@@ -109,3 +109,8 @@
         return new double[] {phi, lambda};
     }
+
+    @Override
+    public Bounds getAlgorithmBounds() {
+        return new Bounds(-89, -87, 89, 87, false);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java	(revision 9124)
@@ -15,4 +15,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.CustomProjection.Param;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
@@ -177,3 +178,17 @@
         return params;
     }
+
+    @Override
+    public Bounds getAlgorithmBounds() {
+        double lat;
+        if (params instanceof Parameters2SP) {
+            Parameters2SP p2p = (Parameters2SP) params;
+            lat = (p2p.standardParallel1 + p2p.standardParallel2) / 2;
+        } else {
+            lat = params.latitudeOrigin;
+        }
+        double minlat = Math.max(lat - 60, -89);
+        double maxlat = Math.min(lat + 60, 89);
+        return new Bounds(minlat, -85, maxlat, 85, false);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/LonLat.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/LonLat.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/LonLat.java	(revision 9124)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
 
@@ -37,3 +38,8 @@
         return new double[] {Math.toRadians(north * a), Math.toRadians(east * a)};
     }
+
+    @Override
+    public Bounds getAlgorithmBounds() {
+        return new Bounds(-90, -180, 90, 180, false);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/Mercator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/Mercator.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/Mercator.java	(revision 9124)
@@ -9,4 +9,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
 
@@ -39,3 +40,8 @@
         return new double[] {atan(sinh(north)), east};
     }
+
+    @Override
+    public Bounds getAlgorithmBounds() {
+        return new Bounds(-89, -180, 89, 180, false);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/Proj.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/Proj.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/Proj.java	(revision 9124)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.data.projection.proj;
 
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
 
@@ -64,3 +65,20 @@
      */
     double[] invproject(double east, double north);
+
+    /**
+     * Return the bounds where this projection is applicable.
+     * 
+     * This is a fallback for when the projection bounds are not specified
+     * explicitly.
+     * 
+     * In this area, the round trip lat/lon -> east/north -> lat/lon should
+     * return the starting value with small error. In addition, regions with
+     * extreme distortions should be excluded, if possible.
+     * 
+     * It need not be the absolute maximum, but rather an area that is safe to
+     * display in JOSM and contain everything that one would expect to use.
+     * 
+     * @return the bounds where this projection is applicable, null if unknown
+     */
+    Bounds getAlgorithmBounds();
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/SwissObliqueMercator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/SwissObliqueMercator.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/SwissObliqueMercator.java	(revision 9124)
@@ -17,4 +17,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
@@ -75,5 +76,4 @@
     @Override
     public double[] project(double phi, double lambda) {
-
         double S = alpha * log(tan(PI / 4 + phi / 2)) - alpha * ellps.e / 2
             * log((1 + ellps.e * sin(phi)) / (1 - ellps.e * sin(phi))) + k;
@@ -115,3 +115,8 @@
         return new double[] {phi, lambda};
     }
+
+    @Override
+    public Bounds getAlgorithmBounds() {
+        return new Bounds(-85, -179, 85, 179, false);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java	(revision 9123)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java	(revision 9124)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
 
@@ -181,3 +182,8 @@
         return new double[] {y, x};
     }
+
+    @Override
+    public Bounds getAlgorithmBounds() {
+        return new Bounds(-90, -10, 90, 10, false);
+    }
 }
