diff --git a/Code/Projections/otbEckert4MapProjection.h b/Code/Projections/otbEckert4MapProjection.h
index 24685e375adcaffeaddf894b7007235ee357c6c7..30819aaa57e5b73fd9216ab5099e1f6dba6f8959 100644
--- a/Code/Projections/otbEckert4MapProjection.h
+++ b/Code/Projections/otbEckert4MapProjection.h
@@ -29,7 +29,7 @@ namespace otb
  *
  * It converts coordinates in longitude, latitude (WGS84) to Eckert4 map coordinates.
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT Eckert4MapProjection : public MapProjection<ossimEckert4Projection, transform>
 {
 public:
diff --git a/Code/Projections/otbEckert4MapProjection.txx b/Code/Projections/otbEckert4MapProjection.txx
index f74bfad664eb5e57c4b5619c3baf76549494133f..cfbbde0b766d3febe04aab6012f437eab9edbe92 100644
--- a/Code/Projections/otbEckert4MapProjection.txx
+++ b/Code/Projections/otbEckert4MapProjection.txx
@@ -24,20 +24,20 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Eckert4MapProjection<transform>
 ::Eckert4MapProjection()
 {
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Eckert4MapProjection<transform>
 ::~Eckert4MapProjection()
 {
 }
 
 ///False easting specification
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void Eckert4MapProjection<transform>
 ::SetFalseEasting(double falseEasting)
 {
@@ -45,7 +45,7 @@ void Eckert4MapProjection<transform>
 }
 
 ///False Northing specification
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void Eckert4MapProjection<transform>
 ::SetFalseNorthing(double falseNorthing)
 {
@@ -53,7 +53,7 @@ void Eckert4MapProjection<transform>
 }
 
 ///Set the defaul parameters
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void Eckert4MapProjection<transform>
 ::SetDefaults()
 {
@@ -61,7 +61,7 @@ void Eckert4MapProjection<transform>
 }
 
 ///Get the false northing coordinates (avoid negative values)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double Eckert4MapProjection<transform>
 ::GetFalseNorthing() const
 {
@@ -70,7 +70,7 @@ double Eckert4MapProjection<transform>
 }
 
 ///Get the false easting coordinates (avoid negative values)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double Eckert4MapProjection<transform>
 ::GetFalseEasting() const
 {
@@ -78,7 +78,7 @@ double Eckert4MapProjection<transform>
   return falseEasting;
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void Eckert4MapProjection<transform>
 ::SetParameters(double falseEasting, double falseNorthing)
 {
diff --git a/Code/Projections/otbGenericMapProjection.h b/Code/Projections/otbGenericMapProjection.h
index 419c63826f816b4a901c5982c4016aad84427d02..8dcac00dddf4c2d2f20fd88be93999ba86d524ef 100644
--- a/Code/Projections/otbGenericMapProjection.h
+++ b/Code/Projections/otbGenericMapProjection.h
@@ -36,6 +36,15 @@
 namespace otb
 {
 
+namespace Transform
+{
+enum TransformationDirection
+  {
+  FORWARD = 0,
+  INVERSE = 1
+  };
+}
+
 /** \class GenericMapProjection
  *  \brief This is the base class for generic map projection transformation
  *
@@ -49,9 +58,7 @@ namespace otb
  *
  **/
 
-typedef enum {FORWARD = 0, INVERSE = 1} InverseOrForwardTransformationEnum;
-
-template <InverseOrForwardTransformationEnum TDirectionOfMapping,
+template <Transform::TransformationDirection TDirectionOfMapping,
     class TScalarType = double,
     unsigned int NInputDimensions = 2,
     unsigned int NOutputDimensions = 2>
@@ -63,7 +70,7 @@ public:
   /** Standard class typedefs. */
   typedef itk::Transform<TScalarType,
       NInputDimensions,
-      NOutputDimensions>       Superclass;
+      NOutputDimensions>                Superclass;
   typedef GenericMapProjection          Self;
   typedef itk::SmartPointer<Self>       Pointer;
   typedef itk::SmartPointer<const Self> ConstPointer;
@@ -83,9 +90,8 @@ public:
   virtual OssimMapProjectionType* GetMapProjection();
   virtual const OssimMapProjectionType* GetMapProjection() const;
 
-  typedef InverseOrForwardTransformationEnum DirectionOfMappingEnumType;
+  static const Transform::TransformationDirection DirectionOfMapping = TDirectionOfMapping;
 
-  itkStaticConstMacro(DirectionOfMapping, DirectionOfMappingEnumType, TDirectionOfMapping);
   itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions);
   itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions);
   itkStaticConstMacro(SpaceDimension, unsigned int, NInputDimensions);
diff --git a/Code/Projections/otbGenericMapProjection.txx b/Code/Projections/otbGenericMapProjection.txx
index 2d8e64606b1ed2ce2d0efbe5c7ac9cc9d38efc6f..8abcb60e8bdf40b49c7917db33f2052ac2b0b50d 100644
--- a/Code/Projections/otbGenericMapProjection.txx
+++ b/Code/Projections/otbGenericMapProjection.txx
@@ -26,9 +26,9 @@
 namespace otb
 {
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GenericMapProjection() : Superclass(SpaceDimension, ParametersDimension)
 {
   m_MapProjection = NULL;
@@ -36,9 +36,9 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
   reinstanciateProjection = true;
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::~GenericMapProjection()
 {
   if (m_MapProjection != NULL)
@@ -47,10 +47,10 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
     }
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
-typename GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>::OssimMapProjectionType*
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+typename GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>::OssimMapProjectionType*
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetMapProjection()
 {
   itkDebugMacro("returning MapProjection address " << this->m_MapProjection);
@@ -62,11 +62,11 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
   return this->m_MapProjection;
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
-const typename GenericMapProjection<Transform, TScalarType, NInputDimensions,
+const typename GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions,
     NOutputDimensions>::OssimMapProjectionType*
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetMapProjection() const
 {
   itkDebugMacro("returning MapProjection address " << this->m_MapProjection);
@@ -78,10 +78,10 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
   return this->m_MapProjection;
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 std::string
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetWkt()
 {
   ossimKeywordlist kwl;
@@ -92,10 +92,10 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
   return wkt;
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 void
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetWkt(std::string projectionRefWkt)
 {
   this->m_ProjectionRefWkt = projectionRefWkt;
@@ -104,10 +104,10 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
   this->Modified();
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 bool
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::InstanciateProjection()
 {
   if ((this->reinstanciateProjection) || (m_MapProjection == NULL))
@@ -140,17 +140,17 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
   return false;
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
-typename GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>::OutputPointType
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+typename GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>::OutputPointType
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::TransformPoint(const InputPointType& point) const
 {
   OutputPointType outputPoint;
 
 //     otbMsgDevMacro(<< "DirectionOfMapping: " <<
 //     DirectionOfMapping);
-  if (DirectionOfMapping == INVERSE)
+  if (DirectionOfMapping == Transform::INVERSE)
     {
 //     otbMsgDevMacro(<< "Cartographic coordinates: (" << point[0] << "," << point[1] << ")");
 
@@ -171,7 +171,7 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
       outputPoint[2] = point[2];
       }
     }
-  if (DirectionOfMapping == FORWARD)
+  if (DirectionOfMapping == Transform::FORWARD)
     {
 //     otbMsgDevMacro(<< "Geographic coordinates (lon, lat) : (" << point[1] << "," << point[0] << ")");
     //from "itk::point" to "ossim::ossimGpt"
@@ -194,20 +194,20 @@ GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions
   return outputPoint;
 }
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 void
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::PrintMap() const
 {
   std::cout << m_MapProjection->print(std::cout);
 }
 
 
-template<InverseOrForwardTransformationEnum Transform, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TDirectionOfMapping, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 void
-GenericMapProjection<Transform, TScalarType, NInputDimensions, NOutputDimensions>
+GenericMapProjection<TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::PrintSelf(std::ostream& os, itk::Indent indent) const
 {
   Superclass::PrintSelf(os, indent);
diff --git a/Code/Projections/otbGenericRSTransform.h b/Code/Projections/otbGenericRSTransform.h
index 56a5e693eabf3dc752fac93db2ff7c5a7fd02425..816e33790b3922c0814714ad97c5c1391f58c81b 100644
--- a/Code/Projections/otbGenericRSTransform.h
+++ b/Code/Projections/otbGenericRSTransform.h
@@ -82,7 +82,7 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(GenericRSTransform, itk::Transform);
 
-  typedef InverseOrForwardTransformationEnum DirectionOfMappingEnumType;
+  typedef Transform::TransformationDirection DirectionOfMappingEnumType;
 
   itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions);
   itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions);
diff --git a/Code/Projections/otbGenericRSTransform.txx b/Code/Projections/otbGenericRSTransform.txx
index 3e07a9fde1c2f891a21e75969f69fce51b3b7e07..a8381a3120ebd17020a43ea795e25a3b8f3e5510 100644
--- a/Code/Projections/otbGenericRSTransform.txx
+++ b/Code/Projections/otbGenericRSTransform.txx
@@ -113,7 +113,7 @@ GenericRSTransform<TScalarType, NInputDimensions, NOutputDimensions>
     // First, try to make a geo transform
   if (!m_InputProjectionRef.empty()) //map projection
     {
-    typedef otb::GenericMapProjection<otb::INVERSE, ScalarType, InputSpaceDimension, InputSpaceDimension>
+    typedef otb::GenericMapProjection<Transform::INVERSE, ScalarType, InputSpaceDimension, InputSpaceDimension>
         InverseMapProjectionType;
     typename InverseMapProjectionType::Pointer mapTransform = InverseMapProjectionType::New();
     mapTransform->SetWkt(m_InputProjectionRef);
@@ -191,7 +191,7 @@ GenericRSTransform<TScalarType, NInputDimensions, NOutputDimensions>
   //*****************************
   if (!m_OutputProjectionRef.empty()) //map projection
     {
-    typedef otb::GenericMapProjection<otb::FORWARD, ScalarType, InputSpaceDimension,
+    typedef otb::GenericMapProjection<Transform::FORWARD, ScalarType, InputSpaceDimension,
     OutputSpaceDimension> ForwardMapProjectionType;
     typename ForwardMapProjectionType::Pointer mapTransform = ForwardMapProjectionType::New();
     mapTransform->SetWkt(m_OutputProjectionRef);
diff --git a/Code/Projections/otbGeocentricTransform.h b/Code/Projections/otbGeocentricTransform.h
index f0871533622574f002ebe56f644b69b78d44f1bc..08f2d59f7e5d94af1b0234ebed9fdeb32fddcd8d 100644
--- a/Code/Projections/otbGeocentricTransform.h
+++ b/Code/Projections/otbGeocentricTransform.h
@@ -30,7 +30,7 @@ namespace otb
  * \brief Convert coordinates from geocentric (X, Y, Z) to geographic (lon, lat, h)
  *
  */
-template <InverseOrForwardTransformationEnum TDirectionOfMapping,
+template <Transform::TransformationDirection TDirectionOfMapping,
     class TScalarType = double,
     unsigned int NInputDimensions = 3,
     unsigned int NOutputDimensions = 3>
@@ -58,9 +58,8 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(GeocentricTransform, itk::Transform);
 
-  typedef InverseOrForwardTransformationEnum DirectionOfMappingEnumType;
+  static const Transform::TransformationDirection DirectionOfMapping = TDirectionOfMapping;
 
-  itkStaticConstMacro(DirectionOfMapping, DirectionOfMappingEnumType, TDirectionOfMapping);
   itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions);
   itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions);
   itkStaticConstMacro(SpaceDimension, unsigned int, NInputDimensions);
diff --git a/Code/Projections/otbGeocentricTransform.txx b/Code/Projections/otbGeocentricTransform.txx
index 467d45164cc07fb0f0811600b8cffc4563c7c335..9f2180e687b0068338a3ec724f5edefc6c5b7894 100644
--- a/Code/Projections/otbGeocentricTransform.txx
+++ b/Code/Projections/otbGeocentricTransform.txx
@@ -23,7 +23,7 @@
 namespace otb
 {
 
-template<InverseOrForwardTransformationEnum TransformDirection, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TransformDirection, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 GeocentricTransform<TransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
 ::GeocentricTransform() : Superclass(SpaceDimension, ParametersDimension)
@@ -31,7 +31,7 @@ GeocentricTransform<TransformDirection, TScalarType, NInputDimensions, NOutputDi
   m_Ellipsoid = new ossimEllipsoid();
 }
 
-template<InverseOrForwardTransformationEnum TransformDirection, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TransformDirection, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 GeocentricTransform<TransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
 ::~GeocentricTransform()
@@ -42,7 +42,7 @@ GeocentricTransform<TransformDirection, TScalarType, NInputDimensions, NOutputDi
     }
 }
 
-template<InverseOrForwardTransformationEnum TransformDirection, class TScalarType, unsigned int NInputDimensions,
+template<Transform::TransformationDirection TransformDirection, class TScalarType, unsigned int NInputDimensions,
     unsigned int NOutputDimensions>
 typename GeocentricTransform<TransformDirection, TScalarType, NInputDimensions, NOutputDimensions>::OutputPointType
 GeocentricTransform<TransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
@@ -50,11 +50,11 @@ GeocentricTransform<TransformDirection, TScalarType, NInputDimensions, NOutputDi
 {
   OutputPointType outputPoint;
 
-  if (DirectionOfMapping == INVERSE)
+  if (DirectionOfMapping == Transform::INVERSE)
     {
     m_Ellipsoid->XYZToLatLonHeight(point[0], point[1], point[2], outputPoint[1], outputPoint[0], outputPoint[2]);
     }
-  if (DirectionOfMapping == FORWARD)
+  if (DirectionOfMapping == Transform::FORWARD)
     {
     m_Ellipsoid->latLonHeightToXYZ(point[1], point[0], point[2], outputPoint[0], outputPoint[1], outputPoint[2]);
     }
diff --git a/Code/Projections/otbLambert2EtenduProjection.h b/Code/Projections/otbLambert2EtenduProjection.h
index 572e9a2b0c70c0734021aa199cedb5544f0f102e..0f8ce3247dafd80b27adcb31f07dcc51ce68823d 100644
--- a/Code/Projections/otbLambert2EtenduProjection.h
+++ b/Code/Projections/otbLambert2EtenduProjection.h
@@ -29,7 +29,7 @@ namespace otb
 * It converts coordinates in longitude, latitude (WGS84) to Lambert 2 Etendu map coordinates.
 *
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT Lambert2EtenduProjection : public LambertConformalConicMapProjection<transform>
 {
 public:
diff --git a/Code/Projections/otbLambert2EtenduProjection.txx b/Code/Projections/otbLambert2EtenduProjection.txx
index f3b037e0d5d40391938c2bd4ed2f1d436075e694..4f2f118adf5efb998ace0db9d6a4f3149c5f5f4c 100644
--- a/Code/Projections/otbLambert2EtenduProjection.txx
+++ b/Code/Projections/otbLambert2EtenduProjection.txx
@@ -24,7 +24,7 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Lambert2EtenduProjection<transform>
 ::Lambert2EtenduProjection()
 {
@@ -46,7 +46,7 @@ Lambert2EtenduProjection<transform>
   this->SetParameters(parall1, parall2, falseEasting, falseNorthing);
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Lambert2EtenduProjection<transform>
 ::~Lambert2EtenduProjection()
 {
diff --git a/Code/Projections/otbLambert3CartoSudProjection.h b/Code/Projections/otbLambert3CartoSudProjection.h
index 8ab4537ea67d010718653749382f94786c32734f..873ab4c5fa5257a5891e584d5f94c94f86ee0f19 100644
--- a/Code/Projections/otbLambert3CartoSudProjection.h
+++ b/Code/Projections/otbLambert3CartoSudProjection.h
@@ -29,7 +29,7 @@ namespace otb
 * It converts coordinates in longitude, latitude (WGS84) to Lambert 3 map coordinates.
 *
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT Lambert3CartoSudProjection : public LambertConformalConicMapProjection<transform>
 {
 public:
diff --git a/Code/Projections/otbLambert3CartoSudProjection.txx b/Code/Projections/otbLambert3CartoSudProjection.txx
index 6ab09ce5f71748531ba1437db971e85b7a970b91..9fbc7840579a545463beb0d49e102499fe08159c 100644
--- a/Code/Projections/otbLambert3CartoSudProjection.txx
+++ b/Code/Projections/otbLambert3CartoSudProjection.txx
@@ -24,7 +24,7 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Lambert3CartoSudProjection<transform>
 ::Lambert3CartoSudProjection()
 {
@@ -46,7 +46,7 @@ Lambert3CartoSudProjection<transform>
   this->SetParameters(parall1, parall2, falseEasting, falseNorthing);
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Lambert3CartoSudProjection<transform>
 ::~Lambert3CartoSudProjection()
 {
diff --git a/Code/Projections/otbLambert93Projection.h b/Code/Projections/otbLambert93Projection.h
index a9cc2a0a9d280ec94b2f07ea14e7b9a8b1634d3e..03ea9706cc5a691057ff18163b0186ec241b94f8 100644
--- a/Code/Projections/otbLambert93Projection.h
+++ b/Code/Projections/otbLambert93Projection.h
@@ -29,7 +29,7 @@ namespace otb
 * It converts coordinates in longitude, latitude (WGS84) to Lambert 93 map coordinates.
 *
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT Lambert93Projection : public LambertConformalConicMapProjection<transform>
 {
 public:
diff --git a/Code/Projections/otbLambert93Projection.txx b/Code/Projections/otbLambert93Projection.txx
index 5d567f55f25714541589664f04e26c8577389ee6..1bceddc53d60dc2403612376fd34cdd5e13594f9 100644
--- a/Code/Projections/otbLambert93Projection.txx
+++ b/Code/Projections/otbLambert93Projection.txx
@@ -24,7 +24,7 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Lambert93Projection<transform>
 ::Lambert93Projection()
 {
@@ -46,7 +46,7 @@ Lambert93Projection<transform>
   this->SetParameters(parall1, parall2, falseEasting, falseNorthing);
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 Lambert93Projection<transform>
 ::~Lambert93Projection()
 {
diff --git a/Code/Projections/otbLambertConformalConicMapProjection.h b/Code/Projections/otbLambertConformalConicMapProjection.h
index a584614480cb16a53f7bb753b45725ea616c6c4a..64a30a0663ac84d08ce76defe67ccbf849fecdee 100644
--- a/Code/Projections/otbLambertConformalConicMapProjection.h
+++ b/Code/Projections/otbLambertConformalConicMapProjection.h
@@ -29,7 +29,7 @@ namespace otb
  * It converts coordinates in longitude, latitude (WGS84) to Lambert Conformal Conic map coordinates.
  *
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT LambertConformalConicMapProjection : public MapProjection<ossimLambertConformalConicProjection,
       transform>
 {
diff --git a/Code/Projections/otbLambertConformalConicMapProjection.txx b/Code/Projections/otbLambertConformalConicMapProjection.txx
index f5d81a36517a5fb5cad420a0f1b5d51ea994059f..eef6ccd7bc3eaaad4e835706c2224a6153dbbd27 100644
--- a/Code/Projections/otbLambertConformalConicMapProjection.txx
+++ b/Code/Projections/otbLambertConformalConicMapProjection.txx
@@ -24,20 +24,20 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 LambertConformalConicMapProjection<transform>
 ::LambertConformalConicMapProjection()
 {
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 LambertConformalConicMapProjection<transform>
 ::~LambertConformalConicMapProjection()
 {
 }
 
 /// Parallel1 specification
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void LambertConformalConicMapProjection<transform>
 ::SetStandardParallel1(double degree)
 {
@@ -45,7 +45,7 @@ void LambertConformalConicMapProjection<transform>
 }
 
 /// Parallel2 specification
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void LambertConformalConicMapProjection<transform>
 ::SetStandardParallel2(double degree)
 {
@@ -53,7 +53,7 @@ void LambertConformalConicMapProjection<transform>
 }
 
 /// Specification of the 2 parallels
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void LambertConformalConicMapProjection<transform>
 ::SetStandardParallels(double parallel1Degree, double parallel2Degree)
 {
@@ -61,7 +61,7 @@ void LambertConformalConicMapProjection<transform>
 }
 
 /// False easting specification
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void LambertConformalConicMapProjection<transform>
 ::SetFalseEasting(double falseEasting)
 {
@@ -69,7 +69,7 @@ void LambertConformalConicMapProjection<transform>
 }
 
 /// False Northing specification
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void LambertConformalConicMapProjection<transform>
 ::SetFalseNorthing(double falseNorthing)
 {
@@ -77,7 +77,7 @@ void LambertConformalConicMapProjection<transform>
 }
 
 /// Set the parameters
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void LambertConformalConicMapProjection<transform>
 ::SetParameters(double parallel1Degree, double parallel2Degree, double falseEasting, double falseNorthing)
 {
@@ -85,7 +85,7 @@ void LambertConformalConicMapProjection<transform>
 }
 
 /// Set the default parameters
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void LambertConformalConicMapProjection<transform>
 ::SetDefaults()
 {
@@ -93,7 +93,7 @@ void LambertConformalConicMapProjection<transform>
 }
 
 /// Get the False Northing (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double LambertConformalConicMapProjection<transform>
 ::GetFalseNorthing() const
 {
@@ -103,7 +103,7 @@ double LambertConformalConicMapProjection<transform>
 }
 
 ///Get the False Easting (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double LambertConformalConicMapProjection<transform>
 ::GetFalseEasting() const
 {
diff --git a/Code/Projections/otbMapProjection.h b/Code/Projections/otbMapProjection.h
index 521a1163bc762be897dda5a1912962d35e00afce..39a06a3abc9784be36244fe1c5741ef52c0a5784 100644
--- a/Code/Projections/otbMapProjection.h
+++ b/Code/Projections/otbMapProjection.h
@@ -54,7 +54,7 @@ namespace otb
  **/
 
 template <class TOssimMapProjection,
-    InverseOrForwardTransformationEnum TDirectionOfMapping,
+    Transform::TransformationDirection TDirectionOfMapping,
     class TScalarType = double,
     unsigned int NInputDimensions = 2,
     unsigned int NOutputDimensions = 2>
@@ -86,9 +86,8 @@ public:
   virtual const OssimMapProjectionType* GetMapProjection() const;
   virtual OssimMapProjectionType* GetMapProjection();
 
-  typedef InverseOrForwardTransformationEnum DirectionOfMappingEnumType;
+  static const Transform::TransformationDirection DirectionOfMapping = TDirectionOfMapping;
 
-  itkStaticConstMacro(DirectionOfMapping, DirectionOfMappingEnumType, TDirectionOfMapping);
   itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions);
   itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions);
   itkStaticConstMacro(SpaceDimension, unsigned int, NInputDimensions);
diff --git a/Code/Projections/otbMapProjection.txx b/Code/Projections/otbMapProjection.txx
index 36a1b8add2ea16f011ecbf41687b8ceafe35b0b9..93c842798adbbba8aa0865a7d6b60df21e85136f 100644
--- a/Code/Projections/otbMapProjection.txx
+++ b/Code/Projections/otbMapProjection.txx
@@ -24,9 +24,9 @@
 namespace otb
 {
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::MapProjection() : Superclass(SpaceDimension, ParametersDimension)
 {
   m_MapProjection = NULL;
@@ -34,45 +34,45 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
   this->InstanciateProjection();
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::~MapProjection()
 {
   m_MapProjection = NULL;
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 const TOssimMapProjection*
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetMapProjection() const
 {
   return this->m_MapProjection.get();
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 TOssimMapProjection*
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetMapProjection()
 {
   return this->m_MapProjection.release();
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::InstanciateProjection()
 {
   m_MapProjection =  new OssimMapProjectionType();
 }
 
 /// Method to set the projection ellipsoid
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetEllipsoid()
 {
   ossimEllipsoid ellipsoid;
@@ -80,18 +80,18 @@ void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions
 }
 
 /// Method to set the projection ellipsoid by copy
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetEllipsoid(const ossimEllipsoid& ellipsoid)
 {
   m_MapProjection->setEllipsoid(ellipsoid);
 }
 
 ///// Method to set the projection ellipsoid by knowing its code
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetEllipsoid(std::string code)
 {
   const ossimEllipsoid ellipsoid = *(ossimEllipsoidFactory::instance()->create(ossimString(code)));
@@ -99,25 +99,25 @@ void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions
 }
 
 ///// Method to set the projection ellipsoid by knowing its axis
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetEllipsoid(const double& major_axis, const double& minor_axis)
 {
   ossimEllipsoid ellipsoid(major_axis, minor_axis);
   m_MapProjection->setEllipsoid(ellipsoid);
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-typename MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions,
+typename MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions,
     NOutputDimensions>::OutputPointType
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::TransformPoint(const InputPointType& point) const
 {
   OutputPointType outputPoint;
 
-  if (DirectionOfMapping == INVERSE)
+  if (DirectionOfMapping == Transform::INVERSE)
     {
 //     otbMsgDevMacro(<< "Cartographic coordinates: (" << point[0] << "," << point[1] << ")");
 
@@ -134,7 +134,7 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
     outputPoint[1] = ossimGPoint.lat;
 //     otbMsgDevMacro(<< "Geographic coordinates (lon, lat) : (" << outputPoint[0] << "," << outputPoint[1] << ")");
     }
-  if (DirectionOfMapping == FORWARD)
+  if (DirectionOfMapping == Transform::FORWARD)
     {
 //     otbMsgDevMacro(<< "Geographic coordinates (lon, lat) : (" << point[1] << "," << point[0] << ")");
     //from "itk::point" to "ossim::ossimGpt"
@@ -154,11 +154,11 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The geographic point corresponding to (0, 0)
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-typename MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions,
+typename MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions,
     NOutputDimensions>::InputPointType
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::Origin()
 {
   ossimGpt       ossimOrigin = m_MapProjection->origin();
@@ -170,10 +170,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The False Northing(avoid negative coordinates)
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 double
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetFalseNorthing() const
 {
   double falseNorthing = m_MapProjection->getFalseNorthing();
@@ -182,10 +182,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The FalseEasting(avoid negative coordinates)
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 double
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetFalseEasting() const
 {
   double falseEasting = m_MapProjection->getFalseEasting();
@@ -194,10 +194,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The StandardParallel1(depends on the projection type)
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 double
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetStandardParallel1() const
 {
   double standardParallel1 = m_MapProjection->getStandardParallel1();
@@ -206,10 +206,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The StandardParallel2(depends on the projection type)
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 double
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetStandardParallel2() const
 {
   double standardParallel2 = m_MapProjection->getStandardParallel2();
@@ -218,10 +218,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The projection name
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 std::string
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetProjectionName() const
 {
   std::string projectionName;
@@ -231,20 +231,20 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///Check if the projection is geographic
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 bool
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::IsGeographic() const
 {
   return (m_MapProjection->isGeographic());
 }
 
 ///\return the major axis of the ellipsoid
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 double
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetA() const
 {
   double majorAxis = m_MapProjection->getA();
@@ -253,10 +253,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return the minor axis of the ellipsoid
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 double
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetB() const
 {
   double minorAxis = m_MapProjection->getB();
@@ -265,10 +265,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return the flatening of the ellipsoid
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 double
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetF() const
 {
   double flattening = m_MapProjection->getF();
@@ -277,11 +277,11 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The resolution in meters
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-typename MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions,
+typename MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions,
     NOutputDimensions>::OutputPointType
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetMetersPerPixel() const
 {
   ossimDpt        ossimMetersPerPixels = m_MapProjection->getMetersPerPixel();
@@ -294,11 +294,11 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return The resolution in degree
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-typename MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions,
+typename MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions,
     NOutputDimensions>::OutputPointType
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetDecimalDegreesPerPixel() const
 {
   ossimDpt        ossimDecimalDegreesPerPixels = m_MapProjection->getDecimalDegreesPerPixel();
@@ -311,18 +311,18 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///Set the ellipsoid axis
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetAB(double a, double b)
 {
   m_MapProjection->setAB(a, b);
 }
 
 ///Set the origin
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetOrigin(const InputPointType& origin)
 {
   ossimGpt ossimOrigin(origin[1], origin[0]);
@@ -330,9 +330,9 @@ void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions
 }
 
 ///Set the origin in a given datum
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetOrigin(const InputPointType& origin, std::string datumCode)
 {
   ossimGpt ossimOrigin(origin[1], origin[0], 0, ossimDatumFactory::instance()->create(datumCode));
@@ -340,9 +340,9 @@ void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions
 }
 
 ///Set the map resolution in meters
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetMetersPerPixel(const OutputPointType& point)
 {
   ossimDpt ossimDPoint(point[0], point[1]);
@@ -350,9 +350,9 @@ void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions
 }
 
 ///Set the map resolution in degree
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetDecimalDegreesPerPixel(const OutputPointType& point)
 {
   ossimDpt ossimDPoint(point[0], point[1]);
@@ -360,9 +360,9 @@ void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions
 }
 
 ///\return an approximation of the resolution in degree
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
-void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+void MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::ComputeDegreesPerPixel(const InputPointType& ground,
                          const OutputPointType& metersPerPixel,
                          double& deltaLat,
@@ -374,10 +374,10 @@ void MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions
 }
 
 ///\return an approximation of the resolution in meters
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::ComputeMetersPerPixel(const InputPointType& center,
                         double deltaDegreesPerPixelLat,
                         double deltaDegreesPerPixelLon,
@@ -395,10 +395,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
 }
 
 ///\return an approximation of the resolution in meters
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::ComputeMetersPerPixel(double deltaDegreesPerPixelLat, double deltaDegreesPerPixelLon, OutputPointType& metersPerPixel)
 {
   ossimDpt ossimMetersPerPixel;
@@ -408,10 +408,10 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
   metersPerPixel[1] = ossimMetersPerPixel.y;
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 std::string
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetWkt() const
 {
   ossimKeywordlist kwl;
@@ -422,20 +422,20 @@ MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOu
   return wkt;
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetWkt(std::string projectionRefWkt)
 {
   this->m_ProjectionRefWkt = projectionRefWkt;
   this->Modified();
 }
 
-template<class TOssimMapProjection, InverseOrForwardTransformationEnum Transform, class TScalarType,
+template<class TOssimMapProjection, Transform::TransformationDirection TDirectionOfMapping, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void
-MapProjection<TOssimMapProjection, Transform, TScalarType, NInputDimensions, NOutputDimensions>
+MapProjection<TOssimMapProjection, TDirectionOfMapping, TScalarType, NInputDimensions, NOutputDimensions>
 ::PrintMap() const
 {
   std::cout << m_MapProjection->print(std::cout);
diff --git a/Code/Projections/otbMapProjections.h b/Code/Projections/otbMapProjections.h
index 79043bdf74c7bfa8b80c77d6b8e77eff6b773494..8a23038de6263dbf0d39465bd68ce6147def5f4e 100644
--- a/Code/Projections/otbMapProjections.h
+++ b/Code/Projections/otbMapProjections.h
@@ -61,72 +61,72 @@
 namespace otb
 {
 
-typedef MapProjection<ossimAlbersProjection, INVERSE>               AlbersInverseProjection;
-typedef MapProjection<ossimAlbersProjection, FORWARD>               AlbersForwardProjection;
-typedef MapProjection<ossimAzimEquDistProjection, INVERSE>          AzimEquDistInverseProjection;
-typedef MapProjection<ossimAzimEquDistProjection, FORWARD>          AzimEquDistForwardProjection;
-typedef MapProjection<ossimBngProjection, INVERSE>                  BngInverseProjection;
-typedef MapProjection<ossimBngProjection, FORWARD>                  BngForwardProjection;
-typedef MapProjection<ossimBonneProjection, INVERSE>                BonneInverseProjection;
-typedef MapProjection<ossimBonneProjection, FORWARD>                BonneForwardProjection;
-typedef MapProjection<ossimCadrgProjection, INVERSE>                CadrgInverseProjection;
-typedef MapProjection<ossimCadrgProjection, FORWARD>                CadrgForwardProjection;
-typedef MapProjection<ossimCassiniProjection, INVERSE>              CassiniInverseProjection;
-typedef MapProjection<ossimCassiniProjection, FORWARD>              CassiniForwardProjection;
-typedef MapProjection<ossimCylEquAreaProjection, INVERSE>           CylEquAreaInverseProjection;
-typedef MapProjection<ossimCylEquAreaProjection, FORWARD>           CylEquAreaForwardProjection;
-typedef Eckert4MapProjection<INVERSE>                               Eckert4InverseProjection;
-typedef Eckert4MapProjection<FORWARD>                               Eckert4ForwardProjection;
-typedef MapProjection<ossimEckert6Projection, INVERSE>              Eckert6InverseProjection;
-typedef MapProjection<ossimEckert6Projection, FORWARD>              Eckert6ForwardProjection;
-typedef MapProjection<ossimGnomonicProjection, INVERSE>             GnomonicInverseProjection;
-typedef MapProjection<ossimGnomonicProjection, FORWARD>             GnomonicForwardProjection;
-typedef LambertConformalConicMapProjection<INVERSE>                 LambertConformalConicInverseProjection;
-typedef LambertConformalConicMapProjection<FORWARD>                 LambertConformalConicForwardProjection;
-typedef Lambert2EtenduProjection<INVERSE>                           Lambert2EtenduInverseProjection;
-typedef Lambert2EtenduProjection<FORWARD>                           Lambert2EtenduForwardProjection;
-typedef Lambert3CartoSudProjection<INVERSE>                         Lambert3CartoSudInverseProjection;
-typedef Lambert3CartoSudProjection<FORWARD>                         Lambert3CartoSudForwardProjection;
-typedef Lambert93Projection<INVERSE>                                Lambert93InverseProjection;
-typedef Lambert93Projection<FORWARD>                                Lambert93ForwardProjection;
-typedef SVY21MapProjection<INVERSE>                                 SVY21InverseProjection;
-typedef SVY21MapProjection<FORWARD>                                 SVY21ForwardProjection;
-typedef MapProjection<ossimLlxyProjection, INVERSE>                 LlxyInverseProjection;
-typedef MapProjection<ossimLlxyProjection, FORWARD>                 LlxyForwardProjection;
-typedef MapProjection<ossimEquDistCylProjection, INVERSE>           EquDistCylInverseProjection;
-typedef MapProjection<ossimEquDistCylProjection, FORWARD>           EquDistCylForwardProjection;
-typedef MapProjection<ossimMercatorProjection, INVERSE>             MercatorInverseProjection;
-typedef MapProjection<ossimMercatorProjection, FORWARD>             MercatorForwardProjection;
-typedef MapProjection<ossimMillerProjection, INVERSE>               MillerInverseProjection;
-typedef MapProjection<ossimMillerProjection, FORWARD>               MillerForwardProjection;
-typedef MollweidMapProjection<INVERSE>                              MollweidInverseProjection;
-typedef MollweidMapProjection<FORWARD>                              MollweidForwardProjection;
-typedef MapProjection<ossimNewZealandMapGridProjection, INVERSE>    NewZealandMapGridInverseProjection;
-typedef MapProjection<ossimNewZealandMapGridProjection, FORWARD>    NewZealandMapGridForwardProjection;
-typedef MapProjection<ossimObliqueMercatorProjection, INVERSE>      ObliqueMercatorInverseProjection;
-typedef MapProjection<ossimObliqueMercatorProjection, FORWARD>      ObliqueMercatorForwardProjection;
-typedef MapProjection<ossimOrthoGraphicProjection, INVERSE>         OrthoGraphicInverseProjection;
-typedef MapProjection<ossimOrthoGraphicProjection, FORWARD>         OrthoGraphicForwardProjection;
-typedef MapProjection<ossimPolarStereoProjection, INVERSE>          PolarStereoInverseProjection;
-typedef MapProjection<ossimPolarStereoProjection, FORWARD>          PolarStereoForwardProjection;
-typedef MapProjection<ossimPolyconicProjection, INVERSE>            PolyconicInverseProjection;
-typedef MapProjection<ossimPolyconicProjection, FORWARD>            PolyconicForwardProjection;
-typedef SinusoidalMapProjection<INVERSE>                            SinusoidalInverseProjection;
-typedef SinusoidalMapProjection<FORWARD>                            SinusoidalForwardProjection;
-typedef MapProjection<ossimSpaceObliqueMercatorProjection, INVERSE> SpaceObliqueMercatorInverseProjection;
-typedef MapProjection<ossimSpaceObliqueMercatorProjection, FORWARD> SpaceObliqueMercatorForwardProjection;
-typedef MapProjection<ossimStereographicProjection, INVERSE>        StereographicInverseProjection;
-typedef MapProjection<ossimStereographicProjection, FORWARD>        StereographicForwardProjection;
-typedef MapProjection<ossimTransCylEquAreaProjection, INVERSE>      TransCylEquAreaInverseProjection;
-typedef MapProjection<ossimTransCylEquAreaProjection, FORWARD>      TransCylEquAreaForwardProjection;
-typedef TransMercatorMapProjection<INVERSE>                         TransMercatorInverseProjection;
-typedef TransMercatorMapProjection<FORWARD>                         TransMercatorForwardProjection;
-typedef MapProjection<ossimUpsProjection, INVERSE>                  UpsInverseProjection;
-typedef MapProjection<ossimUpsProjection, FORWARD>                  UpsForwardProjection;
-typedef UtmMapProjection<INVERSE>                                   UtmInverseProjection;
-typedef UtmMapProjection<FORWARD>                                   UtmForwardProjection;
-typedef MapProjection<ossimVanDerGrintenProjection, INVERSE>        VanDerGrintenInverseProjection;
-typedef MapProjection<ossimVanDerGrintenProjection, FORWARD>        VanDerGrintenForwardProjection;
+typedef MapProjection<ossimAlbersProjection, Transform::INVERSE>               AlbersInverseProjection;
+typedef MapProjection<ossimAlbersProjection, Transform::FORWARD>               AlbersForwardProjection;
+typedef MapProjection<ossimAzimEquDistProjection, Transform::INVERSE>          AzimEquDistInverseProjection;
+typedef MapProjection<ossimAzimEquDistProjection, Transform::FORWARD>          AzimEquDistForwardProjection;
+typedef MapProjection<ossimBngProjection, Transform::INVERSE>                  BngInverseProjection;
+typedef MapProjection<ossimBngProjection, Transform::FORWARD>                  BngForwardProjection;
+typedef MapProjection<ossimBonneProjection, Transform::INVERSE>                BonneInverseProjection;
+typedef MapProjection<ossimBonneProjection, Transform::FORWARD>                BonneForwardProjection;
+typedef MapProjection<ossimCadrgProjection, Transform::INVERSE>                CadrgInverseProjection;
+typedef MapProjection<ossimCadrgProjection, Transform::FORWARD>                CadrgForwardProjection;
+typedef MapProjection<ossimCassiniProjection, Transform::INVERSE>              CassiniInverseProjection;
+typedef MapProjection<ossimCassiniProjection, Transform::FORWARD>              CassiniForwardProjection;
+typedef MapProjection<ossimCylEquAreaProjection, Transform::INVERSE>           CylEquAreaInverseProjection;
+typedef MapProjection<ossimCylEquAreaProjection, Transform::FORWARD>           CylEquAreaForwardProjection;
+typedef Eckert4MapProjection<Transform::INVERSE>                               Eckert4InverseProjection;
+typedef Eckert4MapProjection<Transform::FORWARD>                               Eckert4ForwardProjection;
+typedef MapProjection<ossimEckert6Projection, Transform::INVERSE>              Eckert6InverseProjection;
+typedef MapProjection<ossimEckert6Projection, Transform::FORWARD>              Eckert6ForwardProjection;
+typedef MapProjection<ossimGnomonicProjection, Transform::INVERSE>             GnomonicInverseProjection;
+typedef MapProjection<ossimGnomonicProjection, Transform::FORWARD>             GnomonicForwardProjection;
+typedef LambertConformalConicMapProjection<Transform::INVERSE>                 LambertConformalConicInverseProjection;
+typedef LambertConformalConicMapProjection<Transform::FORWARD>                 LambertConformalConicForwardProjection;
+typedef Lambert2EtenduProjection<Transform::INVERSE>                           Lambert2EtenduInverseProjection;
+typedef Lambert2EtenduProjection<Transform::FORWARD>                           Lambert2EtenduForwardProjection;
+typedef Lambert3CartoSudProjection<Transform::INVERSE>                         Lambert3CartoSudInverseProjection;
+typedef Lambert3CartoSudProjection<Transform::FORWARD>                         Lambert3CartoSudForwardProjection;
+typedef Lambert93Projection<Transform::INVERSE>                                Lambert93InverseProjection;
+typedef Lambert93Projection<Transform::FORWARD>                                Lambert93ForwardProjection;
+typedef SVY21MapProjection<Transform::INVERSE>                                 SVY21InverseProjection;
+typedef SVY21MapProjection<Transform::FORWARD>                                 SVY21ForwardProjection;
+typedef MapProjection<ossimLlxyProjection, Transform::INVERSE>                 LlxyInverseProjection;
+typedef MapProjection<ossimLlxyProjection, Transform::FORWARD>                 LlxyForwardProjection;
+typedef MapProjection<ossimEquDistCylProjection, Transform::INVERSE>           EquDistCylInverseProjection;
+typedef MapProjection<ossimEquDistCylProjection, Transform::FORWARD>           EquDistCylForwardProjection;
+typedef MapProjection<ossimMercatorProjection, Transform::INVERSE>             MercatorInverseProjection;
+typedef MapProjection<ossimMercatorProjection, Transform::FORWARD>             MercatorForwardProjection;
+typedef MapProjection<ossimMillerProjection, Transform::INVERSE>               MillerInverseProjection;
+typedef MapProjection<ossimMillerProjection, Transform::FORWARD>               MillerForwardProjection;
+typedef MollweidMapProjection<Transform::INVERSE>                              MollweidInverseProjection;
+typedef MollweidMapProjection<Transform::FORWARD>                              MollweidForwardProjection;
+typedef MapProjection<ossimNewZealandMapGridProjection, Transform::INVERSE>    NewZealandMapGridInverseProjection;
+typedef MapProjection<ossimNewZealandMapGridProjection, Transform::FORWARD>    NewZealandMapGridForwardProjection;
+typedef MapProjection<ossimObliqueMercatorProjection, Transform::INVERSE>      ObliqueMercatorInverseProjection;
+typedef MapProjection<ossimObliqueMercatorProjection, Transform::FORWARD>      ObliqueMercatorForwardProjection;
+typedef MapProjection<ossimOrthoGraphicProjection, Transform::INVERSE>         OrthoGraphicInverseProjection;
+typedef MapProjection<ossimOrthoGraphicProjection, Transform::FORWARD>         OrthoGraphicForwardProjection;
+typedef MapProjection<ossimPolarStereoProjection, Transform::INVERSE>          PolarStereoInverseProjection;
+typedef MapProjection<ossimPolarStereoProjection, Transform::FORWARD>          PolarStereoForwardProjection;
+typedef MapProjection<ossimPolyconicProjection, Transform::INVERSE>            PolyconicInverseProjection;
+typedef MapProjection<ossimPolyconicProjection, Transform::FORWARD>            PolyconicForwardProjection;
+typedef SinusoidalMapProjection<Transform::INVERSE>                            SinusoidalInverseProjection;
+typedef SinusoidalMapProjection<Transform::FORWARD>                            SinusoidalForwardProjection;
+typedef MapProjection<ossimSpaceObliqueMercatorProjection, Transform::INVERSE> SpaceObliqueMercatorInverseProjection;
+typedef MapProjection<ossimSpaceObliqueMercatorProjection, Transform::FORWARD> SpaceObliqueMercatorForwardProjection;
+typedef MapProjection<ossimStereographicProjection, Transform::INVERSE>        StereographicInverseProjection;
+typedef MapProjection<ossimStereographicProjection, Transform::FORWARD>        StereographicForwardProjection;
+typedef MapProjection<ossimTransCylEquAreaProjection, Transform::INVERSE>      TransCylEquAreaInverseProjection;
+typedef MapProjection<ossimTransCylEquAreaProjection, Transform::FORWARD>      TransCylEquAreaForwardProjection;
+typedef TransMercatorMapProjection<Transform::INVERSE>                         TransMercatorInverseProjection;
+typedef TransMercatorMapProjection<Transform::FORWARD>                         TransMercatorForwardProjection;
+typedef MapProjection<ossimUpsProjection, Transform::INVERSE>                  UpsInverseProjection;
+typedef MapProjection<ossimUpsProjection, Transform::FORWARD>                  UpsForwardProjection;
+typedef UtmMapProjection<Transform::INVERSE>                                   UtmInverseProjection;
+typedef UtmMapProjection<Transform::FORWARD>                                   UtmForwardProjection;
+typedef MapProjection<ossimVanDerGrintenProjection, Transform::INVERSE>        VanDerGrintenInverseProjection;
+typedef MapProjection<ossimVanDerGrintenProjection, Transform::FORWARD>        VanDerGrintenForwardProjection;
 
 } //namespace otb
 #endif
diff --git a/Code/Projections/otbMollweidMapProjection.h b/Code/Projections/otbMollweidMapProjection.h
index a974056b2429e2a1f01d7f74651efab5f54aec71..86c8d34f76f8636cb910ae179e34cf659712feee 100644
--- a/Code/Projections/otbMollweidMapProjection.h
+++ b/Code/Projections/otbMollweidMapProjection.h
@@ -28,7 +28,7 @@ namespace otb
  *  \brief This class implements the Mollweid map projection.
  *  It converts coordinates in longitude, latitude (WGS84) to Mollweid map coordinates.
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT MollweidMapProjection : public MapProjection<ossimMollweidProjection, transform>
 {
 public:
diff --git a/Code/Projections/otbMollweidMapProjection.txx b/Code/Projections/otbMollweidMapProjection.txx
index 1a3711635c8e7b071a4018e3899a292af4d26f21..72b81183da6ea4b9812189f7cff7f2796643f1ef 100644
--- a/Code/Projections/otbMollweidMapProjection.txx
+++ b/Code/Projections/otbMollweidMapProjection.txx
@@ -24,20 +24,20 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 MollweidMapProjection<transform>
 ::MollweidMapProjection()
 {
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 MollweidMapProjection<transform>
 ::~MollweidMapProjection()
 {
 }
 
 ///Set the false easting
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void MollweidMapProjection<transform>
 ::SetFalseEasting(double falseEasting)
 {
@@ -45,7 +45,7 @@ void MollweidMapProjection<transform>
 }
 
 ///Set the false Northing
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void MollweidMapProjection<transform>
 ::SetFalseNorthing(double falseNorthing)
 {
@@ -53,7 +53,7 @@ void MollweidMapProjection<transform>
 }
 
 ///Set the default parameters
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void MollweidMapProjection<transform>
 ::SetDefaults()
 {
@@ -61,7 +61,7 @@ void MollweidMapProjection<transform>
 }
 
 ///\return the false northing (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double MollweidMapProjection<transform>
 ::GetFalseNorthing() const
 {
@@ -71,7 +71,7 @@ double MollweidMapProjection<transform>
 }
 
 ///\return the false easting (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double MollweidMapProjection<transform>
 ::GetFalseEasting() const
 {
@@ -80,7 +80,7 @@ double MollweidMapProjection<transform>
   return falseEasting;
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void MollweidMapProjection<transform>
 ::SetParameters(double falseEasting, double falseNorthing)
 {
diff --git a/Code/Projections/otbSVY21MapProjection.h b/Code/Projections/otbSVY21MapProjection.h
index bd70feffcf911c0222f03df206906a388d74f8ad..e0276b63a723b33af8b82dd7c104a9e69f4e9b9d 100644
--- a/Code/Projections/otbSVY21MapProjection.h
+++ b/Code/Projections/otbSVY21MapProjection.h
@@ -29,7 +29,7 @@ namespace otb
 * It converts coordinates in longitude, latitude (WGS84) to SVY21 map coordinates.
 *
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT SVY21MapProjection : public TransMercatorMapProjection<transform>
 {
 public:
diff --git a/Code/Projections/otbSVY21MapProjection.txx b/Code/Projections/otbSVY21MapProjection.txx
index eca7df17ebcd5a9b38b4a3be6fb77aab0be2dcaf..a772a1ccaee934576614ea71e9ae64ce143b1035 100644
--- a/Code/Projections/otbSVY21MapProjection.txx
+++ b/Code/Projections/otbSVY21MapProjection.txx
@@ -24,7 +24,7 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 SVY21MapProjection<transform>
 ::SVY21MapProjection()
 {
@@ -45,7 +45,7 @@ SVY21MapProjection<transform>
   this->SetParameters(falseEasting, falseNorthing, scaleFactor);
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 SVY21MapProjection<transform>
 ::~SVY21MapProjection()
 {
diff --git a/Code/Projections/otbSinusoidalMapProjection.h b/Code/Projections/otbSinusoidalMapProjection.h
index e21e657260c1854a536ee49d00a5306d1ae8cb71..29a15f577cf66cc1a5f4144d3796c56365114ced 100644
--- a/Code/Projections/otbSinusoidalMapProjection.h
+++ b/Code/Projections/otbSinusoidalMapProjection.h
@@ -29,7 +29,7 @@ namespace otb
  *  \brief This class implements the Sinusoidal map projection.
  *  It converts coordinates in longitude, latitude (WGS84) to Sinusoidal map coordinates.
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT SinusoidalMapProjection : public MapProjection<ossimSinusoidalProjection, transform>
 {
 public:
diff --git a/Code/Projections/otbSinusoidalMapProjection.txx b/Code/Projections/otbSinusoidalMapProjection.txx
index 558f5eadae214cd164ff5e4f92b5128d7edf7444..a5c9d331ac005117a868ede3837ffd11b6c1a712 100644
--- a/Code/Projections/otbSinusoidalMapProjection.txx
+++ b/Code/Projections/otbSinusoidalMapProjection.txx
@@ -24,20 +24,20 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 SinusoidalMapProjection<transform>
 ::SinusoidalMapProjection()
 {
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 SinusoidalMapProjection<transform>
 ::~SinusoidalMapProjection()
 {
 }
 
 ///Set the false Easting
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void SinusoidalMapProjection<transform>
 ::SetFalseEasting(double falseEasting)
 {
@@ -45,7 +45,7 @@ void SinusoidalMapProjection<transform>
 }
 
 ///Set the False Northing
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void SinusoidalMapProjection<transform>
 ::SetFalseNorthing(double falseNorthing)
 {
@@ -53,7 +53,7 @@ void SinusoidalMapProjection<transform>
 }
 
 ///Set the default parameter
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void SinusoidalMapProjection<transform>
 ::SetDefaults()
 {
@@ -61,7 +61,7 @@ void SinusoidalMapProjection<transform>
 }
 
 ///\return the False Northing (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double SinusoidalMapProjection<transform>
 ::GetFalseNorthing() const
 {
@@ -71,7 +71,7 @@ double SinusoidalMapProjection<transform>
 }
 
 ///\return the False Easting (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double SinusoidalMapProjection<transform>
 ::GetFalseEasting() const
 {
@@ -80,7 +80,7 @@ double SinusoidalMapProjection<transform>
   return falseEasting;
 }
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void SinusoidalMapProjection<transform>
 ::SetParameters(double falseEasting, double falseNorthing)
 {
diff --git a/Code/Projections/otbTileMapTransform.h b/Code/Projections/otbTileMapTransform.h
index 1ffb4c93f6fbc23207b24884d8a7aee9dc2bdc5e..fa2079234da1ac3eae938acb2a71fc4e22ad4b0a 100644
--- a/Code/Projections/otbTileMapTransform.h
+++ b/Code/Projections/otbTileMapTransform.h
@@ -43,7 +43,7 @@ namespace otb
  *  \brief to do
  **/
 
-template <InverseOrForwardTransformationEnum TTransformDirection,
+template <Transform::TransformationDirection TTransformDirection,
     class TScalarType = double,
     unsigned int NInputDimensions = 2,
     unsigned int NOutputDimensions = 2>
@@ -70,9 +70,8 @@ public:
   /** Run-time type information (and related methods). */
   itkTypeMacro(TileMapTransform, Transform);
 
-  typedef InverseOrForwardTransformationEnum DirectionOfMappingEnumType;
+  static const Transform::TransformationDirection DirectionOfMapping = TTransformDirection;
 
-  itkStaticConstMacro(DirectionOfMapping, DirectionOfMappingEnumType, TTransformDirection);
   itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions);
   itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions);
   itkStaticConstMacro(SpaceDimension, unsigned int, NInputDimensions);
diff --git a/Code/Projections/otbTileMapTransform.txx b/Code/Projections/otbTileMapTransform.txx
index 0ba9b342fbb90281b5d9db452f06a477e0230030..2ea278aa3443d3315ba8fc7519af3ea6764b5dd6 100644
--- a/Code/Projections/otbTileMapTransform.txx
+++ b/Code/Projections/otbTileMapTransform.txx
@@ -24,7 +24,7 @@
 namespace otb
 {
 
-template<InverseOrForwardTransformationEnum TTransformDirection, class TScalarType,
+template<Transform::TransformationDirection TTransformDirection, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
 ::TileMapTransform() : Superclass(SpaceDimension, ParametersDimension)
@@ -32,7 +32,7 @@ TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDime
   m_TileMapTransform =  new OssimTileMapTransformType();
 }
 
-template<InverseOrForwardTransformationEnum TTransformDirection, class TScalarType,
+template<Transform::TransformationDirection TTransformDirection, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
 ::~TileMapTransform()
@@ -40,7 +40,7 @@ TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDime
   delete m_TileMapTransform;
 }
 
-template<InverseOrForwardTransformationEnum TTransformDirection, class TScalarType,
+template<Transform::TransformationDirection TTransformDirection, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 typename TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>::OutputPointType
 TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
@@ -48,7 +48,7 @@ TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDime
 {
   OutputPointType outputPoint;
 
-  if (DirectionOfMapping == INVERSE)
+  if (DirectionOfMapping == Transform::INVERSE)
     {
 //         otbMsgDevMacro(<< "Cartographic coordinates: (" << point[0] << "," << point[1] << ")");
 
@@ -65,7 +65,7 @@ TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDime
     outputPoint[1] = ossimGPoint.lat;
 //         otbMsgDevMacro(<< "Geographic coordinates (long/lat) : (" << outputPoint[0] << "," << outputPoint[1] << ")");
     }
-  if (DirectionOfMapping == FORWARD)
+  if (DirectionOfMapping == Transform::FORWARD)
     {
 //         otbMsgDevMacro(<< "Geographic coordinates (long/lat) : (" << point[1] << "," << point[0] << ")");
     //from "itk::point" to "ossim::ossimGpt"
@@ -88,7 +88,7 @@ TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDime
 }
 
 ///\return The geographic point corresponding to (0, 0)
-template<InverseOrForwardTransformationEnum TTransformDirection, class TScalarType,
+template<Transform::TransformationDirection TTransformDirection, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 typename TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>::InputPointType
 TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
@@ -102,7 +102,7 @@ TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDime
   return otbOrigin;
 }
 
-template<InverseOrForwardTransformationEnum TTransformDirection, class TScalarType,
+template<Transform::TransformationDirection TTransformDirection, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void
 TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
@@ -111,7 +111,7 @@ TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDime
   std::cout << m_TileMapTransform->print(std::cout);
 }
 
-template<InverseOrForwardTransformationEnum TTransformDirection, class TScalarType,
+template<Transform::TransformationDirection TTransformDirection, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 void TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
 ::SetLevel(unsigned int level)
@@ -119,7 +119,7 @@ void TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutpu
   m_TileMapTransform->setDepth(level);
 }
 
-template<InverseOrForwardTransformationEnum TTransformDirection, class TScalarType,
+template<Transform::TransformationDirection TTransformDirection, class TScalarType,
     unsigned int NInputDimensions, unsigned int NOutputDimensions>
 unsigned int TileMapTransform<TTransformDirection, TScalarType, NInputDimensions, NOutputDimensions>
 ::GetLevel() const
diff --git a/Code/Projections/otbTransMercatorMapProjection.h b/Code/Projections/otbTransMercatorMapProjection.h
index 8567d3fc71369ccaa0d9c3b7dcf98b0350708653..1f36d43020b2dee4f9390668be573783fafe6cc0 100644
--- a/Code/Projections/otbTransMercatorMapProjection.h
+++ b/Code/Projections/otbTransMercatorMapProjection.h
@@ -29,7 +29,7 @@ namespace otb
  * It converts coordinates in longitude, latitude (WGS84) to TransMercator map coordinates.
  *
  */
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 class ITK_EXPORT TransMercatorMapProjection : public MapProjection<ossimTransMercatorProjection, transform>
 {
 public:
diff --git a/Code/Projections/otbTransMercatorMapProjection.txx b/Code/Projections/otbTransMercatorMapProjection.txx
index bdecfc31c6947167f2f8d415fab53a10574ad31e..89fdda2bdd9e969ba86c3c8f70f847837f1ba282 100644
--- a/Code/Projections/otbTransMercatorMapProjection.txx
+++ b/Code/Projections/otbTransMercatorMapProjection.txx
@@ -23,7 +23,7 @@
 namespace otb
 {
 
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 TransMercatorMapProjection<transform>
 ::TransMercatorMapProjection()
 {
@@ -34,14 +34,14 @@ TransMercatorMapProjection<transform>
 }
 
 /// Desctructor
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 TransMercatorMapProjection<transform>
 ::~TransMercatorMapProjection()
 {
 }
 
 ///Set the false Easting
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void TransMercatorMapProjection<transform>
 ::SetFalseEasting(double falseEasting)
 {
@@ -49,7 +49,7 @@ void TransMercatorMapProjection<transform>
 }
 
 ///Set the False Northing
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void TransMercatorMapProjection<transform>
 ::SetFalseNorthing(double falseNorthing)
 {
@@ -57,7 +57,7 @@ void TransMercatorMapProjection<transform>
 }
 
 ///Set the scale factor
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void TransMercatorMapProjection<transform>
 ::SetScaleFactor(double scaleFactor)
 {
@@ -65,7 +65,7 @@ void TransMercatorMapProjection<transform>
 }
 
 ///Set the parameters
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void TransMercatorMapProjection<transform>
 ::SetParameters(double falseEasting, double falseNorthing, double scaleFactor)
 {
@@ -73,7 +73,7 @@ void TransMercatorMapProjection<transform>
 }
 
 ///Set the default parameters
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 void TransMercatorMapProjection<transform>
 ::SetDefaults()
 {
@@ -81,7 +81,7 @@ void TransMercatorMapProjection<transform>
 }
 
 ///\return the scale factor
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double TransMercatorMapProjection<transform>
 ::GetScaleFactor() const
 {
@@ -92,7 +92,7 @@ double TransMercatorMapProjection<transform>
 }
 
 ///\return the false northing (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double TransMercatorMapProjection<transform>
 ::GetFalseNorthing() const
 {
@@ -102,7 +102,7 @@ double TransMercatorMapProjection<transform>
 }
 
 ///\return the false easting (avoid negative coordinates)
-template <InverseOrForwardTransformationEnum transform>
+template <Transform::TransformationDirection transform>
 double TransMercatorMapProjection<transform>
 ::GetFalseEasting() const
 {
diff --git a/Code/Projections/otbUtmMapProjection.h b/Code/Projections/otbUtmMapProjection.h
index 78133542761c7acdbb41f2d9da0d438516b26ce8..0b0b3d7d6d7436a1d6a44012b6b194dce542810a 100644
--- a/Code/Projections/otbUtmMapProjection.h
+++ b/Code/Projections/otbUtmMapProjection.h
@@ -29,7 +29,7 @@ namespace otb
  * It converts coordinates in longitude, latitude (WGS84) to UTM map coordinates.
  *
  */
-template <InverseOrForwardTransformationEnum TTransform>
+template <Transform::TransformationDirection TTransform>
 class ITK_EXPORT UtmMapProjection : public MapProjection<ossimUtmProjection, TTransform>
 {
 public:
diff --git a/Code/Projections/otbUtmMapProjection.txx b/Code/Projections/otbUtmMapProjection.txx
index 50d72ff3952f4f580832a469a0bef60a06b4fcc8..91cc15f56ef4013e615232f068e58cc348b8dbd2 100644
--- a/Code/Projections/otbUtmMapProjection.txx
+++ b/Code/Projections/otbUtmMapProjection.txx
@@ -25,7 +25,7 @@ namespace otb
 {
 
 ///Set the zone
-template <InverseOrForwardTransformationEnum TTransform>
+template <Transform::TransformationDirection TTransform>
 void UtmMapProjection<TTransform>
 ::SetZone(long zone)
 {
@@ -34,7 +34,7 @@ void UtmMapProjection<TTransform>
 }
 
 ///Set the hemisphere
-template <InverseOrForwardTransformationEnum TTransform>
+template <Transform::TransformationDirection TTransform>
 void UtmMapProjection<TTransform>
 ::SetHemisphere(char hemisphere)
 {
@@ -42,7 +42,7 @@ void UtmMapProjection<TTransform>
   this->Modified();
 }
 
-template <InverseOrForwardTransformationEnum TTransform>
+template <Transform::TransformationDirection TTransform>
 void UtmMapProjection<TTransform>
 ::SetZoneAndHemisphereFromGeoPoint(const InputPointType& geoPoint)
 {
@@ -57,7 +57,7 @@ void UtmMapProjection<TTransform>
 }
 
 ///\return the zone
-template <InverseOrForwardTransformationEnum TTransform>
+template <Transform::TransformationDirection TTransform>
 int UtmMapProjection<TTransform>
 ::GetZone() const
 {
@@ -67,7 +67,7 @@ int UtmMapProjection<TTransform>
 }
 
 ///\return the hemisphere
-template <InverseOrForwardTransformationEnum TTransform>
+template <Transform::TransformationDirection TTransform>
 const char UtmMapProjection<TTransform>
 ::GetHemisphere() const
 {
@@ -76,7 +76,7 @@ const char UtmMapProjection<TTransform>
   return hemisphere;
 }
 
-template <InverseOrForwardTransformationEnum TTransform>
+template <Transform::TransformationDirection TTransform>
 int UtmMapProjection<TTransform>
 ::GetZoneFromGeoPoint(const InputPointType& geoPoint) const
 {
diff --git a/Examples/Projections/MapProjectionExample.cxx b/Examples/Projections/MapProjectionExample.cxx
index a72eafebbc57527a1774eb6ead85ccd565ce29b1..980cb82b6acdf1a18177fb24ec6e0ebce96751d7 100644
--- a/Examples/Projections/MapProjectionExample.cxx
+++ b/Examples/Projections/MapProjectionExample.cxx
@@ -173,7 +173,7 @@ int main(int argc, char* argv[])
   // Software Guide : EndLatex
 
   // Software Guide : BeginCodeSnippet
-  typedef otb::GenericMapProjection<otb::FORWARD> GenericMapProjection;
+  typedef otb::GenericMapProjection<otb::Transform::FORWARD> GenericMapProjection;
   GenericMapProjection::Pointer genericMapProjection =
     GenericMapProjection::New();
   genericMapProjection->SetWkt(projectionRefWkt);
diff --git a/Testing/Code/IO/otbTileMapWriter.cxx b/Testing/Code/IO/otbTileMapWriter.cxx
index 7b7531f17908ba7dbc64fc953cece0537f9800af..7a130629bad481d3f43de67b281569012609b5b8 100644
--- a/Testing/Code/IO/otbTileMapWriter.cxx
+++ b/Testing/Code/IO/otbTileMapWriter.cxx
@@ -58,7 +58,7 @@ int otbTileMapWriter(int argc, char *argv[])
   VectorReaderType::Pointer readerXS = VectorReaderType::New();
   readerXS->SetFileName(argv[1]);
 
-  typedef otb::TileMapTransform<otb::INVERSE> MapProjectionType;
+  typedef otb::TileMapTransform<otb::Transform::INVERSE> MapProjectionType;
   typedef otb::OrthoRectificationFilter
   <ImageType, DoubleImageType, MapProjectionType> OrthoRectifFilterType;
   typedef otb::ImageFileWriter<CharVectorImageType> WriterType;
@@ -93,7 +93,7 @@ int otbTileMapWriter(int argc, char *argv[])
   lonLatUL[0] = 51.15; //Tests Iran spot5
   lonLatUL[1] = 35.9;
 
-  typedef otb::TileMapTransform<otb::FORWARD> MapProjectionForwardType;
+  typedef otb::TileMapTransform<otb::Transform::FORWARD> MapProjectionForwardType;
   MapProjectionForwardType::Pointer mapProjectionForward = MapProjectionForwardType::New();
   mapProjectionForward->SetLevel(depth);
   PointType pointULexact;
diff --git a/Testing/Code/Projections/otbGenericMapProjection.cxx b/Testing/Code/Projections/otbGenericMapProjection.cxx
index c115cf4f8efdbd2eb77096a517bc896290217730..58386ef17738f18bb79cae66eeca6b4982b94a97 100644
--- a/Testing/Code/Projections/otbGenericMapProjection.cxx
+++ b/Testing/Code/Projections/otbGenericMapProjection.cxx
@@ -32,7 +32,7 @@ int otbGenericMapProjection(int argc, char* argv[])
   std::string projectionRefWkt =
     "PROJCS[\"UTM Zone 31, Northern Hemisphere\", GEOGCS[\"WGS 84\", DATUM[\"WGS_1984\", SPHEROID[\"WGS 84\", 6378137, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]], TOWGS84[0, 0, 0, 0, 0, 0, 0], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.0174532925199433, AUTHORITY[\"EPSG\",\"9108\"]], AXIS[\"Lat\", NORTH], AXIS[\"Long\", EAST], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin\", 0], PARAMETER[\"central_meridian\", 3], PARAMETER[\"scale_factor\", 0.9996], PARAMETER[\"false_easting\", 500000], PARAMETER[\"false_northing\", 0], UNIT[\"Meter\", 1]]";
 
-  typedef otb::GenericMapProjection<otb::FORWARD> GenericMapProjection;
+  typedef otb::GenericMapProjection<otb::Transform::FORWARD> GenericMapProjection;
   GenericMapProjection::Pointer genericMapProjection = GenericMapProjection::New();
   genericMapProjection->SetWkt(projectionRefWkt);
   file << genericMapProjection->GetWkt() << std::endl << std::endl;
@@ -45,7 +45,7 @@ int otbGenericMapProjection(int argc, char* argv[])
   file << genericMapProjection->TransformPoint(point);
   file << std::endl << std::endl;
 
-  typedef otb::GenericMapProjection<otb::INVERSE> GenericMapProjectionInverse;
+  typedef otb::GenericMapProjection<otb::Transform::INVERSE> GenericMapProjectionInverse;
   GenericMapProjectionInverse::Pointer genericMapProjectionInverse = GenericMapProjectionInverse::New();
   genericMapProjectionInverse->SetWkt(projectionRefWkt);
   file << genericMapProjectionInverse->GetWkt() << std::endl << std::endl;
diff --git a/Testing/Code/Projections/otbGenericMapProjectionNew.cxx b/Testing/Code/Projections/otbGenericMapProjectionNew.cxx
index 95d90d57eca8232a8b1a97b10b7ba413df58c2d6..d8184e90628853bb5bd7b0f47fd46dc9de4cd6c3 100644
--- a/Testing/Code/Projections/otbGenericMapProjectionNew.cxx
+++ b/Testing/Code/Projections/otbGenericMapProjectionNew.cxx
@@ -28,7 +28,7 @@
 int otbGenericMapProjectionNew(int argc, char* argv[])
 {
 
-  typedef otb::GenericMapProjection<otb::FORWARD> MapProjectionType;
+  typedef otb::GenericMapProjection<otb::Transform::FORWARD> MapProjectionType;
   MapProjectionType::Pointer mapProjection = MapProjectionType::New();
 
   std::cout << mapProjection << std::endl;
diff --git a/Testing/Code/Projections/otbGeocentricTransform.cxx b/Testing/Code/Projections/otbGeocentricTransform.cxx
index 68b94e79036c7126dd4c694bc52d2e3549b73d21..c52dc2da88f781e4710f28971d6a25d7ac2e1c5f 100644
--- a/Testing/Code/Projections/otbGeocentricTransform.cxx
+++ b/Testing/Code/Projections/otbGeocentricTransform.cxx
@@ -29,7 +29,7 @@ int otbGeocentricTransform(int argc, char* argv[])
   std::ofstream file;
   file.open(outFileName);
 
-  typedef otb::GeocentricTransform<otb::FORWARD> ProjectionType;
+  typedef otb::GeocentricTransform<otb::Transform::FORWARD> ProjectionType;
   ProjectionType::Pointer projection = ProjectionType::New();
 
   file << std::setprecision(15);
@@ -52,7 +52,7 @@ int otbGeocentricTransform(int argc, char* argv[])
   file << projection->TransformPoint(point);
   file << std::endl << std::endl;
 
-  typedef otb::GeocentricTransform<otb::INVERSE> InverseProjectionType;
+  typedef otb::GeocentricTransform<otb::Transform::INVERSE> InverseProjectionType;
   InverseProjectionType::Pointer inverseProjection = InverseProjectionType::New();
 
   file << "Inverse projection: " << std::endl;
diff --git a/Testing/Code/Projections/otbGeocentricTransformNew.cxx b/Testing/Code/Projections/otbGeocentricTransformNew.cxx
index 859326de1a329c83ad18c12579849ef6ced4df9e..736487e36ce9b674a6d4810f862d7b81116a21e3 100644
--- a/Testing/Code/Projections/otbGeocentricTransformNew.cxx
+++ b/Testing/Code/Projections/otbGeocentricTransformNew.cxx
@@ -26,7 +26,7 @@
 int otbGeocentricTransformNew(int argc, char* argv[])
 {
 
-  typedef otb::GeocentricTransform<otb::FORWARD> ProjectionType;
+  typedef otb::GeocentricTransform<otb::Transform::FORWARD> ProjectionType;
   ProjectionType::Pointer projection = ProjectionType::New();
 
   std::cout << projection << std::endl;
diff --git a/Testing/Code/Projections/otbTileMapTransform.cxx b/Testing/Code/Projections/otbTileMapTransform.cxx
index ce37c5b3bc5b8916a9b910324dd66a9b28752048..30b9d77671edb34d2ef1036cbf5b9e7784bbd6ec 100644
--- a/Testing/Code/Projections/otbTileMapTransform.cxx
+++ b/Testing/Code/Projections/otbTileMapTransform.cxx
@@ -25,7 +25,7 @@ int otbTileMapTransform(int argc, char* argv[])
   std::ofstream file;
   file.open(outFileName);
 
-  typedef otb::TileMapTransform<otb::FORWARD> ProjectionType;
+  typedef otb::TileMapTransform<otb::Transform::FORWARD> ProjectionType;
   ProjectionType::Pointer projection = ProjectionType::New();
   projection->SetLevel(10);
 
@@ -46,7 +46,7 @@ int otbTileMapTransform(int argc, char* argv[])
   file << projection->TransformPoint(point);
   file << std::endl << std::endl;
 
-  typedef otb::TileMapTransform<otb::INVERSE> InverseProjectionType;
+  typedef otb::TileMapTransform<otb::Transform::INVERSE> InverseProjectionType;
   InverseProjectionType::Pointer inverseProjection = InverseProjectionType::New();
   inverseProjection->SetLevel(10);