Index: trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 9788)
+++ trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 9790)
@@ -28,9 +28,10 @@
     protected Datum datum;
     protected Proj proj;
-    protected double x0;       /* false easting (in meters) */
-    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 */
+    protected double x0;            /* false easting (in meters) */
+    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 */
+    protected double toMeter = 1.0; /* switch from meters to east/north coordinate units */
 
     private volatile ProjectionBounds projectionBoundsBox;
@@ -68,14 +69,32 @@
     }
 
+    /**
+     * Get the factor that converts meters to intended units of east/north coordinates.
+     *
+     * For projected coordinate systems, the semi-major axis of the ellipsoid is
+     * always given in meters, which means the preliminary projection result will
+     * be in meters as well. This factor is used to convert to the intended units
+     * of east/north coordinates (e.g. feet in the US).
+     * 
+     * For geographic coordinate systems, the preliminary "projection" result will
+     * be in degrees, so there is no reason to convert anything and this factor
+     * will by 1 by default.
+     *
+     * @return factor that converts meters to intended units of east/north coordinates
+     */
+    public final double getToMeter() {
+        return toMeter;
+    }
+
     @Override
     public EastNorth latlon2eastNorth(LatLon ll) {
         ll = datum.fromWGS84(ll);
         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);
+        return new EastNorth((ellps.a * k0 * en[0] + x0) / toMeter, (ellps.a * k0 * en[1] + y0) / toMeter);
     }
 
     @Override
     public LatLon eastNorth2latlon(EastNorth en) {
-        double[] latlon_rad = proj.invproject((en.east() - x0) / ellps.a / k0, (en.north() - y0) / ellps.a / k0);
+        double[] latlon_rad = proj.invproject((en.east() * toMeter - x0) / ellps.a / k0, (en.north() * toMeter - y0) / ellps.a / k0);
         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/CustomProjection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9788)
+++ trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 9790)
@@ -61,6 +61,5 @@
     protected String cacheDir;
     protected Bounds bounds;
-    private double metersPerUnit;
-    private double metersPerUnitNoDegrees;
+    private double metersPerUnitWMTS;
     private String axis = "enu"; // default axis orientation is East, North, Up
 
@@ -298,20 +297,20 @@
                 s = Utils.strip(s, "\"");
                 if (UNITS_TO_METERS.containsKey(s)) {
-                    this.metersPerUnit = UNITS_TO_METERS.get(s);
-                    this.metersPerUnitNoDegrees = this.metersPerUnit;
+                    this.toMeter = UNITS_TO_METERS.get(s);
+                    this.metersPerUnitWMTS = this.toMeter;
                     defaultUnits = false;
                 } else {
-                    Main.warn("No metersPerUnit found for: " + s);
+                    throw new ProjectionConfigurationException(tr("No unit found for: {0}", s));
                 }
             }
             s = parameters.get(Param.to_meter.key);
             if (s != null) {
-                this.metersPerUnit = parseDouble(s, Param.to_meter.key);
-                this.metersPerUnitNoDegrees = this.metersPerUnit;
+                this.toMeter = parseDouble(s, Param.to_meter.key);
+                this.metersPerUnitWMTS = this.toMeter;
                 defaultUnits = false;
             }
             if (defaultUnits) {
-                this.metersPerUnit = proj.isGeographic() ? METER_PER_UNIT_DEGREE : 1;
-                this.metersPerUnitNoDegrees = 1;
+                this.toMeter = 1;
+                this.metersPerUnitWMTS = proj.isGeographic() ? METER_PER_UNIT_DEGREE : 1;
             }
             s = parameters.get(Param.axis.key);
@@ -712,17 +711,16 @@
     }
 
+    /**
+     * Factor to convert units of east/north coordinates to meters.
+     * 
+     * When east/north coordinates are in degrees (geographic CRS), the scale
+     * at the equator is taken, i.e. 360 degrees corresponds to the length of
+     * the equator in meters.
+     * 
+     * @return factor to convert units to meter
+     */
     @Override
     public double getMetersPerUnit() {
-        return metersPerUnit;
-    }
-
-    /**
-     * Like {@link #getMetersPerUnit()}, but has default value 1 for a
-     * geographic CRS. I.e. by default, degrees are not converted to meters,
-     * but left alone (similar to proj.4 behavior).
-     * @return meters per unit of projection
-     */
-    public double getMetersPerUnitProj() {
-        return metersPerUnitNoDegrees;
+        return metersPerUnitWMTS;
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/MultiMap.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/MultiMap.java	(revision 9788)
+++ trunk/src/org/openstreetmap/josm/tools/MultiMap.java	(revision 9790)
@@ -255,5 +255,4 @@
 
     @Override
-
     public String toString() {
         List<String> entries = new ArrayList<>(map.size());
