Index: GtCRSCatalogManager.java
===================================================================
--- GtCRSCatalogManager.java	(revision 866)
+++ GtCRSCatalogManager.java	(revision 867)
@@ -36,7 +36,7 @@
 import org.gvsig.geotools.proj.catalog.extent.DefaultExtent;
 import org.gvsig.geotools.proj.catalog.extent.DefaultGeographicBoundingBox;
 import org.gvsig.geotools.proj.catalog.extent.DefaultVerticalExtent;
-import org.gvsig.geotools.proj.catalog.utils.IdentifiedObjectUtils;
+import org.gvsig.geotools.proj.catalog.utils.GtUtils;
 import org.gvsig.geotools.proj.catalog.utils.WKTUtils;
 import org.gvsig.proj.catalog.CRSCatalogManager;
 import org.gvsig.proj.catalog.CRSDefinition;
@@ -340,7 +340,7 @@
 		try {
 			crs = CRS.parseWKT(def);
 			if (CRS.getAxisOrder(crs)==AxisOrder.NORTH_EAST) {
-				String id = IdentifiedObjectUtils.getIdentifier(crs);
+				String id = GtUtils.getIdentifier(crs);
 				if (id != null && id.startsWith("EPSG:")) { //FIXME: could this also work for other authorities such as ESRI?
 					internalCrs = CRS.decode(id, true);
 				}
@@ -492,9 +492,35 @@
 	        CoordinateOperationFactory operationFactory = CRS.getCoordinateOperationFactory(false);
 	        Set<CoordinateOperation> ops = operationFactory.findOperations(sourceCRS, targetCRS);
 	        for (CoordinateOperation op: ops) {
+	        	if (GtUtils.getIdentifier(op) == null) {
+	        		CoordinateOperation defOp = GtUtils.getDefiningOperation(op);
+		        	if (GtUtils.getIdentifier(defOp) == null) {
+		        		/**
+		        		 * When Geotools computes the inverse transformation, we loose the identifier, which
+		        		 * makes the transformation quite useless for the final users since they can't distinguish
+		        		 * it from any other operation. Therefore, we skip operations lacking an identifier, and
+		        		 * we'll add them later requesting the inverse operation. It is quite hacky but I can't see
+		        		 * a better approach
+		        		 */
+		        		continue;
+		        	}
+	        	}
 	        	DefaultTransformationDefinition def = new DefaultTransformationDefinition(op, sourceDef, targetDef);
 	        	transforms.add(def);
 	        }
+	        
+	        // now we'll try the inverse transformation
+	        ops = operationFactory.findOperations(targetCRS, sourceCRS);
+	        for (CoordinateOperation op: ops) {
+	        	if (GtUtils.getIdentifier(op) == null) {
+	        		CoordinateOperation defOp = GtUtils.getDefiningOperation(op);
+		        	if (GtUtils.getIdentifier(defOp) == null) {
+		        		continue;
+		        	}
+	        	}
+	        	DefaultTransformationDefinition def = new DefaultTransformationDefinition(op, sourceDef, targetDef);
+	        	transforms.add(def);
+	        }
 		} catch (FactoryException e) {
 			// FIXME: we should log instead of raising an exception
 			throw new UnsupportedTransformationException(e);
@@ -504,23 +530,14 @@
 
 	@Override
 	public List<TransformationDefinition> getCoordinateTransformations(String source, String target) throws UnsupportedTransformationException {
-		ArrayList<TransformationDefinition> transforms = new ArrayList<TransformationDefinition>();
 		try {
 			DefaultCRSDefinition sourceDef = getCRSDefinition(source);
 			DefaultCRSDefinition targetDef = getCRSDefinition(target);
-			CoordinateReferenceSystem sourceCRS = sourceDef.getInternalCRS();
-			CoordinateReferenceSystem targetCRS = targetDef.getInternalCRS();
-	        CoordinateOperationFactory operationFactory = CRS.getCoordinateOperationFactory(false);
-	        Set<CoordinateOperation> ops = operationFactory.findOperations(sourceCRS, targetCRS);
-	        for (CoordinateOperation op: ops) {
-	        	DefaultTransformationDefinition def = new DefaultTransformationDefinition(op, sourceDef, targetDef);
-	        	transforms.add(def);
-	        }
-		} catch (FactoryException | UnsupportedCoordinateReferenceSystemException e) {
+			return getCoordinateTransformations(sourceDef, targetDef);
+		} catch (UnsupportedCoordinateReferenceSystemException e) {
 			// FIXME: we should log instead of raising an exception
 			throw new UnsupportedTransformationException(e);
 		}
-		return transforms;
 	}
 
 	/**
