Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.cpp	(revision 1984)
@@ -555,5 +555,5 @@
    * Go through the hierarchy to find the axis from which the transformations must be inherited
    */
-  void CAxis::solveInheritanceTransformation()
+  void CAxis::solveInheritanceTransformation_old()
   TRY
   {
@@ -572,4 +572,41 @@
       for (size_t i = 0; i < refAxis.size(); ++i)
         refAxis[i]->setTransformations(axis->getAllTransformations());
+  }
+  CATCH_DUMP_ATTR
+
+  void CAxis::solveInheritanceTransformation()
+  TRY
+  {
+    if (solveInheritanceTransformation_done_) return;
+    else solveInheritanceTransformation_done_=true ;
+
+    CAxis* axis = this;
+    std::list<CAxis*> refAxis;
+    bool out=false ;
+    vector<StdString> excludedAttr;
+    excludedAttr.push_back("axis_ref");
+    
+    refAxis.push_front(axis) ;
+    while (axis->hasDirectAxisReference() && !out)
+    {
+      CAxis* lastAxis=axis ;
+      axis = axis->getDirectAxisReference();
+      axis->solveRefInheritance() ;
+      if (!axis->SuperClass::isEqual(lastAxis,excludedAttr)) out=true ;
+      refAxis.push_front(axis) ;
+    }
+
+    CTransformationPaths::TPath path ;
+    auto& pathList = std::get<2>(path) ;
+    std::get<0>(path) = EElement::AXIS ;
+    std::get<1>(path) = refAxis.front()->getId() ;
+    for (auto& axis : refAxis)
+    {
+      CAxis::TransMapTypes transformations = axis->getAllTransformations();
+      for(auto& transformation : transformations) pathList.push_back({transformation.second->getTransformationType(), 
+                                                                      transformation.second->getId()}) ;
+    }
+    transformationPaths_.addPath(path) ;
+
   }
   CATCH_DUMP_ATTR
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp	(revision 1984)
@@ -16,4 +16,5 @@
 #include "transformation.hpp"
 #include "transformation_enum.hpp"
+#include "transformation_path.hpp"
 #include "element.hpp"
 #include "local_connector.hpp"
@@ -21,7 +22,9 @@
 #include "gatherer_connector.hpp"
 #include "distribution_type.hpp"
-
-
-namespace xios {
+#include "generic_algorithm_transformation.hpp"
+
+
+namespace xios
+{
    /// ////////////////////// DÃ©clarations ////////////////////// ///
 
@@ -57,5 +60,4 @@
          typedef CAxisAttributes RelAttributes;
          typedef CAxisGroup      RelGroup;
-         typedef CTransformation<CAxis>::TransformationMapTypes TransMapTypes;
 
       public:
@@ -79,5 +81,5 @@
          bool isDistributed(void) const;
         
-        public:
+      public:
         /*!
             \brief return if the axis can be written or not in a compressed way.
@@ -86,10 +88,10 @@
          */ 
          bool isCompressible(void) { if (!isCompressibleComputed_) computeIsCompressible() ; return isCompressible_ ;} 
-        private:
+      private:
          bool isCompressible_ ; /** specify if the domain can be written in a compressed way */ 
          bool isCompressibleComputed_=false ; /** Indicate if compressability has been computed*/
          void computeIsCompressible() ;
         
-        public:
+      public:
 
          /// Mutateur ///
@@ -119,9 +121,38 @@
          size_t getGlobalWrittenSize(void) ;
 
-         bool hasTransformation();
-         void solveInheritanceTransformation();
-         TransMapTypes getAllTransformations();         
-         void duplicateTransformation(CAxis*);
-         CTransformation<CAxis>* addTransformation(ETranformationType transType, const StdString& id="");
+      //////////////////////////
+      ///// transformations ////
+      //////////////////////////
+      public:
+        typedef CTransformation<CAxis>::TransformationMapTypes TransMapTypes;
+      private:
+        static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m);
+        static std::map<StdString, ETranformationType> transformationMapList_;
+        static bool dummyTransformationMapList_;
+        TransMapTypes transformationMap_;         
+
+      public:
+        CTransformation<CAxis>* addTransformation(ETranformationType transType, const StdString& id="");
+        CTransformation<CAxis>* addTransformation(ETranformationType transType, CTransformation<CAxis>* transformation) ;
+        void setTransformations(const TransMapTypes&);         
+        void duplicateTransformation(CAxis*);
+        TransMapTypes getAllTransformations();
+        bool hasTransformation();
+        void solveInheritanceTransformation_old(); // to remove later
+        void solveInheritanceTransformation();
+      private:
+        bool solveInheritanceTransformation_done_= false ;
+      private:
+        CGenericAlgorithmTransformation* transformationAlgorithm_ = nullptr ;
+      public:
+        void setTransformationAlgorithm(CGenericAlgorithmTransformation* transformationAlgorithm) { transformationAlgorithm=transformationAlgorithm ;}
+        CGenericAlgorithmTransformation* getTransformationAlgorithm(void) { return transformationAlgorithm_ ;}   
+      private:
+        CTransformationPaths transformationPaths_ ;
+      public:
+        CTransformationPaths getTransformationPaths(void) {return transformationPaths_;} 
+        void setTransformationPaths(const CTransformationPaths& transformationPaths) { transformationPaths_=transformationPaths ;}
+
+      ////////////////////////////
          bool isEqual(CAxis* axis);
 
@@ -131,5 +162,5 @@
         bool hasLabel;
 
-       private:
+      private:
          void checkData();
          void checkMask();
@@ -145,6 +176,4 @@
          void makeAliasForCoupling(const string& fieldId, int posInGrid) ;
 
-      private:
-         void setTransformations(const TransMapTypes&);
 
       private:
@@ -177,14 +206,6 @@
          bool isChecked;
          std::set<StdString> relFiles, relFilesCompressed;
-         TransMapTypes transformationMap_;         
-
-         std::map<int, std::unordered_map<int, vector<size_t> > > indSrv_; // Global index of each client sent to server
+          std::map<int, std::unordered_map<int, vector<size_t> > > indSrv_; // Global index of each client sent to server
          std::map<int, std::vector<int> > connectedServerRank_;
-
-       private:
-         static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m);
-         static std::map<StdString, ETranformationType> transformationMapList_;
-         static bool dummyTransformationMapList_;
-
 
        //////////////////////////////////////////////////////////////////////////////////////
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/compute_connectivity_domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/compute_connectivity_domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/compute_connectivity_domain.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CComputeConnectivityDomain::registerTrans()
   {
-    registerTransformation(TRANS_COMPUTE_CONNECTIVITY_DOMAIN, CComputeConnectivityDomain::create);
+    registerTransformation(TRANS_COMPUTE_CONNECTIVITY_DOMAIN, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/compute_connectivity_domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/compute_connectivity_domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/compute_connectivity_domain.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CComputeConnectivityDomain> SuperClass;
       typedef CComputeConnectivityDomainAttributes SuperClassAttribute;
+      typedef CComputeConnectivityDomain MyClass ;
+      typedef CTransformation<CDomain> SuperTransform ;
 
     public :
@@ -56,9 +58,14 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_COMPUTE_CONNECTIVITY_DOMAIN ;}
+      static CTransformation<CDomain>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
       static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node);
       static bool _dummyRegistered;
-  }; // class CComputeConnectivityDomain
+    public:
+   }; // class CComputeConnectivityDomain
 
   DECLARE_GROUP(CComputeConnectivityDomain);
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.cpp	(revision 1984)
@@ -1302,20 +1302,4 @@
    CATCH_DUMP_ATTR
 
-   void CContext::buildFilterGraphOfEnabledFields()
-   TRY
-   {
-     int size = this->enabledFiles.size();
-     for (int i = 0; i < size; ++i)
-     {
-       this->enabledFiles[i]->buildFilterGraphOfEnabledFields(garbageCollector);
-     }
-
-     size = this->enabledCouplerOut.size();
-     for (int i = 0; i < size; ++i)
-     {
-       this->enabledCouplerOut[i]->buildFilterGraphOfEnabledFields(garbageCollector);
-     }
-   }
-   CATCH_DUMP_ATTR
 
    void CContext::postProcessFilterGraph()
@@ -1380,20 +1364,5 @@
   CATCH_DUMP_ATTR
 
-  void CContext::solveAllRefOfFieldsWithReadAccess()
-  TRY
-  {
-    for (size_t i = 0; i < fieldsWithReadAccess_.size(); ++i)
-      fieldsWithReadAccess_[i]->solveAllReferenceEnabledField(false);
-  }
-  CATCH_DUMP_ATTR
-
-  void CContext::buildFilterGraphOfFieldsWithReadAccess()
-  TRY
-  {
-    for (size_t i = 0; i < fieldsWithReadAccess_.size(); ++i)
-      fieldsWithReadAccess_[i]->buildFilterGraph(garbageCollector, true);
-  }
-  CATCH_DUMP_ATTR
-
+  
    void CContext::solveAllInheritance(bool apply)
    TRY
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.hpp	(revision 1984)
@@ -139,5 +139,4 @@
          void prepareTimeseries(void);
          void solveOnlyRefOfEnabledFields(void);         
-         void buildFilterGraphOfEnabledFields();
          void postProcessFilterGraph();
          void startPrefetchingOfEnabledReadModeFiles();
@@ -145,6 +144,4 @@
          void doPostTimestepOperationsForEnabledReadModeFiles();
          void findFieldsWithReadAccess(void);
-         void solveAllRefOfFieldsWithReadAccess();
-         void buildFilterGraphOfFieldsWithReadAccess();
          void triggerLateFields(void) ;
          void solveAllRefOfEnabledFieldsAndTransform(void);
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.cpp	(revision 1984)
@@ -1,4 +1,3 @@
 #include "domain.hpp"
-
 #include "attribute_template.hpp"
 #include "object_template.hpp"
@@ -25,4 +24,5 @@
 #include "grid_scatterer_connector.hpp"
 #include "grid_gatherer_connector.hpp"
+#include "transformation_path.hpp"
 
 
@@ -77,20 +77,4 @@
      CDomain* domain = CDomainGroup::get("domain_definition")->createChild();
      return domain;
-   }
-   CATCH
-
-   std::map<StdString, ETranformationType> CDomain::transformationMapList_ = std::map<StdString, ETranformationType>();
-   bool CDomain::_dummyTransformationMapList = CDomain::initializeTransformationMap(CDomain::transformationMapList_);
-
-   bool CDomain::initializeTransformationMap(std::map<StdString, ETranformationType>& m)
-   TRY
-   {
-     m["zoom_domain"] = TRANS_ZOOM_DOMAIN;
-     m["interpolate_domain"] = TRANS_INTERPOLATE_DOMAIN;
-     m["generate_rectilinear_domain"] = TRANS_GENERATE_RECTILINEAR_DOMAIN;
-     m["compute_connectivity_domain"] = TRANS_COMPUTE_CONNECTIVITY_DOMAIN;
-     m["expand_domain"] = TRANS_EXPAND_DOMAIN;
-     m["reorder_domain"] = TRANS_REORDER_DOMAIN;
-     m["extract_domain"] = TRANS_EXTRACT_DOMAIN;
    }
    CATCH
@@ -2179,5 +2163,25 @@
   CATCH_DUMP_ATTR
 
- 
+/////////////////////////////////////////////////////////////////////////
+///////////////             TRANSFORMATIONS                    //////////
+/////////////////////////////////////////////////////////////////////////
+
+  std::map<StdString, ETranformationType> CDomain::transformationMapList_ = std::map<StdString, ETranformationType>();
+  bool CDomain::dummyTransformationMapList_ = CDomain::initializeTransformationMap(CDomain::transformationMapList_);
+
+  bool CDomain::initializeTransformationMap(std::map<StdString, ETranformationType>& m)
+  TRY
+  {
+    m["zoom_domain"] = TRANS_ZOOM_DOMAIN;
+    m["interpolate_domain"] = TRANS_INTERPOLATE_DOMAIN;
+    m["generate_rectilinear_domain"] = TRANS_GENERATE_RECTILINEAR_DOMAIN;
+    m["compute_connectivity_domain"] = TRANS_COMPUTE_CONNECTIVITY_DOMAIN;
+    m["expand_domain"] = TRANS_EXPAND_DOMAIN;
+    m["reorder_domain"] = TRANS_REORDER_DOMAIN;
+    m["extract_domain"] = TRANS_EXTRACT_DOMAIN;
+  }
+  CATCH
+
+
   CTransformation<CDomain>* CDomain::addTransformation(ETranformationType transType, const StdString& id)
   TRY
@@ -2188,4 +2192,11 @@
   CATCH_DUMP_ATTR
 
+  CTransformation<CDomain>* CDomain::addTransformation(ETranformationType transType, CTransformation<CDomain>* transformation)
+  TRY
+  {
+    transformationMap_.push_back(std::make_pair(transType, transformation));
+    return transformationMap_.back().second;
+  }
+  CATCH_DUMP_ATTR
   /*!
     Check whether a domain has transformation
@@ -2234,5 +2245,5 @@
    * Go through the hierarchy to find the domain from which the transformations must be inherited
    */
-  void CDomain::solveInheritanceTransformation()
+  void CDomain::solveInheritanceTransformation_old()
   TRY
   {
@@ -2253,4 +2264,46 @@
   }
   CATCH_DUMP_ATTR
+
+
+  void CDomain::solveInheritanceTransformation()
+  TRY
+  {
+    if (solveInheritanceTransformation_done_) return;
+    else solveInheritanceTransformation_done_=true ;
+
+    CDomain* domain = this;
+    CDomain* Lastdomain ;
+    std::list<CDomain*> refDomains;
+    bool out=false ;
+    vector<StdString> excludedAttr;
+    excludedAttr.push_back("domain_ref");
+    
+    refDomains.push_front(domain) ;
+    while (domain->hasDirectDomainReference() && !out)
+    {
+      CDomain* lastDomain=domain ;
+      domain = domain->getDirectDomainReference();
+      domain->solveRefInheritance() ;
+      if (!domain->SuperClass::isEqual(lastDomain,excludedAttr)) out=true ;
+      refDomains.push_front(domain) ;
+    }
+
+    CTransformationPaths::TPath path ;
+    auto& pathList = std::get<2>(path) ;
+    std::get<0>(path) = EElement::DOMAIN ;
+    std::get<1>(path) = refDomains.front()->getId() ;
+    for (auto& domain : refDomains)
+    {
+      CDomain::TransMapTypes transformations = domain->getAllTransformations();
+      for(auto& transformation : transformations) pathList.push_back({transformation.second->getTransformationType(), 
+                                                                      transformation.second->getId()}) ;
+    }
+    transformationPaths_.addPath(path) ;
+
+  }
+  CATCH_DUMP_ATTR
+  
+/////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////// 
 
   void CDomain::setContextClient(CContextClient* contextClient)
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.hpp	(revision 1984)
@@ -16,4 +16,5 @@
 #include "transformation.hpp"
 #include "transformation_enum.hpp"
+#include "transformation_path.hpp"
 #include "server_distribution_description.hpp"
 #include "mesh.hpp"
@@ -23,7 +24,9 @@
 #include "gatherer_connector.hpp"
 #include "distribution_type.hpp"
-
-
-namespace xios {
+#include "generic_algorithm_transformation.hpp"
+
+
+namespace xios
+{
 
    /// ////////////////////// DÃ©clarations ////////////////////// ///
@@ -61,6 +64,5 @@
          typedef CDomainAttributes RelAttributes;
          typedef CDomainGroup      RelGroup;
-         typedef CTransformation<CDomain>::TransformationMapTypes TransMapTypes;
-
+         
          /// Constructeurs ///
          CDomain(void);
@@ -82,10 +84,41 @@
          bool checkAttributes_done_ = false ;
 
-         bool hasTransformation();
-         void solveInheritanceTransformation();
-         TransMapTypes getAllTransformations();
+         
+      //////////////////////////
+      ///// transformations ////
+      //////////////////////////
+      public:
+        typedef CTransformation<CDomain>::TransformationMapTypes TransMapTypes;
+      private:
+        static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m);
+        static std::map<StdString, ETranformationType> transformationMapList_;
+        static bool dummyTransformationMapList_;
+        TransMapTypes transformationMap_;         
+
+      public:
+        CTransformation<CDomain>* addTransformation(ETranformationType transType, const StdString& id="");
+        CTransformation<CDomain>* addTransformation(ETranformationType transType, CTransformation<CDomain>* transformation) ;
+        void setTransformations(const TransMapTypes&);         
+        void duplicateTransformation(CDomain*);
+        TransMapTypes getAllTransformations();
+        bool hasTransformation();
+        void solveInheritanceTransformation_old(); // to remove later
+        void solveInheritanceTransformation();
+      private:
+        bool solveInheritanceTransformation_done_= false ;
+      private:
+        CGenericAlgorithmTransformation* transformationAlgorithm_ = nullptr ;
+      public:
+        void setTransformationAlgorithm(CGenericAlgorithmTransformation* transformationAlgorithm) { transformationAlgorithm_=transformationAlgorithm ;}
+        CGenericAlgorithmTransformation* getTransformationAlgorithm(void) { return transformationAlgorithm_ ;}   
+      private:
+        CTransformationPaths transformationPaths_ ;
+      public:
+        CTransformationPaths getTransformationPaths(void) {return transformationPaths_;} 
+        void setTransformationPaths(const CTransformationPaths& transformationPaths) { transformationPaths_=transformationPaths ;}
+
+      ////////////////////////////
+
          void redistribute(int nbLocalDomain);
-         void duplicateTransformation(CDomain*);
-         CTransformation<CDomain>* addTransformation(ETranformationType transType, const StdString& id="");
 
       public:
@@ -195,7 +228,4 @@
          void checkArea(void);
          void checkLonLat();
-
-         void setTransformations(const TransMapTypes&);         
-         void computeNGlobDomain();
          
        public:
@@ -239,13 +269,7 @@
 
          bool isRedistributed_;
-         TransMapTypes transformationMap_;         
          bool isUnstructed_;
 
        
-       private:
-         static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m);
-         static std::map<StdString, ETranformationType> transformationMapList_;
-         static bool _dummyTransformationMapList;
-
        //////////////////////////////////////////////////////////////////////////////////////
        //  this part is related to distribution, element definition, views and connectors  //
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/duplicate_scalar_to_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/duplicate_scalar_to_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/duplicate_scalar_to_axis.cpp	(revision 1984)
@@ -28,5 +28,5 @@
   bool CDuplicateScalarToAxis::registerTrans()
   {
-    return registerTransformation(TRANS_DUPLICATE_SCALAR_TO_AXIS, CDuplicateScalarToAxis::create);
+    return registerTransformation(TRANS_DUPLICATE_SCALAR_TO_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/duplicate_scalar_to_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/duplicate_scalar_to_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/duplicate_scalar_to_axis.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CDuplicateScalarToAxis> SuperClass;
       typedef CDuplicateScalarToAxisAttributes SuperClassAttribute;
+      typedef CDuplicateScalarToAxis MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_DUPLICATE_SCALAR_TO_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/element_type.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/element_type.hpp	(revision 1984)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/element_type.hpp	(revision 1984)
@@ -0,0 +1,9 @@
+#ifndef __XIOS_ELEMENT_TYPE_HPP__
+#define __XIOS_ELEMENT_TYPE_HPP__
+
+namespace xios
+{
+  enum class EElement { DOMAIN, AXIS, SCALAR} ;   
+}
+
+#endif // __XIOS_ELEMENT_TYPE_HPP__
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/expand_domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/expand_domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/expand_domain.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CExpandDomain::registerTrans()
   {
-    registerTransformation(TRANS_EXPAND_DOMAIN, CExpandDomain::create);
+    registerTransformation(TRANS_EXPAND_DOMAIN, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/expand_domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/expand_domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/expand_domain.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CExpandDomain> SuperClass;
       typedef CExpandDomainAttributes SuperClassAttribute;
+      typedef CExpandDomain MyClass ;
+      typedef CTransformation<CDomain> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_EXPAND_DOMAIN ;}
+      static CTransformation<CDomain>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis.cpp	(revision 1984)
@@ -26,5 +26,5 @@
   bool CExtractAxis::registerTrans()
   {
-    return registerTransformation(TRANS_EXTRACT_AXIS, CExtractAxis::create);
+    return registerTransformation(TRANS_EXTRACT_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CExtractAxis> SuperClass;
       typedef CExtractAxisAttributes SuperClassAttribute;
+      typedef CExtractAxis MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_EXTRACT_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis_to_scalar.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis_to_scalar.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis_to_scalar.cpp	(revision 1984)
@@ -28,5 +28,5 @@
   bool CExtractAxisToScalar::registerTrans()
   {
-    return registerTransformation(TRANS_EXTRACT_AXIS_TO_SCALAR, CExtractAxisToScalar::create);
+    return registerTransformation(TRANS_EXTRACT_AXIS_TO_SCALAR, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis_to_scalar.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis_to_scalar.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_axis_to_scalar.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CExtractAxisToScalar> SuperClass;
       typedef CExtractAxisToScalarAttributes SuperClassAttribute;
+      typedef CExtractAxisToScalar MyClass ;
+      typedef CTransformation<CScalar> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_EXTRACT_AXIS_TO_SCALAR ;}
+      static CTransformation<CScalar>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CExtractDomain::registerTrans()
   {
-    registerTransformation(TRANS_EXTRACT_DOMAIN, CExtractDomain::create);
+    registerTransformation(TRANS_EXTRACT_DOMAIN, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CExtractDomain> SuperClass;
       typedef CExtractDomainAttributes SuperClassAttribute;
+      typedef CExtractDomain MyClass ;
+      typedef CTransformation<CDomain> SuperTransform ;
 
     public :
@@ -56,8 +58,12 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
-    private:
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_EXTRACT_DOMAIN ;}
+      static CTransformation<CDomain>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
+     private:
       static bool registerTrans();
       static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node);
-      static bool _dummyRegistered;
+     static bool _dummyRegistered;
   }; // class CExtractDomain
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain_to_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain_to_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain_to_axis.cpp	(revision 1984)
@@ -28,5 +28,5 @@
   bool CExtractDomainToAxis::registerTrans()
   {
-    return registerTransformation(TRANS_EXTRACT_DOMAIN_TO_AXIS, CExtractDomainToAxis::create);
+    return registerTransformation(TRANS_EXTRACT_DOMAIN_TO_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain_to_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain_to_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain_to_axis.hpp	(revision 1984)
@@ -41,5 +41,7 @@
       typedef CObjectTemplate<CExtractDomainToAxis> SuperClass;
       typedef CExtractDomainToAxisAttributes SuperClassAttribute;
-
+      typedef CExtractDomainToAxis MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
+ 
     public :
       /// Constructeurs ///
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_EXTRACT_DOMAIN_TO_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 1984)
@@ -766,7 +766,22 @@
 
       CGrid* gridSrc=getDirectFieldReference()->getGrid() ;
+      std::shared_ptr<COutputPin> lastFilter ;
+      if (filterExpr) lastFilter=filterExpr ;
+      else lastFilter = inputFilter ;
+      CGrid* newGrid ;    
+      
       for(auto grid : gridPath)
       {
         grid->solveElementsRefInheritance() ;
+       
+        // new
+        
+        std::pair<std::shared_ptr<CFilter>, std::shared_ptr<CFilter> > filters = grid->buildTransformationGraph(gc, gridSrc, detectMissingValues, defaultValue, newGrid) ;
+        lastFilter->connectOutput(filters.first, 0);
+        lastFilter = filters.second;
+        gridSrc = newGrid ;
+
+        // end new
+/*
         grid->completeGrid(gridSrc); // grid generation, to be checked
         grid->checkElementsAttributes() ;
@@ -775,6 +790,8 @@
           if (!CField::get(fieldId)->buildWorkflowGraph(gc)) return false ;
         gridSrc=grid ;
-      }
-      
+*/
+      }
+
+    /*  
       std::shared_ptr<COutputPin> lastFilter ;
       if (filterExpr) lastFilter=filterExpr ;
@@ -793,4 +810,7 @@
         }
       }
+    */
+      grid_=newGrid ;
+      grid_ref=grid_->getId() ; // for server 
       instantDataFilter = lastFilter ;
       
@@ -824,5 +844,9 @@
 
         grid_->solveElementsRefInheritance() ;
-        grid_->completeGrid(); // grid generation, to be checked
+        CGrid* newGrid ;
+        std::pair<std::shared_ptr<CFilter>, std::shared_ptr<CFilter> > filters = grid_->buildTransformationGraph(gc, nullptr, detectMissingValues, defaultValue, newGrid) ;
+        grid_ = newGrid ;
+        grid_ref=grid_->getId() ; // for server 
+//        grid_->completeGrid(); // grid generation, to be checked => later
         grid_->checkElementsAttributes() ;
         instantDataFilter=inputFilter ;
@@ -1603,5 +1627,7 @@
     CContext::getCurrent()->sendContextToFileServer(client);
     getRelFile()->sendFileToFileServer(client);
-    grid_->sendGridToFileServer(client);
+    sentGrid_ = grid_-> duplicateSentGrid() ;
+    sentGrid_->sendGridToFileServer(client);
+    name = getFieldOutputName() ;
     this->sendAllAttributesToServer(client);
     this->sendAddAllVariables(client);
@@ -1697,5 +1723,5 @@
     if (grid_ref.isEmpty())
     {
-      grid_ref=grid_->getId() ;
+      grid_ref=sentGrid_->getId() ;
       SuperClass::sendAllAttributesToServer(client) ;
       domain_ref.reset() ;
@@ -1704,5 +1730,11 @@
       grid_ref.reset();
     }
-    else SuperClass::sendAllAttributesToServer(client) ;
+    else 
+    {
+      string tmp = grid_ref;
+      grid_ref = sentGrid_->getId() ;
+      SuperClass::sendAllAttributesToServer(client) ;
+      grid_ref = tmp ;
+    }
   }
   CATCH_DUMP_ATTR
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 1984)
@@ -227,6 +227,5 @@
 
         bool hasGridMask(void) const;
-        CGrid* getGrid(void) { return grid_; } 
-
+        
         void connectToFileServer(CGarbageCollector& gc) ;
         void connectToCouplerOut(CGarbageCollector& gc) ;
@@ -268,4 +267,12 @@
 
          CGrid*  grid_=nullptr;
+         CGrid* getGrid(void) { return grid_; } 
+      
+      private:
+         CGrid* sentGrid_=nullptr ;
+      public:
+         CGrid* getSentGrid(void) { return sentGrid_; }    
+
+      public:
 //         CFile*  file;
          
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/generate_rectilinear_domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/generate_rectilinear_domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/generate_rectilinear_domain.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CGenerateRectilinearDomain::registerTrans()
   {
-    registerTransformation(TRANS_GENERATE_RECTILINEAR_DOMAIN, create);
+    registerTransformation(TRANS_GENERATE_RECTILINEAR_DOMAIN, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/generate_rectilinear_domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/generate_rectilinear_domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/generate_rectilinear_domain.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CGenerateRectilinearDomain> SuperClass;
       typedef CGenerateRectilinearDomainAttributes SuperClassAttribute;
+      typedef CGenerateRectilinearDomain MyClass ;
+      typedef CTransformation<CDomain> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_GENERATE_RECTILINEAR_DOMAIN ;}
+      static CTransformation<CDomain>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp	(revision 1984)
@@ -24,7 +24,11 @@
 #include "grid_local_view.hpp"
 #include "grid_mask_connector.hpp"
-
-
-namespace xios {
+#include "transformation_path.hpp"
+#include "grid_transformation_factory_impl.hpp"
+#include "transform_filter.hpp"
+
+
+namespace xios
+{
 
    /// ////////////////////// Dfinitions ////////////////////// ///
@@ -236,5 +240,7 @@
      axis_domain_order.resize(order_.size());
      for (int idx = 0; idx < order_.size(); ++idx) axis_domain_order(idx)=order_[idx];
-     return vDomainGroup_->createChild(id);
+     CDomain* domain = vDomainGroup_->createChild(id);
+     computeElements();
+     return domain ;
    }
    CATCH_DUMP_ATTR
@@ -246,5 +252,7 @@
      axis_domain_order.resize(order_.size());
      for (int idx = 0; idx < order_.size(); ++idx) axis_domain_order(idx)=order_[idx];
-     return vAxisGroup_->createChild(id);
+     CAxis* axis=vAxisGroup_->createChild(id);
+     computeElements(); 
+     return axis ;
    }
    CATCH_DUMP_ATTR
@@ -256,5 +264,7 @@
      axis_domain_order.resize(order_.size());
      for (int idx = 0; idx < order_.size(); ++idx) axis_domain_order(idx)=order_[idx];
-     return vScalarGroup_->createChild(id);
+     CScalar* scalar =  vScalarGroup_->createChild(id);
+     computeElements();
+     return scalar;
    }
    CATCH_DUMP_ATTR
@@ -518,4 +528,5 @@
     int idxDomain = 0, idxAxis=0 , idxScalar=0 ; 
  
+    elements_.clear() ;
     for(auto type : order_)
     {
@@ -572,4 +583,5 @@
     setAxisList();
     setScalarList();
+    computeElements() ;
    }
    CATCH_DUMP_ATTR
@@ -960,6 +972,4 @@
 
    
-//----------------------------------------------------------------
-
 
 
@@ -1871,9 +1881,4 @@
 
 
-
-
-
-
-
   bool CGrid::hasTransform()
   TRY
@@ -1892,4 +1897,262 @@
   }
   CATCH_DUMP_ATTR
+
+
+
+//**********************************************************
+//**************   New transformation method  **************
+//**********************************************************
+
+  std::pair<std::shared_ptr<CFilter>, std::shared_ptr<CFilter> > 
+  CGrid::buildTransformationGraph(CGarbageCollector& gc, CGrid* gridSrc, double detectMissingValues, double defaultValue, CGrid*& newGrid)
+  TRY
+  {
+    std::shared_ptr<CFilter> inputFilter = std::shared_ptr<CPassThroughFilter>(new CPassThroughFilter(gc));
+    std::shared_ptr<CFilter> outputFilter = inputFilter ;
+    
+    newGrid = CGrid::create() ; // give it an id later ??
+    bool hadTransform=false ;
+    bool hasTransform=false ;
+    CGenericAlgorithmTransformation* algo ;
+    int dimBefore=1 ;
+    int dimAfter=1 ;
+
+    for(int i=0 ; i<elements_.size(); i++)
+    {
+      CTransformationPaths transformationPath ;
+      auto dstElement = elements_[i] ;
+
+      if (dstElement.type==TYPE_DOMAIN)      transformationPath = dstElement.domain->getTransformationPaths() ;
+      else if (dstElement.type==TYPE_AXIS)   transformationPath = dstElement.axis->getTransformationPaths() ;
+      else if (dstElement.type==TYPE_SCALAR) transformationPath = dstElement.scalar->getTransformationPaths() ;
+
+      SElement srcElement  ;
+      if (gridSrc==nullptr) srcElement = this->elements_[i] ;
+      else srcElement = gridSrc->elements_[i] ;
+
+      if (gridSrc==nullptr) transformationPath.mergePaths() ;
+      else
+      {  
+        if (srcElement.type==TYPE_DOMAIN)      transformationPath.mergePaths(srcElement.domain->getTransformationPaths()) ;
+        else if (srcElement.type==TYPE_AXIS)   transformationPath.mergePaths(srcElement.axis->getTransformationPaths()) ;
+        else if (srcElement.type==TYPE_SCALAR) transformationPath.mergePaths(srcElement.scalar->getTransformationPaths()) ;
+      }
+
+      hasTransform=transformationPath.hasTransform()  ;
+      
+
+      if (hasTransform && !hadTransform)
+      {
+        EElement dstElementType=transformationPath.getNextElementType() ;
+        string dstElementId=transformationPath.getNextElementId() ;
+        string srcElementId=transformationPath.getNextElementSrcId() ;
+        auto transType = transformationPath.getNextTransformationType() ;
+        auto transId = transformationPath.getNextTransformationId() ;
+
+        CGrid* tmpGridSrc=CGrid::create(); // source grid 
+        if (srcElement.type==TYPE_DOMAIN)      tmpGridSrc->addDomain(srcElement.domain->getId()) ;
+        else if (srcElement.type==TYPE_AXIS)   tmpGridSrc->addAxis(srcElement.axis->getId()) ;
+        else if (srcElement.type==TYPE_SCALAR) tmpGridSrc->addScalar(srcElement.scalar->getId()) ;
+        tmpGridSrc->checkElementsAttributes() ;
+        CGrid* tmpGridDst=CGrid::create(); // destination Grid
+        map<int,int> posInGrid={{0,0}} ;
+               
+        cout<<"--> New transform from "<<srcElementId<<" to "<<dstElementId<<endl ;
+        if (dstElementType==EElement::DOMAIN)
+        {
+          CDomain* dstDomain ;
+          if (CDomain::has(dstElementId)) dstDomain = CDomain::get(dstElementId) ;
+          else
+          {
+            dstDomain = CDomain::create() ;
+            dstDomain->createAlias(dstElementId) ;
+            if (srcElementId=="" && srcElement.type==TYPE_DOMAIN)  dstDomain->duplicateAttributes(srcElement.domain) ; // make a copy
+            else dstDomain->duplicateAttributes(CDomain::get(srcElementId)) ; // make a copy
+            CTransformation<CDomain>* transformation = CTransformation<CDomain>::createTransformation(transType,"") ;
+            auto srcTransform = CTransformation<CDomain>::getTransformation(transType, transId) ;
+            transformation->inheritFrom(srcTransform) ;
+            tmpGridDst->addDomain(dstDomain->getId()) ;
+
+            //reuse existing algorithm interface for, now
+            algo = CGridTransformationFactory<CDomain>::createTransformation(transType, tmpGridDst, tmpGridSrc,
+                                                                             transformation, 0, 
+                                                                             posInGrid,posInGrid,posInGrid,
+                                                                             posInGrid,posInGrid,posInGrid );
+            dstDomain->setTransformationAlgorithm(algo) ;
+            transformationPath.removeNextTransform() ;
+            dstDomain->setTransformationPaths(transformationPath) ;
+            newGrid->addDomain(dstDomain->getId()) ;
+          }
+          algo = dstDomain->getTransformationAlgorithm() ;
+        }
+        else if (dstElementType==EElement::AXIS)
+        {
+          CAxis* dstAxis ;
+          if (CAxis::has(dstElementId)) dstAxis = CAxis::get(dstElementId) ;
+          else
+          {
+            dstAxis = CAxis::create() ;
+            dstAxis->createAlias(dstElementId) ;
+            if (srcElementId=="" && srcElement.type==TYPE_AXIS)  dstAxis->duplicateAttributes(srcElement.axis) ; // make a copy
+            else dstAxis->duplicateAttributes(CAxis::get(srcElementId)) ; // make a copy
+            CTransformation<CAxis>* transformation = CTransformation<CAxis>::createTransformation(transType,"") ;
+            auto srcTransform = CTransformation<CAxis>::getTransformation(transType, transId) ;
+            transformation->inheritFrom(srcTransform) ;
+            tmpGridDst->addAxis(dstAxis->getId()) ;
+
+            //reuse existing algorithm interface for, now
+            algo = CGridTransformationFactory<CAxis>::createTransformation(transType, tmpGridDst, tmpGridSrc,
+                                                                           transformation, 0, 
+                                                                           posInGrid,posInGrid,posInGrid,
+                                                                           posInGrid,posInGrid,posInGrid );
+            dstAxis->setTransformationAlgorithm(algo) ;
+            transformationPath.removeNextTransform() ;
+            dstAxis->setTransformationPaths(transformationPath) ;
+            newGrid->addAxis(dstAxis->getId()) ;
+          }
+          algo = dstAxis->getTransformationAlgorithm() ;
+        }
+        else if (dstElementType==EElement::SCALAR)
+        {
+          CScalar* dstScalar ;
+          if (CScalar::has(dstElementId)) dstScalar = CScalar::get(dstElementId) ;
+          else
+          {
+            dstScalar = CScalar::create() ;
+            dstScalar->createAlias(dstElementId) ;
+            if (srcElementId=="" && srcElement.type==TYPE_SCALAR)  dstScalar->duplicateAttributes(srcElement.scalar) ; // make a copy
+            else dstScalar->duplicateAttributes(CScalar::get(srcElementId)) ; // make a copy
+            CTransformation<CScalar>* transformation = CTransformation<CScalar>::createTransformation(transType,"") ;
+            auto srcTransform = CTransformation<CScalar>::getTransformation(transType, transId) ;
+            transformation->inheritFrom(srcTransform) ;
+            tmpGridDst->addScalar(dstScalar->getId()) ;
+
+            //reuse existing algorithm interface for, now
+            algo = CGridTransformationFactory<CScalar>::createTransformation(transType, tmpGridDst, tmpGridSrc,
+                                                                             transformation, 0, 
+                                                                             posInGrid,posInGrid,posInGrid,
+                                                                             posInGrid,posInGrid,posInGrid );
+            dstScalar->setTransformationAlgorithm(algo) ;
+            transformationPath.removeNextTransform() ;
+            dstScalar->setTransformationPaths(transformationPath) ;
+            newGrid->addScalar(dstScalar->getId()) ;
+          }
+          algo = dstScalar->getTransformationAlgorithm() ;          
+        }
+        // here create a new spatial filter with algo
+        
+        hadTransform=true ;
+        hasTransform=false ; 
+      }
+      else
+      {
+        string srcElementId=transformationPath.getNextElementSrcId() ;
+        if (srcElement.type==TYPE_DOMAIN)      
+        {
+          CDomain* domain ;
+          if (!CDomain::has(srcElementId)) 
+          {
+            domain=srcElement.domain ;
+            domain->createAlias(srcElementId) ;
+          }
+          else domain = CDomain::get(srcElementId) ;
+          domain->checkAttributes() ;
+         
+          if (hadTransform) dimBefore*=domain->getLocalView(CElementView::WORKFLOW)->getLocalSize() ;
+          else dimAfter*=domain->getLocalView(CElementView::WORKFLOW)->getLocalSize() ;
+          newGrid->addDomain(srcElementId) ;
+        }
+        else if (srcElement.type==TYPE_AXIS)
+        {   
+          CAxis* axis ;
+          if (!CAxis::has(srcElementId)) 
+          {
+            axis=srcElement.axis ;
+            axis->createAlias(srcElementId) ;
+          }
+          else axis = CAxis::get(srcElementId) ;
+          axis->checkAttributes() ;
+         
+          if (hadTransform) dimBefore*=axis->getLocalView(CElementView::WORKFLOW)->getLocalSize() ;
+          else dimAfter*=axis->getLocalView(CElementView::WORKFLOW)->getLocalSize() ;
+          newGrid->addAxis(srcElementId) ;
+        }
+        else if (srcElement.type==TYPE_SCALAR)
+        {
+          CScalar* scalar ;
+          if (!CScalar::has(srcElementId)) 
+          {
+            scalar=srcElement.scalar ;
+            scalar->createAlias(srcElementId) ;
+          }
+          else scalar = CScalar::get(srcElementId) ;
+          scalar->checkAttributes() ;
+         
+          if (hadTransform) dimBefore*=scalar->getLocalView(CElementView::WORKFLOW)->getLocalSize() ;
+          else dimAfter*=scalar->getLocalView(CElementView::WORKFLOW)->getLocalSize() ;
+          newGrid->addScalar(srcElementId) ;
+        }
+      }
+    }  
+    
+    if (hadTransform)
+    {
+      shared_ptr<CTransformFilter> transformFilter = shared_ptr<CTransformFilter>(new CTransformFilter(gc, algo, dimBefore, dimAfter, detectMissingValues, defaultValue)) ;
+      outputFilter->connectOutput(transformFilter,0) ;
+      outputFilter = transformFilter ;
+
+      gridSrc=newGrid ;
+      pair<shared_ptr<CFilter>, shared_ptr<CFilter> > filters = gridSrc->buildTransformationGraph(gc, gridSrc, detectMissingValues, defaultValue, newGrid) ;
+      outputFilter->connectOutput(filters.first,0) ;
+      outputFilter=filters.second ;
+    }
+     
+    return {inputFilter,outputFilter} ;
+  }
+  CATCH_DUMP_ATTR
+
+
+//****************************************************************
+//****************************************************************
+
+//----------------------------------------------------------------
+
+  CGrid* CGrid::duplicateSentGrid(void)
+  {
+    CGrid* newGrid ;
+    string sentGridId="sent__"+getId() ;
+    if (has(sentGridId)) newGrid = get(sentGridId) ;
+    else
+    {
+      newGrid = CGrid::create(sentGridId) ;
+      for(auto element : elements_)
+      {
+        if (element.type==TYPE_DOMAIN)      
+        {
+          CDomain* domain = CDomain::create();
+          domain->duplicateAttributes(element.domain) ;
+          domain->name = element.domain->getId() ;
+          newGrid->addDomain(domain->getId()) ;
+        }
+        else if (element.type==TYPE_AXIS)      
+        {
+          CAxis* axis = CAxis::create();
+          axis->duplicateAttributes(element.axis) ;
+          axis->name = element.axis->getId() ;
+          newGrid->addAxis(axis->getId()) ;
+        }
+        else if (element.type==TYPE_SCALAR)      
+        {
+          CScalar* scalar = CScalar::create();
+          scalar->duplicateAttributes(element.scalar) ;
+          scalar->name = element.scalar->getId() ;
+          newGrid->addScalar(scalar->getId()) ;
+        }
+      }
+      newGrid->checkElementsAttributes() ;
+    }
+    return newGrid ;
+  }
+
 
   void CGrid::setContextClient(CContextClient* contextClient)
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.hpp	(revision 1984)
@@ -20,4 +20,6 @@
 #include "grid_scatterer_connector.hpp"
 #include "grid_gatherer_connector.hpp"
+#include "transformation_path.hpp"
+#include "filter.hpp"
 
 
@@ -210,4 +212,8 @@
          bool doGridHaveDataDistributed(CContextClient* client = 0);
 
+         ///////////////////////////////////////////
+         ////////    TRANSFORMATIONS           /////
+         ///////////////////////////////////////////
+      public:
          CGridTransformation* getTransformations();
 
@@ -221,5 +227,7 @@
          
          std::vector<std::string> getAuxInputTransformGrid(void) ; 
-
+         std::map<CGrid*, std::pair<bool,StdString> >& getTransGridSource();
+         bool hasTransform();
+         void addTransGridSource(CGrid* gridSrc);
          void completeGrid(CGrid* transformGridSrc = 0);
          bool isTransformed();
@@ -227,8 +235,16 @@
          bool isGenerated();
          void setGenerated();
-         void addTransGridSource(CGrid* gridSrc);
-         std::map<CGrid*, std::pair<bool,StdString> >& getTransGridSource();
-         bool hasTransform();
-         size_t getGlobalWrittenSize(void) ;
+         void setTransformationAlgorithms();
+         pair<shared_ptr<CFilter>, shared_ptr<CFilter> > buildTransformationGraph(CGarbageCollector& gc, CGrid* gridSrc, double detectMissingValues,
+                                                                                  double defaultValue, CGrid*& newGrid) ;
+      private:
+         bool isTransformed_, isGenerated_;
+         CGridTransformation* transformations_;
+         bool hasTransform_;
+       
+        ///////////////////////////////////////////
+      public:
+
+        size_t getGlobalWrittenSize(void) ;
          
          bool isCompleted(void) ;
@@ -265,5 +281,4 @@
         CScalarGroup* getVirtualScalarGroup() const;
 
-        void setTransformationAlgorithms();
         int computeGridGlobalDimension(std::vector<int>& globalDim,
                                        const std::vector<CDomain*> domains,
@@ -310,5 +325,4 @@
         std::set<std::string> relFilesCompressed;
 
-        bool isTransformed_, isGenerated_;
         
         std::vector<int> axisPositionInGrid_;
@@ -317,12 +331,12 @@
         std::vector<int>& getAxisPositionInGrid(void) { if (!computeAxisPositionInGrid_done_) computeAxisPositionInGrid() ; return axisPositionInGrid_ ;}
 
-        CGridTransformation* transformations_;
         bool hasDomainAxisBaseRef_;        
         std::map<CGrid*, std::pair<bool,StdString> > gridSrc_;
-        bool hasTransform_;
 
      //////////////////////////////////////////////////////////////////////////////////////
      //  this part is related to distribution, element definition, views and connectors  //
      //////////////////////////////////////////////////////////////////////////////////////
+      public:
+       CGrid* duplicateSentGrid(void) ;
       private:
        static void recvMask(CEventServer& event) ;
@@ -336,5 +350,5 @@
 
       private:
-        CGridLocalConnector* modelToWorkflowConnector_ ;
+        CGridLocalConnector* modelToWorkflowConnector_ = nullptr ;
       public:
         void computeModelToWorkflowConnector(void) ;
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_axis.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CInterpolateAxis::registerTrans()
   {
-    return registerTransformation(TRANS_INTERPOLATE_AXIS, CInterpolateAxis::create);
+    return registerTransformation(TRANS_INTERPOLATE_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_axis.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CInterpolateAxis> SuperClass;
       typedef CInterpolateAxisAttributes SuperClassAttribute;
+      typedef CInterpolateAxis MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -58,4 +60,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_INTERPOLATE_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_domain.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CInterpolateDomain::registerTrans()
   {
-    registerTransformation(TRANS_INTERPOLATE_DOMAIN, create);
+    registerTransformation(TRANS_INTERPOLATE_DOMAIN, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_domain.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CInterpolateDomain> SuperClass;
       typedef CInterpolateDomainAttributes SuperClassAttribute;
+      typedef CInterpolateDomain MyClass ;
+      typedef CTransformation<CDomain> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_INTERPOLATE_DOMAIN ;}
+      static CTransformation<CDomain>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/inverse_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/inverse_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/inverse_axis.cpp	(revision 1984)
@@ -26,5 +26,5 @@
   bool CInverseAxis::registerTrans()
   {
-    return registerTransformation(TRANS_INVERSE_AXIS, CInverseAxis::create);
+    return registerTransformation(TRANS_INVERSE_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/inverse_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/inverse_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/inverse_axis.hpp	(revision 1984)
@@ -39,4 +39,6 @@
       typedef CObjectTemplate<CInverseAxis> SuperClass;
       typedef CInverseAxisAttributes SuperClassAttribute;
+      typedef CInverseAxis MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -54,5 +56,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
-
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_INVERSE_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_axis.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CReduceAxisToAxis::registerTrans()
   {
-    return registerTransformation(TRANS_REDUCE_AXIS_TO_AXIS, CReduceAxisToAxis::create);
+    return registerTransformation(TRANS_REDUCE_AXIS_TO_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_axis.hpp	(revision 1984)
@@ -40,4 +40,6 @@
       typedef CObjectTemplate<CReduceAxisToAxis> SuperClass;
       typedef CReduceAxisToAxisAttributes SuperClassAttribute;
+      typedef CReduceAxisToAxis MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -55,4 +57,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_REDUCE_AXIS_TO_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_scalar.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_scalar.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_scalar.cpp	(revision 1984)
@@ -26,5 +26,5 @@
   bool CReduceAxisToScalar::registerTrans()
   {
-    return registerTransformation(TRANS_REDUCE_AXIS_TO_SCALAR, CReduceAxisToScalar::create);
+    return registerTransformation(TRANS_REDUCE_AXIS_TO_SCALAR, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_scalar.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_scalar.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_axis_to_scalar.hpp	(revision 1984)
@@ -40,4 +40,6 @@
       typedef CObjectTemplate<CReduceAxisToScalar> SuperClass;
       typedef CReduceAxisToScalarAttributes SuperClassAttribute;
+      typedef CReduceAxisToScalar MyClass ;
+      typedef CTransformation<CScalar> SuperTransform ;
 
     public :
@@ -55,4 +57,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_REDUCE_AXIS_TO_SCALAR ;}
+      static CTransformation<CScalar>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_axis.cpp	(revision 1984)
@@ -28,5 +28,5 @@
   bool CReduceDomainToAxis::registerTrans()
   {
-    return registerTransformation(TRANS_REDUCE_DOMAIN_TO_AXIS, CReduceDomainToAxis::create);
+    return registerTransformation(TRANS_REDUCE_DOMAIN_TO_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_axis.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CReduceDomainToAxis> SuperClass;
       typedef CReduceDomainToAxisAttributes SuperClassAttribute;
+      typedef CReduceDomainToAxis MyClass ;
+     typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -56,5 +58,9 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
-    private:
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_REDUCE_DOMAIN_TO_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
+     private:
       static bool registerTrans();
       static CTransformation<CAxis>* create(const StdString& id, xml::CXMLNode* node);
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_scalar.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_scalar.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_scalar.cpp	(revision 1984)
@@ -26,5 +26,5 @@
   bool CReduceDomainToScalar::registerTrans()
   {
-    return registerTransformation(TRANS_REDUCE_DOMAIN_TO_SCALAR, CReduceDomainToScalar::create);
+    return registerTransformation(TRANS_REDUCE_DOMAIN_TO_SCALAR, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_scalar.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_scalar.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_domain_to_scalar.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CReduceDomainToScalar> SuperClass;
       typedef CReduceDomainToScalarAttributes SuperClassAttribute;
+      typedef CReduceDomainToScalar MyClass ;
+      typedef CTransformation<CScalar> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_REDUCE_DOMAIN_TO_SCALAR ;}
+      static CTransformation<CScalar>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_scalar_to_scalar.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_scalar_to_scalar.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_scalar_to_scalar.cpp	(revision 1984)
@@ -26,5 +26,5 @@
   bool CReduceScalarToScalar::registerTrans()
   {
-    return registerTransformation(TRANS_REDUCE_SCALAR_TO_SCALAR, CReduceScalarToScalar::create);
+    return registerTransformation(TRANS_REDUCE_SCALAR_TO_SCALAR, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_scalar_to_scalar.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_scalar_to_scalar.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reduce_scalar_to_scalar.hpp	(revision 1984)
@@ -40,4 +40,6 @@
       typedef CObjectTemplate<CReduceScalarToScalar> SuperClass;
       typedef CReduceScalarToScalarAttributes SuperClassAttribute;
+      typedef CReduceScalarToScalar MyClass ;
+      typedef CTransformation<CScalar> SuperTransform ;
 
     public :
@@ -55,4 +57,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_REDUCE_SCALAR_TO_SCALAR ;}
+      static CTransformation<CScalar>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reorder_domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reorder_domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reorder_domain.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CReorderDomain::registerTrans()
   {
-    registerTransformation(TRANS_REORDER_DOMAIN, CReorderDomain::create);
+    registerTransformation(TRANS_REORDER_DOMAIN, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reorder_domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reorder_domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/reorder_domain.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CReorderDomain> SuperClass;
       typedef CReorderDomainAttributes SuperClassAttribute;
+      typedef CReorderDomain MyClass ;
+      typedef CTransformation<CDomain> SuperTransform ;
 
     public :
@@ -56,5 +58,9 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
-    private:
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_REORDER_DOMAIN ;}
+      static CTransformation<CDomain>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
+     private:
       static bool registerTrans();
       static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node);
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp	(revision 1984)
@@ -135,5 +135,5 @@
    * Go through the hierarchy to find the scalar from which the transformations must be inherited
    */
-  void CScalar::solveInheritanceTransformation()
+  void CScalar::solveInheritanceTransformation_old()
   {
     if (hasTransformation() || !hasDirectScalarReference())
@@ -153,4 +153,42 @@
   }
  
+  void CScalar::solveInheritanceTransformation()
+  TRY
+  {
+    if (solveInheritanceTransformation_done_) return;
+    else solveInheritanceTransformation_done_=true ;
+
+    CScalar* scalar = this;
+    CScalar* Lastscalar ;
+    std::list<CScalar*> refScalars;
+    bool out=false ;
+    vector<StdString> excludedAttr;
+    excludedAttr.push_back("scalar_ref");
+    
+    refScalars.push_front(scalar) ;
+    while (scalar->hasDirectScalarReference() && !out)
+    {
+      CScalar* lastScalar=scalar ;
+      scalar = scalar->getDirectScalarReference();
+      scalar->solveRefInheritance() ;
+      if (!scalar->SuperClass::isEqual(lastScalar,excludedAttr)) out=true ;
+      refScalars.push_front(scalar) ;
+    }
+
+    CTransformationPaths::TPath path ;
+    auto& pathList = std::get<2>(path) ;
+    std::get<0>(path) = EElement::SCALAR ;
+    std::get<1>(path) = refScalars.front()->getId() ;
+    for (auto& scalar : refScalars)
+    {
+      CScalar::TransMapTypes transformations = scalar->getAllTransformations();
+      for(auto& transformation : transformations) pathList.push_back({transformation.second->getTransformationType(), 
+                                                                      transformation.second->getId()}) ;
+    }
+    transformationPaths_.addPath(path) ;
+
+  }
+  CATCH_DUMP_ATTR
+
   /* obsolete, to remove after reimplementing coupling */
   void CScalar::sendScalarToCouplerOut(CContextClient* client, const string& fieldId, int posInGrid)
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp	(revision 1984)
@@ -13,5 +13,5 @@
 #include "transformation.hpp"
 #include "transformation_enum.hpp"
-
+#include "transformation_path.hpp"
 #include "element.hpp"
 #include "local_connector.hpp"
@@ -19,201 +19,218 @@
 #include "gatherer_connector.hpp"
 #include "distribution_type.hpp"
+#include "generic_algorithm_transformation.hpp"
 
 
 namespace xios
 {
-      /// ////////////////////// DÃ©clarations ////////////////////// ///
-
-      class CScalarGroup;
-      class CScalarAttributes;
-      class CScalar;
-      ///--------------------------------------------------------------
-
-      // Declare/Define CVarAttribute
-      BEGIN_DECLARE_ATTRIBUTE_MAP(CScalar)
+  /// ////////////////////// DÃ©clarations ////////////////////// ///
+
+  class CScalarGroup;
+  class CScalarAttributes;
+  class CScalar;
+  ///--------------------------------------------------------------
+
+  // Declare/Define CVarAttribute
+  BEGIN_DECLARE_ATTRIBUTE_MAP(CScalar)
 #include "scalar_attribute.conf"
-      END_DECLARE_ATTRIBUTE_MAP(CScalar)
-
-      ///--------------------------------------------------------------
-
-      class CScalar
-         : public CObjectTemplate<CScalar>
-         , public CScalarAttributes
+  END_DECLARE_ATTRIBUTE_MAP(CScalar)
+
+  ///--------------------------------------------------------------
+
+  class CScalar: public CObjectTemplate<CScalar>
+               , public CScalarAttributes
+  {
+      friend class CScalarGroup;
+
+      /// typedef ///
+      typedef CObjectTemplate<CScalar>   SuperClass;
+      typedef CScalarAttributes SuperClassAttribute;
+
+    public:
+      enum EEventId
       {
-           friend class CScalarGroup;
-
-            /// typedef ///
-            typedef CObjectTemplate<CScalar>   SuperClass;
-            typedef CScalarAttributes SuperClassAttribute;
-
-         public:
-           enum EEventId
-           {
-             EVENT_ID_SCALAR_DISTRIBUTION,
-             EVENT_ID_SEND_DISTRIBUTED_ATTRIBUTE,
-           } ;
-           static bool dispatchEvent(CEventServer& event);      
+        EVENT_ID_SCALAR_DISTRIBUTION,
+        EVENT_ID_SEND_DISTRIBUTED_ATTRIBUTE,
+      } ;
+      static bool dispatchEvent(CEventServer& event);      
            
 
-         public :
-
-            typedef CScalarAttributes RelAttributes;
-            typedef CScalarGroup      RelGroup;
-            typedef CTransformation<CScalar>::TransformationMapTypes TransMapTypes;
-
-            /// Constructeurs ///
-            CScalar(void);
-            explicit CScalar(const StdString & id);
-            CScalar(const CScalar & var);       // Not implemented yet.
-            CScalar(const CScalar * const var); // Not implemented yet.
-
-            /// Destructeur ///
-            virtual ~CScalar(void);
-
-         public :
-            /// Accesseurs statiques ///
-            static StdString GetName(void);
-            static StdString GetDefName(void);
-            static ENodeType GetType(void);
-
-         public:
-            static CScalar* createScalar();
-
-         public:
-            void checkAttributes(void);
-            bool checkAttributes_done_ = false ;
+    public :
+
+      typedef CScalarAttributes RelAttributes;
+      typedef CScalarGroup      RelGroup;
+
+      /// Constructeurs ///
+      CScalar(void);
+      explicit CScalar(const StdString & id);
+      CScalar(const CScalar & var);       // Not implemented yet.
+      CScalar(const CScalar * const var); // Not implemented yet.
+
+      /// Destructeur ///
+      virtual ~CScalar(void);
+
+    public :
+      /// Accesseurs statiques ///
+      static StdString GetName(void);
+      static StdString GetDefName(void);
+      static ENodeType GetType(void);
+
+    public:
+      static CScalar* createScalar();
+
+    public:
+      void checkAttributes(void);
+      bool checkAttributes_done_ = false ;
             
-            void addRelFile(const StdString& filename);
-            bool IsWritten(const StdString& filename) const;
-             virtual void parse(xml::CXMLNode & node);
+      void addRelFile(const StdString& filename);
+      bool IsWritten(const StdString& filename) const;
+      virtual void parse(xml::CXMLNode & node);
         
-         public:
-            void sendScalarToCouplerOut(CContextClient* client, const string& fieldId, int posInGrid) ;
-         private:
-            std::set<CContextClient*> sendScalarToCouplerOut_done_ ;
+    public:
+      void sendScalarToCouplerOut(CContextClient* client, const string& fieldId, int posInGrid) ;
+    private:
+      std::set<CContextClient*> sendScalarToCouplerOut_done_ ;
          
-         public:
-            void makeAliasForCoupling(const string& fieldId, int posInGrid) ;
-
-         public:
-           bool hasTransformation();
-           void solveInheritanceTransformation();
-           TransMapTypes getAllTransformations();
-           void duplicateTransformation(CScalar*);
-           CTransformation<CScalar>* addTransformation(ETranformationType transType, const StdString& id="");
-           bool isEqual(CScalar* scalar);
-        private:  
+    public:
+      void makeAliasForCoupling(const string& fieldId, int posInGrid) ;
+
+      ////////////////////////////////
+      ////    TRANSFORMATIONS     ////
+      //////////////////////////////// 
+    public:
+      typedef CTransformation<CScalar>::TransformationMapTypes TransMapTypes;
+    private:
+      static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m);
+      static std::map<StdString, ETranformationType> transformationMapList_;
+      static bool dummyTransformationMapList_;      TransMapTypes transformationMap_;
+      void setTransformations(const TransMapTypes&);
+
+    public:
+      bool hasTransformation();
+      TransMapTypes getAllTransformations();
+      void duplicateTransformation(CScalar*);
+      CTransformation<CScalar>* addTransformation(ETranformationType transType, const StdString& id="");
+    
+       void solveInheritanceTransformation_old();
+       void solveInheritanceTransformation();
+      private:
+        bool solveInheritanceTransformation_done_= false ;
+      private:
+        CGenericAlgorithmTransformation* transformationAlgorithm_ = nullptr ;
+      public:
+        void setTransformationAlgorithm(CGenericAlgorithmTransformation* transformationAlgorithm) { transformationAlgorithm_=transformationAlgorithm ;}
+        CGenericAlgorithmTransformation* getTransformationAlgorithm(void) { return transformationAlgorithm_ ;}   
+      private:
+        CTransformationPaths transformationPaths_ ;
+      public:
+        CTransformationPaths getTransformationPaths(void) {return transformationPaths_;} 
+        void setTransformationPaths(const CTransformationPaths& transformationPaths) { transformationPaths_=transformationPaths ;}
+      ////////////////////////////////
+      ////////////////////////////////
+
+      bool isEqual(CScalar* scalar);
+    private:  
           /** Clients that have to send a scalar. There can be multiple clients in case of secondary server, otherwise only one client. */
-         std::list<CContextClient*> clients;
-         std::set<CContextClient*> clientsSet;
-        public:
-          void setContextClient(CContextClient* contextClient) ;
+      std::list<CContextClient*> clients;
+      std::set<CContextClient*> clientsSet;
+    public:
+      void setContextClient(CContextClient* contextClient) ;
         
-         private:
-           std::set<StdString> relFiles;
-           TransMapTypes transformationMap_;
-
-            void setTransformations(const TransMapTypes&);
-
-       private:
-           static bool initializeTransformationMap(std::map<StdString, ETranformationType>& m);
-           static std::map<StdString, ETranformationType> transformationMapList_;
-           static bool dummyTransformationMapList_;
-
-           /** define if the scalar is completed or not ie all attributes have been received before in case 
-               of grid reading from file or coupling */ 
-      private:
-         /** define if the scalar is completed or not ie all attributes have been received before in case 
-             of grid reading from file or coupling */ 
-         bool isCompleted_=true ;  
-      public:     
-         /*!
-           \brief Check if a scalar is completed
-           Before make any scalar processing, we must be sure that all scalar informations have
-           been sent, for exemple when reading a grid in a file or when grid elements are sent by an
-           other context (coupling). So all direct reference of the scalar (scalar_ref) must be also completed
-           \return true if scalar and scalar reference are completed
-          */
-         bool isCompleted(void)
-         {
-           if (hasDirectScalarReference()) if (!getDirectScalarReference()->isCompleted()) return false;
-           else return isCompleted_ ;
-         }
-         void setCompleted(void) { isCompleted_=true ; }
-         void unsetCompleted(void) { isCompleted_=false ; }
-
-
-
-       //////////////////////////////////////////////////////////////////////////////////////
-       //  this part is related to distribution, element definition, views and connectors  //
-       //////////////////////////////////////////////////////////////////////////////////////
-       private:
-         CLocalElement* localElement_ = nullptr ;
-         void initializeLocalElement(void) ;
+    private:
+      std::set<StdString> relFiles;
+
+    private:
+      /** define if the scalar is completed or not ie all attributes have been received before in case 
+           of grid reading from file or coupling */ 
+      bool isCompleted_=true ;  
+    public:     
+      /*!
+        \brief Check if a scalar is completed
+        Before make any scalar processing, we must be sure that all scalar informations have
+        been sent, for exemple when reading a grid in a file or when grid elements are sent by an
+        other context (coupling). So all direct reference of the scalar (scalar_ref) must be also completed
+        \return true if scalar and scalar reference are completed
+      */
+      bool isCompleted(void)
+      {
+        if (hasDirectScalarReference()) if (!getDirectScalarReference()->isCompleted()) return false;
+        else return isCompleted_ ;
+      }
+      void setCompleted(void) { isCompleted_=true ; }
+      void unsetCompleted(void) { isCompleted_=false ; }
+
+
+
+    //////////////////////////////////////////////////////////////////////////////////////
+    //  this part is related to distribution, element definition, views and connectors  //
+    //////////////////////////////////////////////////////////////////////////////////////
+    private:
+      CLocalElement* localElement_ = nullptr ;
+      void initializeLocalElement(void) ;
        
-       public:  
-         CLocalElement* getLocalElement(void) { if (localElement_==nullptr) initializeLocalElement() ; return localElement_ ; }
-         CLocalView* getLocalView(CElementView::type type) { return getLocalElement()->getView(type) ;}
+    public:  
+      CLocalElement* getLocalElement(void) { if (localElement_==nullptr) initializeLocalElement() ; return localElement_ ; }
+      CLocalView* getLocalView(CElementView::type type) { return getLocalElement()->getView(type) ;}
        
-       private:  
-         void addFullView(void) ;
-         void addWorkflowView(void) ;
-         void addModelView(void) ;
+    private:  
+      void addFullView(void) ;
+      void addWorkflowView(void) ;
+      void addModelView(void) ;
         
-       private:
-         CLocalConnector* modelToWorkflowConnector_ ;
-         void computeModelToWorkflowConnector(void)  ;
-       public:
-         CLocalConnector* getModelToWorkflowConnector(void) { if (modelToWorkflowConnector_==nullptr) computeModelToWorkflowConnector() ; return modelToWorkflowConnector_ ;}
-
-       public:
-         void computeRemoteElement(CContextClient* client, EDistributionType) ;
-         void distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex, CScattererConnector* &scattererConnector,
+    private:
+      CLocalConnector* modelToWorkflowConnector_ ;
+      void computeModelToWorkflowConnector(void)  ;
+    public:
+      CLocalConnector* getModelToWorkflowConnector(void) { if (modelToWorkflowConnector_==nullptr) computeModelToWorkflowConnector() ; return modelToWorkflowConnector_ ;}
+
+    public:
+      void computeRemoteElement(CContextClient* client, EDistributionType) ;
+      void distributeToServer(CContextClient* client, std::map<int, CArray<size_t,1>>& globalIndex, CScattererConnector* &scattererConnector,
                                  const string& scalarId="") ;
 
-         static void recvScalarDistribution(CEventServer& event) ;
-         void receivedScalarDistribution(CEventServer& event, int phasis) ;
-         void setServerMask(CArray<bool,1>& serverMask, CContextClient* client) ;
-         void sendDistributedAttributes(CContextClient* client, CScattererConnector& scattererConnector, const string& scalarId) ;
-         static void recvDistributedAttributes(CEventServer& event) ;
-         void recvDistributedAttributes(CEventServer& event, const string& type) ;
-
-       private:
-         map<CContextClient*, CDistributedElement*> remoteElement_ ;
-       public: 
-         CDistributedElement* getRemoteElement(CContextClient* client) {return remoteElement_[client] ;}
-       private:
-         map<CContextClient*, CScattererConnector*> clientToServerConnector_ ;
-       public: 
-         CScattererConnector* getClientToServerConnector(CContextClient* client) { return clientToServerConnector_[client] ;}
-
-       private:
-         CGathererConnector*  gathererConnector_ ;
-       public:
-         CGathererConnector* getGathererConnector(void) { return gathererConnector_ ;}
-       private:
-         CGathererConnector* serverFromClientConnector_ ;
-         CDistributedElement* elementFrom_ ;
-       public:
-        CGathererConnector* getServerFromClientConnector(void) { return serverFromClientConnector_ ;}
-
-       private:
-         CScattererConnector*  serverToClientConnector_ = nullptr ;
-       public: 
-         CScattererConnector* getServerToClientConnector(void) { return serverToClientConnector_ ;} 
-
-       private:
-          map<CContextClient*,CGathererConnector*>  clientFromServerConnector_  ;
-       public: 
-         CGathererConnector* getClientFromServerConnector(CContextClient* client) { return clientFromServerConnector_[client] ;} 
-
-      private:
-            DECLARE_REF_FUNC(Scalar,scalar)
-
-      }; // class CVar
-      ///--------------------------------------------------------------
-
-      // Declare/Define CScalarGroup and CScalarDefinition
-      DECLARE_GROUP(CScalar);
+      static void recvScalarDistribution(CEventServer& event) ;
+      void receivedScalarDistribution(CEventServer& event, int phasis) ;
+      void setServerMask(CArray<bool,1>& serverMask, CContextClient* client) ;
+      void sendDistributedAttributes(CContextClient* client, CScattererConnector& scattererConnector, const string& scalarId) ;
+      static void recvDistributedAttributes(CEventServer& event) ;
+      void recvDistributedAttributes(CEventServer& event, const string& type) ;
+
+    private:
+      map<CContextClient*, CDistributedElement*> remoteElement_ ;
+    public: 
+      CDistributedElement* getRemoteElement(CContextClient* client) {return remoteElement_[client] ;}
+    private:
+      map<CContextClient*, CScattererConnector*> clientToServerConnector_ ;
+    public: 
+      CScattererConnector* getClientToServerConnector(CContextClient* client) { return clientToServerConnector_[client] ;}
+
+    private:
+      CGathererConnector*  gathererConnector_ ;
+    public:
+      CGathererConnector* getGathererConnector(void) { return gathererConnector_ ;}
+    private:
+      CGathererConnector* serverFromClientConnector_ ;
+      CDistributedElement* elementFrom_ ;
+    public:
+      CGathererConnector* getServerFromClientConnector(void) { return serverFromClientConnector_ ;}
+
+    private:
+      CScattererConnector*  serverToClientConnector_ = nullptr ;
+    public: 
+      CScattererConnector* getServerToClientConnector(void) { return serverToClientConnector_ ;} 
+
+    private:
+      map<CContextClient*,CGathererConnector*>  clientFromServerConnector_  ;
+    public: 
+      CGathererConnector* getClientFromServerConnector(CContextClient* client) { return clientFromServerConnector_[client] ;} 
+
+    private:
+      DECLARE_REF_FUNC(Scalar,scalar)
+
+  }; // class CVar
+  ///--------------------------------------------------------------
+
+  // Declare/Define CScalarGroup and CScalarDefinition
+  DECLARE_GROUP(CScalar);
 } // namespace xios
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/temporal_splitting.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/temporal_splitting.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/temporal_splitting.cpp	(revision 1984)
@@ -29,5 +29,5 @@
   bool CTemporalSplitting::registerTrans()
   {
-    return registerTransformation(TRANS_TEMPORAL_SPLITTING, CTemporalSplitting::create);
+    return registerTransformation(TRANS_TEMPORAL_SPLITTING, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/temporal_splitting.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/temporal_splitting.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/temporal_splitting.hpp	(revision 1984)
@@ -40,4 +40,6 @@
       typedef CObjectTemplate<CTemporalSplitting> SuperClass;
       typedef CTemporalSplittingAttributes SuperClassAttribute;
+      typedef CTemporalSplitting MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -55,4 +57,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_TEMPORAL_SPLITTING ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/transformation.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/transformation.hpp	(revision 1975)
+++ 	(revision )
@@ -1,80 +1,0 @@
-#ifndef __XIOS_CTransformation__
-#define __XIOS_CTransformation__
-
-#include "xios_spl.hpp"
-#include "xml_node.hpp"
-#include "transformation_enum.hpp"
-
-namespace xios {
-
-  ///--------------------------------------------------------------
-  /*!
-    \class CTransformation
-    This class describes inverse_axis in xml file.
-  */
-  template<typename T>
-  class CTransformation
-  {
-  public:
-    typedef typename std::list<std::pair<ETranformationType, CTransformation<T>* > > TransformationMapTypes;
-    typedef TransformationMapTypes TransMapTypes;
-
-    public :
-      /// Constructeurs ///
-      CTransformation(void) {}
-      virtual void checkValid(T* dest) {}
-
-      std::vector<StdString> checkAuxInputs() { return checkAuxInputs_(); }
-      static CTransformation<T>* createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node=0);
-
-      /// Destructeur ///
-      virtual ~CTransformation(void) {}
-
-    protected:
-      typedef CTransformation<T>* (*CreateTransformationCallBack)(const StdString&, xml::CXMLNode*);
-      typedef std::map<ETranformationType, CreateTransformationCallBack> CallBackMap;
-      static CallBackMap* transformationCreationCallBacks_;
-
-      static bool registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn);
-      static bool unregisterTransformation(ETranformationType transType);
-
-    protected:
-      virtual std::vector<StdString> checkAuxInputs_() { return std::vector<StdString>(); }
-  }; // class CTransformation
-
-  template<typename T>
-  typename CTransformation<T>::CallBackMap* CTransformation<T>::transformationCreationCallBacks_ = 0; //CTransformation<T>::CallBackMap();
-
-  template<typename T>
-  CTransformation<T>* CTransformation<T>::createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node)
-  {
-    int transTypeInt = transType;
-    typename CallBackMap::const_iterator it = (*transformationCreationCallBacks_).find(transType);
-    if ((*transformationCreationCallBacks_).end() == it)
-    {
-       ERROR("CTransformation<T>::createTransformation(ETranformationType transType)",
-             << "Transformation type " << transType
-             << "doesn't exist. Please define.");
-    }
-    return (it->second)(id,node);
-  }
-
-  template<typename T>
-  bool CTransformation<T>::registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn)
-  {
-    if (0 == transformationCreationCallBacks_)
-      transformationCreationCallBacks_ = new CallBackMap();
-
-    return (*transformationCreationCallBacks_).insert(make_pair(transType, createFn)).second;
-  }
-
-  template<typename T>
-  bool CTransformation<T>::unregisterTransformation(ETranformationType transType)
-  {
-    int transTypeInt = transType;
-    return (1 == (*transformationCreationCallBacks_).erase(transType));
-  }
-
-} // namespace xios
-
-#endif // __XIOS_CTransformation__
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/transformation_enum.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/transformation_enum.hpp	(revision 1975)
+++ 	(revision )
@@ -1,33 +1,0 @@
-#ifndef __XIOS_TRANSFORMATION_ENUM__
-#define __XIOS_TRANSFORMATION_ENUM__
-
-namespace xios
-{
-      /// ////////////////////// DÃ©finitions ////////////////////// ///
-      typedef enum transformation_type
-      {
-        TRANS_ZOOM_AXIS = 0,
-        TRANS_INVERSE_AXIS = 1,
-        TRANS_INTERPOLATE_AXIS = 2,
-        TRANS_ZOOM_DOMAIN = 3,
-        TRANS_INTERPOLATE_DOMAIN = 4,
-        TRANS_GENERATE_RECTILINEAR_DOMAIN = 5,
-        TRANS_REDUCE_AXIS_TO_SCALAR = 6,
-        TRANS_REDUCE_DOMAIN_TO_AXIS = 7,
-        TRANS_EXTRACT_DOMAIN_TO_AXIS = 8,
-        TRANS_COMPUTE_CONNECTIVITY_DOMAIN = 9,
-        TRANS_EXPAND_DOMAIN = 10,
-        TRANS_EXTRACT_AXIS_TO_SCALAR = 11,
-        TRANS_REDUCE_DOMAIN_TO_SCALAR = 12,
-        TRANS_TEMPORAL_SPLITTING = 13,
-        TRANS_REDUCE_AXIS_TO_AXIS = 14,
-        TRANS_DUPLICATE_SCALAR_TO_AXIS = 15,
-        TRANS_REDUCE_SCALAR_TO_SCALAR = 16,
-        TRANS_REORDER_DOMAIN = 17,
-        TRANS_EXTRACT_DOMAIN = 18,
-        TRANS_EXTRACT_AXIS = 19
-      } ETranformationType;
-
-} // namespace xios
-
-#endif // __XIOS_TRANSFORMATION_ENUM__
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_axis.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_axis.cpp	(revision 1984)
@@ -26,5 +26,5 @@
   bool CZoomAxis::registerTrans()
   {
-    return registerTransformation(TRANS_ZOOM_AXIS, CZoomAxis::create);
+    return registerTransformation(TRANS_ZOOM_AXIS, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_axis.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_axis.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CZoomAxis> SuperClass;
       typedef CZoomAxisAttributes SuperClassAttribute;
+      typedef CZoomAxis MyClass ;
+      typedef CTransformation<CAxis> SuperTransform ;
 
     public :
@@ -56,4 +58,8 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_ZOOM_AXIS ;}
+      static CTransformation<CAxis>* getTransformation(const StdString& id) { return SuperClass::get(id);}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
     private:
       static bool registerTrans();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_domain.cpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_domain.cpp	(revision 1984)
@@ -27,5 +27,5 @@
   bool CZoomDomain::registerTrans()
   {
-    registerTransformation(TRANS_ZOOM_DOMAIN, CZoomDomain::create);
+    registerTransformation(TRANS_ZOOM_DOMAIN, {create, getTransformation});
   }
 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_domain.hpp	(revision 1975)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/zoom_domain.hpp	(revision 1984)
@@ -41,4 +41,6 @@
       typedef CObjectTemplate<CZoomDomain> SuperClass;
       typedef CZoomDomainAttributes SuperClassAttribute;
+      typedef CZoomDomain MyClass ;
+      typedef CTransformation<CDomain> SuperTransform ;
 
     public :
@@ -56,7 +58,12 @@
       static StdString GetDefName(void);
       static ENodeType GetType(void);
+      const string& getId(void) { return this->SuperClass::getId();}
+      ETranformationType getTransformationType(void) { return TRANS_ZOOM_DOMAIN ;}
+      virtual void inheritFrom(SuperTransform* srcTransform) { solveDescInheritance(true, this->SuperClass::get((MyClass*)srcTransform)) ;}
+      static CTransformation<CDomain>* getTransformation(const StdString& id) { return SuperClass::get(id);}
     private:
       static bool registerTrans();
       static CTransformation<CDomain>* create(const StdString& id, xml::CXMLNode* node);
+     
       static bool _dummyRegistered;
   }; // class CZoomDomain
