Index: trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 9104)
+++ trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 9105)
@@ -29,4 +29,5 @@
     protected double y0;       /* false northing (in meters) */
     protected double lon0;     /* central meridian */
+    protected double pm;       /* prime meridian */
     protected double k0 = 1.0; /* general scale factor */
 
@@ -66,5 +67,5 @@
     public EastNorth latlon2eastNorth(LatLon ll) {
         ll = datum.fromWGS84(ll);
-        double[] en = proj.project(Math.toRadians(ll.lat()), Math.toRadians(ll.lon() - lon0));
+        double[] en = proj.project(Math.toRadians(ll.lat()), Math.toRadians(ll.lon() - lon0 - pm));
         return new EastNorth(ellps.a * k0 * en[0] + x0, ellps.a * k0 * en[1] + y0);
     }
@@ -73,5 +74,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);
+        LatLon ll = new LatLon(Math.toDegrees(latlon_rad[0]), Math.toDegrees(latlon_rad[1]) + lon0 + pm);
         return datum.toWGS84(ll);
     }
Index: trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9104)
+++ trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9105)
@@ -38,4 +38,5 @@
     private static final double METER_PER_UNIT_DEGREE = 2 * Math.PI * 6370997 / 360;
     private static final Map<String, Double> UNITS_TO_METERS = getUnitsToMeters();
+    private static final Map<String, Double> PRIME_MERIDANS = getPrimeMeridians();
 
     /**
@@ -64,4 +65,6 @@
         /** Central meridian */
         lon_0("lon_0", true),
+        /** Prime meridian */
+        pm("pm", true),
         /** Scaling factor */
         k_0("k_0", true),
@@ -222,4 +225,12 @@
                 this.lon0 = parseAngle(s, Param.lon_0.key);
             }
+            s = parameters.get(Param.pm.key);
+            if (s != null) {
+                if (PRIME_MERIDANS.containsKey(s)) {
+                    this.pm = PRIME_MERIDANS.get(s);
+                } else {
+                    this.pm = parseAngle(s, Param.pm.key);
+                }
+            }
             s = parameters.get(Param.k_0.key);
             if (s != null) {
@@ -626,3 +637,25 @@
         return ret;
     }
+
+    private static Map<String, Double> getPrimeMeridians() {
+        Map<String, Double> ret = new ConcurrentHashMap<>();
+        try {
+            ret.put("greenwich", 0.0);
+            ret.put("lisbon", parseAngle("9d07'54.862\"W", null));
+            ret.put("paris", parseAngle("2d20'14.025\"E", null));
+            ret.put("bogota", parseAngle("74d04'51.3\"W", null));
+            ret.put("madrid", parseAngle("3d41'16.58\"W", null));
+            ret.put("rome", parseAngle("12d27'8.4\"E", null));
+            ret.put("bern", parseAngle("7d26'22.5\"E", null));
+            ret.put("jakarta", parseAngle("106d48'27.79\"E", null));
+            ret.put("ferro", parseAngle("17d40'W", null));
+            ret.put("brussels", parseAngle("4d22'4.71\"E", null));
+            ret.put("stockholm", parseAngle("18d3'29.8\"E", null));
+            ret.put("athens", parseAngle("23d42'58.815\"E", null));
+            ret.put("oslo", parseAngle("10d43'22.5\"E", null));
+        } catch (ProjectionConfigurationException ex) {
+            throw new RuntimeException();
+        }
+        return ret;
+    }
 }
