Index: trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 5236)
+++ trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java	(revision 5237)
@@ -2,8 +2,8 @@
 package org.openstreetmap.josm.data.projection;
 
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.datum.Datum;
 import org.openstreetmap.josm.data.projection.proj.Proj;
-import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
Index: trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 5236)
+++ trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 5237)
@@ -21,4 +21,5 @@
 import org.openstreetmap.josm.data.projection.datum.NTV2Datum;
 import org.openstreetmap.josm.data.projection.datum.NTV2GridShiftFileWrapper;
+import org.openstreetmap.josm.data.projection.datum.NullDatum;
 import org.openstreetmap.josm.data.projection.datum.SevenParameterDatum;
 import org.openstreetmap.josm.data.projection.datum.ThreeParameterDatum;
@@ -246,4 +247,9 @@
         String nadgridsId = parameters.get(Param.nadgrids.key);
         if (nadgridsId != null) {
+            if (nadgridsId.startsWith("@")) {
+                nadgridsId = nadgridsId.substring(1);
+            }
+            if (nadgridsId.equals("null"))
+                return new NullDatum(null, ellps);
             NTV2GridShiftFileWrapper nadgrids = Projections.getNTV2Grid(nadgridsId);
             if (nadgrids == null)
@@ -280,4 +286,13 @@
             }
         }
+        boolean isCentric = true;
+        for (int i = 0; i<towgs84Param.size(); i++) {
+            if (towgs84Param.get(i) != 0.0) {
+                isCentric = false;
+                break;
+            }
+        }
+        if (isCentric)
+            return new CentricDatum(null, null, ellps);
         boolean is3Param = true;
         for (int i = 3; i<towgs84Param.size(); i++) {
@@ -287,13 +302,11 @@
             }
         }
-        Datum datum = null;
-        if (is3Param) {
-            datum = new ThreeParameterDatum(null, null, ellps,
+        if (is3Param)
+            return new ThreeParameterDatum(null, null, ellps,
                     towgs84Param.get(0),
                     towgs84Param.get(1),
-                    towgs84Param.get(2)
-            );
-        } else {
-            datum = new SevenParameterDatum(null, null, ellps,
+                    towgs84Param.get(2));
+        else
+            return new SevenParameterDatum(null, null, ellps,
                     towgs84Param.get(0),
                     towgs84Param.get(1),
@@ -302,8 +315,5 @@
                     towgs84Param.get(4),
                     towgs84Param.get(5),
-                    towgs84Param.get(6)
-            );
-        }
-        return datum;
+                    towgs84Param.get(6));
     }
 
Index: trunk/src/org/openstreetmap/josm/data/projection/Projections.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/Projections.java	(revision 5236)
+++ trunk/src/org/openstreetmap/josm/data/projection/Projections.java	(revision 5237)
@@ -123,5 +123,5 @@
             while ((line = r.readLine()) != null) {
                 line = line.trim();
-                if (!line.startsWith("#")) {
+                if (!line.startsWith("#") && !line.isEmpty()) {
                     Matcher m = epsgPattern.matcher(line);
                     if (m.matches()) {
Index: trunk/src/org/openstreetmap/josm/data/projection/datum/GRS80Datum.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/datum/GRS80Datum.java	(revision 5236)
+++ trunk/src/org/openstreetmap/josm/data/projection/datum/GRS80Datum.java	(revision 5237)
@@ -11,20 +11,10 @@
  * is necessary to get from or to the WGS84 datum.
  */
-public class GRS80Datum extends AbstractDatum {
+public class GRS80Datum extends NullDatum {
 
     public final static GRS80Datum INSTANCE = new GRS80Datum();
 
     private GRS80Datum() {
-        super(tr("GRS80"), null, Ellipsoid.GRS80);
-    }
-
-    @Override
-    public LatLon fromWGS84(LatLon ll) {
-        return ll;
-    }
-
-    @Override
-    public LatLon toWGS84(LatLon ll) {
-        return ll;
+        super(tr("GRS80"), Ellipsoid.GRS80);
     }
 }
Index: trunk/src/org/openstreetmap/josm/data/projection/datum/NullDatum.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/datum/NullDatum.java	(revision 5237)
+++ trunk/src/org/openstreetmap/josm/data/projection/datum/NullDatum.java	(revision 5237)
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.projection.datum;
+
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.projection.Ellipsoid;
+
+/**
+ * Null Datum does not convert from / to WGS84 ellipsoid, but simply "casts"
+ * the coordinates.
+ */
+public class NullDatum extends AbstractDatum {
+
+    public NullDatum(String name, Ellipsoid ellps) {
+        super(name, null, ellps);
+    }
+
+    @Override
+    public LatLon toWGS84(LatLon ll) {
+        return ll;
+    }
+
+    @Override
+    public LatLon fromWGS84(LatLon ll) {
+        return ll;
+    }
+
+}
Index: trunk/src/org/openstreetmap/josm/data/projection/datum/WGS84Datum.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/datum/WGS84Datum.java	(revision 5236)
+++ trunk/src/org/openstreetmap/josm/data/projection/datum/WGS84Datum.java	(revision 5237)
@@ -10,20 +10,10 @@
  * WGS84 datum. Transformation from and to WGS84 datum is a no-op.
  */
-public class WGS84Datum extends AbstractDatum {
+public class WGS84Datum extends NullDatum {
 
     public static final WGS84Datum INSTANCE = new WGS84Datum();
 
     private WGS84Datum() {
-        super(tr("WGS84"), "WGS84", Ellipsoid.WGS84);
-    }
-
-    @Override
-    public LatLon fromWGS84(LatLon ll) {
-        return ll;
-    }
-
-    @Override
-    public LatLon toWGS84(LatLon ll) {
-        return ll;
+        super(tr("WGS84"), Ellipsoid.WGS84);
     }
 }
Index: trunk/src/org/openstreetmap/josm/data/projection/proj/Mercator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/proj/Mercator.java	(revision 5236)
+++ trunk/src/org/openstreetmap/josm/data/projection/proj/Mercator.java	(revision 5237)
@@ -20,5 +20,5 @@
     @Override
     public String getProj4Id() {
-        return null; // "merc" is ellipsoidal Mercator projection in PROJ.4
+        return "josm:smerc"; // "merc" is ellipsoidal Mercator projection in PROJ.4
     }
 
