Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 33245)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/OdConstants.java	(revision 33356)
@@ -124,3 +124,4 @@
     public static final String RESOURCE_PATH = "/resources/org/openstreetmap/josm/plugins/opendata/core/resources/";
     public static final String DICTIONARY_FR = RESOURCE_PATH+"dictionary.fr.csv";
+    public static final String ESRI_WKID = RESOURCE_PATH+"wkid.json";
 }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 33245)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 33356)
@@ -6,5 +6,7 @@
 import java.awt.Component;
 import java.awt.GraphicsEnvironment;
+import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -13,5 +15,10 @@
 import java.util.List;
 import java.util.Map;
-
+import java.util.TreeMap;
+
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+import javax.json.spi.JsonProvider;
 import javax.swing.Icon;
 import javax.swing.JOptionPane;
@@ -19,6 +26,8 @@
 import org.geotools.factory.Hints;
 import org.geotools.geometry.jts.JTS;
+import org.geotools.metadata.iso.citation.Citations;
 import org.geotools.referencing.AbstractIdentifiedObject;
 import org.geotools.referencing.CRS;
+import org.geotools.referencing.NamedIdentifier;
 import org.geotools.referencing.crs.AbstractCRS;
 import org.geotools.referencing.crs.AbstractDerivedCRS;
@@ -54,4 +63,5 @@
 import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
 import org.openstreetmap.josm.tools.UserCancelException;
+import org.openstreetmap.josm.tools.Utils;
 
 import com.vividsolutions.jts.geom.LineString;
@@ -78,4 +88,6 @@
     protected CoordinateReferenceSystem crs;
     protected MathTransform transform;
+
+    private static final Map<String, Integer> esriWkid = new TreeMap<>();
 
     public GeographicReader(GeographicHandler handler, GeographicHandler[] defaultHandlers) {
@@ -287,7 +299,54 @@
     }
 
+    private static void loadEsriWkid() throws IOException {
+        Main.info("Loading ESRI WKID database...");
+        try (InputStream in = GeographicReader.class.getResourceAsStream(OdConstants.ESRI_WKID);
+            JsonReader json = JsonProvider.provider().createReader(in)) {
+            JsonObject root = json.readObject();
+            JsonArray wkids = root.getJsonArray("wkids");
+            JsonArray labels = root.getJsonArray("labels");
+            if (wkids.size() != labels.size()) {
+                throw new IllegalStateException();
+            }
+            for (int i = 0; i < wkids.size(); i++) {
+                esriWkid.put(labels.getString(i), wkids.getInt(i));
+            }
+        }
+        Main.info("ESRI WKID database loaded");
+    }
+
+    private static Integer getEpsgCodeFromEsriWkid(String wkid) {
+        if (esriWkid.isEmpty()) {
+            try {
+                loadEsriWkid();
+            } catch (IOException e) {
+                Main.error(e);
+            }
+        }
+        return esriWkid.get(wkid);
+    }
+
     protected void findMathTransform(Component parent, boolean findSimiliarCrs)
             throws FactoryException, UserCancelException, GeoMathTransformException {
         try {
+            // Geotools relies on Authority identifiers to find suitable transformations
+            // but this information is optional in WKT and not defined in ESRI WKID database, so often missing in real-world files
+            if (crs instanceof AbstractIdentifiedObject && crs.getIdentifiers().isEmpty()) {
+                // If no identifier, attempt to find one in embedded ESRI database
+                String wkid = crs.getName().getCode();
+                if (wkid != null) {
+                    Integer epsgCode = getEpsgCodeFromEsriWkid(wkid);
+                    if (epsgCode != null) {
+                        try {
+                            Field f = AbstractIdentifiedObject.class.getDeclaredField("identifiers");
+                            Utils.setObjectsAccessible(f);
+                            f.set(crs, Collections.singleton(new NamedIdentifier(Citations.fromName("EPSG"), epsgCode.toString())));
+                        } catch (ReflectiveOperationException | SecurityException e) {
+                            Main.error(e);
+                        }
+                    }
+                }
+            }
+            // Find math transformation
             transform = CRS.findMathTransform(crs, wgs84);
         } catch (OperationNotFoundException e) {
