Index: /trunk/data_nodist/projection/projection-regression-test-data
===================================================================
--- /trunk/data_nodist/projection/projection-regression-test-data	(revision 9557)
+++ /trunk/data_nodist/projection/projection-regression-test-data	(revision 9558)
@@ -6244,5 +6244,5 @@
   ll  49.23525189671949 -54.40128360306443
   en  -4263130.034442673 2917092.5518731494
-  ll2 50156.3548390288 246510.82413196223
+  ll2 50156.3548390288 -89.17586803776794
 EPSG:3060
   ll  -1.1011308836770013 155.39223808455847
@@ -8564,5 +8564,5 @@
   ll  35.30468974675124 -181.75048187801644
   en  67958.20646357589 3917197.8125596363
-  ll2 35.30468974617765 -181.75048187860764
+  ll2 35.30468974617765 178.24951812139236
 EPSG:32602
   ll  -0.35895685791257925 -175.75420623162898
@@ -9124,5 +9124,5 @@
   ll  -36.29211488935783 181.82910716731914
   en  933779.944968744 5972815.905636139
-  ll2 -36.29211488867873 181.82910716792168
+  ll2 -36.29211488867873 -178.17089283207832
 EPSG:32761
   ll  -38.055794555690284 -128.52440162080111
Index: /trunk/src/org/openstreetmap/josm/data/coor/LatLon.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 9557)
+++ /trunk/src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 9558)
@@ -102,4 +102,24 @@
 
     /**
+     * Make sure longitude value is within <code>[-180, 180]</code> range.
+     * @param lon the longitude in degrees
+     * @return lon plus/minus multiples of <code>360</code>, as needed to get
+     * in <code>[-180, 180]</code> range
+     */
+    public static double normalizeLon(double lon) {
+        if (lon >= -180 && lon <= 180)
+            return lon;
+        else {
+            lon = lon % 360.0;
+            if (lon > 180) {
+                return lon - 360;
+            } else if (lon < -180) {
+                return lon + 360;
+            }
+            return lon;
+        }
+    }
+
+    /**
      * Replies true if lat is in the range [-90,90] and lon is in the range [-180,180]
      *
Index: /trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 9557)
+++ /trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 9558)
@@ -71,5 +71,5 @@
     public EastNorth latlon2eastNorth(LatLon ll) {
         ll = datum.fromWGS84(ll);
-        double[] en = proj.project(Math.toRadians(ll.lat()), Math.toRadians(ll.lon() - lon0 - pm));
+        double[] en = proj.project(Math.toRadians(ll.lat()), Math.toRadians(LatLon.normalizeLon(ll.lon() - lon0 - pm)));
         return new EastNorth(ellps.a * k0 * en[0] + x0, ellps.a * k0 * en[1] + y0);
     }
@@ -78,5 +78,5 @@
     public LatLon eastNorth2latlon(EastNorth en) {
         double[] latlon_rad = proj.invproject((en.east() - x0) / ellps.a / k0, (en.north() - y0) / ellps.a / k0);
-        LatLon ll = new LatLon(Math.toDegrees(latlon_rad[0]), Math.toDegrees(latlon_rad[1]) + lon0 + pm);
+        LatLon ll = new LatLon(Math.toDegrees(latlon_rad[0]), LatLon.normalizeLon(Math.toDegrees(latlon_rad[1]) + lon0 + pm));
         return datum.toWGS84(ll);
     }
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java	(revision 9557)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java	(revision 9558)
@@ -137,24 +137,4 @@
     }
 
-    /**
-     * Make sure longitude value is within <code>[-PI, PI]</code> range.
-     * @param lon the longitude in radians
-     * @return lon plus/minus multiples of <code>2*PI</code>, as needed to get
-     * in <code>[-PI, PI]</code> range
-     */
-    public static double normalizeLon(double lon) {
-        if (lon >= -Math.PI && lon <= Math.PI)
-            return lon;
-        else {
-            lon = lon % (2 * Math.PI);
-            if (lon > Math.PI) {
-                return lon - 2 * Math.PI;
-            } else if (lon < -Math.PI) {
-                return lon + 2 * Math.PI;
-            }
-            return lon;
-        }
-    }
-
     // Iteratively solve equation (7-9) from Snyder.
     final double cphi2(final double ts) {
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java	(revision 9557)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java	(revision 9558)
@@ -129,5 +129,4 @@
     @Override
     public double[] project(double y, double x) {
-        x = normalizeLon(x);
         x *= n;
         double rho = c - n * qsfn(Math.sin(y));
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java	(revision 9557)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java	(revision 9558)
@@ -159,5 +159,4 @@
     @Override
     public double[] project(double phi, double lambda) {
-        lambda = normalizeLon(lambda);
         double sinphi = sin(phi);
         double l = (0.5*log((1+sinphi)/(1-sinphi))) - e/2*log((1+e*sinphi)/(1-e*sinphi));
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/ObliqueMercator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/ObliqueMercator.java	(revision 9557)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/ObliqueMercator.java	(revision 9558)
@@ -288,7 +288,7 @@
                 lon2 += 2.0 * Math.PI;
             }
-            centralMeridian = normalizeLon(0.5 * (lon1 + lon2) -
+            centralMeridian = normalizeLonRad(0.5 * (lon1 + lon2) -
                      Math.atan(J * Math.tan(0.5 * B * (lon1 - lon2)) / P) / B);
-            gamma0 = Math.atan(2.0 * Math.sin(B * normalizeLon(lon1 - centralMeridian)) /
+            gamma0 = Math.atan(2.0 * Math.sin(B * normalizeLonRad(lon1 - centralMeridian)) /
                      (Fp - 1.0 / Fp));
             azimuth = Math.asin(D * Math.sin(gamma0));
@@ -359,7 +359,10 @@
     }
 
+    private double normalizeLonRad(double a) {
+        return Math.toRadians(LatLon.normalizeLon(Math.toDegrees(a)));
+    }
+
     @Override
     public double[] project(double y, double x) {
-        x = normalizeLon(x);
         double u, v;
         if (Math.abs(Math.abs(y) - Math.PI/2.0) > EPSILON) {
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java	(revision 9557)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java	(revision 9558)
@@ -126,5 +126,4 @@
     @Override
     public double[] project(double y, double x) {
-        x = normalizeLon(x);
         double sinphi = Math.sin(y);
         double cosphi = Math.cos(y);
