Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_transform_filter.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_transform_filter.cpp	(revision 2007)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_transform_filter.cpp	(revision 2007)
@@ -0,0 +1,51 @@
+#include "temporal_transform_filter.hpp"
+
+namespace xios
+{
+
+  CTemporalTransformFilter::CTemporalTransformFilter(CGarbageCollector& gc, CGridAlgorithm* algo, int nrecords, bool detectMissingValues, double defaultValue)
+  : CTransformFilter(gc, algo, detectMissingValues, defaultValue), nrecords_(nrecords)
+  {
+
+  }
+
+  CDataPacketPtr CTemporalTransformFilter::apply(std::vector<CDataPacketPtr> data)
+  {
+    if (data[0]->status == CDataPacket::NO_ERROR)
+    {
+      if (record_==0) tmpData_.resize(nrecords_) ;
+      algorithm_->apply(data[0]->data, tmpData_[record_]);
+      record_++ ;
+      if (record_==nrecords_)
+      {
+        size_t size=0 ;
+        for(auto& it : tmpData_) size += it.numElements() ;
+        // for now, no auxilliairy field
+        CDataPacketPtr packet(new CDataPacket);
+        packet->date = data[0]->date;
+        packet->timestamp = data[0]->timestamp;
+        packet->status = data[0]->status;
+        packet->data.resize(size) ;
+        double* out = packet->data.dataFirst() ;
+        for(auto& it : tmpData_) 
+        {
+          size = it.numElements() ; 
+          double* tmp = it.dataFirst() ;
+          for(size_t i=0 ; i<size ; i++, out++, tmp++) *out=*tmp ;   
+        }
+        tmpData_.clear() ;
+        record_=0 ;
+        return packet ;
+      }
+      else return nullptr ;
+    }
+    else // error
+    {
+      CDataPacketPtr packet(new CDataPacket);
+      packet->date = data[0]->date;
+      packet->timestamp = data[0]->timestamp;
+      packet->status = data[0]->status;
+      return packet ;
+    }    
+  }
+}
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_transform_filter.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_transform_filter.hpp	(revision 2007)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_transform_filter.hpp	(revision 2007)
@@ -0,0 +1,40 @@
+#ifndef __XIOS_TEMPORAL_TRANSFORM_FILTER_HPP__
+#define __XIOS_TEMPORAL_TRANSFORM_FILTER_HPP__
+
+#include "transform_filter.hpp"
+
+namespace xios
+{
+  
+  /*!
+   * A generic filter with multiple input slots wrapping any type of spatial transformations.
+   */
+  class CTemporalTransformFilter : public CTransformFilter
+  {
+    public:
+
+      CTemporalTransformFilter(CGarbageCollector& gc, CGridAlgorithm* algo, int nrecords, bool detectMissingValues, double defaultValue) ;
+
+    protected:
+      /*!
+        Overriding this function to process transformations with auxillary inputs
+      */
+      CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data) ;
+//      void apply(const CArray<double, 1>& dataSrc, CArray<double,1>& dataDest);
+
+       /*!
+        Overriding this function to process transformations with auxillary inputs
+      */
+//      void virtual onInputReady(std::vector<CDataPacketPtr> data);
+      //! Current record in the filter
+      int record_=0 ;
+      //! Maximum number of records
+      int nrecords_;
+      //! Temporary storage for output flux
+      vector<CArray<double, 1>> tmpData_; 
+  }; // class CTransformFilter
+
+
+} // namespace xios
+
+#endif //__XIOS_TEMPORAL_TRANSFORM_FILTER_HPP__
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/transform_filter.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/transform_filter.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/transform_filter.hpp	(revision 2007)
@@ -22,11 +22,9 @@
       */
       CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data) ;
-      void apply(const CArray<double, 1>& dataSrc, CArray<double,1>& dataDest);
-
-    private :
+//      void apply(const CArray<double, 1>& dataSrc, CArray<double,1>& dataDest);
      
-     CGridAlgorithm* algorithm_ ;
-     bool detectMissingValues_ ;
-     bool defaultValue_ ;
+      CGridAlgorithm* algorithm_ ;
+      bool detectMissingValues_ ;
+      bool defaultValue_ ;
 
   }; // class CTransformFilter
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp	(revision 2007)
@@ -146,5 +146,5 @@
         CGenericAlgorithmTransformation* transformationAlgorithm_ = nullptr ;
       public:
-        void setTransformationAlgorithm(CGenericAlgorithmTransformation* transformationAlgorithm) { transformationAlgorithm=transformationAlgorithm ;}
+        void setTransformationAlgorithm(CGenericAlgorithmTransformation* transformationAlgorithm) { transformationAlgorithm_=transformationAlgorithm ;}
         CGenericAlgorithmTransformation* getTransformationAlgorithm(void) { return transformationAlgorithm_ ;}   
       private:
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp	(revision 2007)
@@ -27,4 +27,7 @@
 #include "transform_filter.hpp"
 #include "grid_algorithm.hpp"
+#include "grid_algorithm_generic.hpp"
+#include "generic_algorithm_transformation.hpp"
+#include "algo_types.hpp"
 
 
@@ -1704,7 +1707,12 @@
   TRY
   {
+    registerAlgorithmTransformation() ; // needed to enable self-registration of the transformations
+                                        // big mystery why it doesn't work witout that...
+                                        // problem with the linker ?? 
+    
     std::shared_ptr<CFilter> inputFilter = std::shared_ptr<CPassThroughFilter>(new CPassThroughFilter(gc));
     std::shared_ptr<CFilter> outputFilter = inputFilter ;
-    
+
+
     string newId ;
     if (gridSrc!=nullptr) newId = gridSrc->getId() + " --> " + this->getId()  ;
@@ -1919,5 +1927,5 @@
         else gridAlgorithm = newGrid->getGridAlgorithm() ;
 
-        shared_ptr<CTransformFilter> transformFilter = shared_ptr<CTransformFilter>(new CTransformFilter(gc, gridAlgorithm, detectMissingValues, defaultValue)) ;
+        shared_ptr<CTransformFilter> transformFilter = shared_ptr<CTransformFilter>(gridAlgorithm->createTransformFilter(gc, detectMissingValues, defaultValue)) ;
         outputFilter->connectOutput(transformFilter,0) ;
         outputFilter = transformFilter ;
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algo_types.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algo_types.cpp	(revision 2007)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algo_types.cpp	(revision 2007)
@@ -0,0 +1,40 @@
+#include "algo_types.hpp"
+#include <iostream>
+
+  namespace xios
+  {
+    
+    void registerAlgorithmTransformation(void)
+    {
+      static bool first = true ;
+      if (!first) return ;
+      bool ret ;
+      std::cout<<"register Transformation"<<std::endl ;
+      ret=CScalarAlgorithmReduceAxis::registerTrans();
+      ret=CScalarAlgorithmExtractAxis::registerTrans();
+      ret=CScalarAlgorithmReduceDomain::registerTrans();
+      ret=CScalarAlgorithmReduceScalar::registerTrans();
+
+      //! Axis
+      ret=CAxisAlgorithmZoom::registerTrans();
+      ret=CAxisAlgorithmExtractDomain::registerTrans();
+      ret=CAxisAlgorithmInterpolate::registerTrans();
+      ret=CAxisAlgorithmExtract::registerTrans();
+      ret=CAxisAlgorithmInverse::registerTrans();
+      ret=CAxisAlgorithmReduceDomain::registerTrans();
+      ret=CAxisAlgorithmReduceAxis::registerTrans();
+      ret=CAxisAlgorithmTemporalSplitting::registerTrans();
+      ret=CAxisAlgorithmDuplicateScalar::registerTrans();
+
+      //! Domain
+      ret=CDomainAlgorithmComputeConnectivity::registerTrans();
+      ret=CDomainAlgorithmInterpolate::registerTrans();
+      ret=CDomainAlgorithmZoom::registerTrans();
+      ret=CDomainAlgorithmExpand::registerTrans();
+      ret=CDomainAlgorithmReorder::registerTrans();
+      ret=CDomainAlgorithmExtract::registerTrans();
+      first=false ;
+    }
+  }
+
+
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algo_types.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algo_types.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algo_types.hpp	(revision 2007)
@@ -34,6 +34,8 @@
 #include "domain_algorithm_extract.hpp"
 
-
-
+namespace xios
+{
+  void registerAlgorithmTransformation(void) ;
+}
 
 
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_no_data_modification.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_no_data_modification.cpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_no_data_modification.cpp	(revision 2007)
@@ -1,3 +1,5 @@
 #include "algorithm_transformation_no_data_modification.hpp"
+#include "grid_algorithm_no_data_modification.hpp"
+#include "grid.hpp"
 
 namespace xios
@@ -8,3 +10,7 @@
   }
   
+  CGridAlgorithm* CAlgorithmTransformationNoDataModification::createGridAlgorithm(CGrid* gridSrc, CGrid* gridDst, int pos)
+  {
+    return new CGridAlgorithmNoDataModification(this) ;
+  }
 }
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_no_data_modification.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_no_data_modification.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_no_data_modification.hpp	(revision 2007)
@@ -15,4 +15,5 @@
       virtual ~CAlgorithmTransformationNoDataModification() {};
       virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut);
+      virtual CGridAlgorithm* createGridAlgorithm(CGrid* gridSrc, CGrid* newGrid, int pos) ;
   };
 
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_reduce.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_reduce.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_reduce.hpp	(revision 2007)
@@ -18,5 +18,5 @@
       virtual ~CAlgorithmTransformationReduce() {};
       virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut);
-      void computeRecvElement(CLocalView* srcView, CLocalView* dstView) ;
+      virtual void computeRecvElement(CLocalView* srcView, CLocalView* dstView) ;
       
     protected:
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_transfer.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_transfer.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_transfer.hpp	(revision 2007)
@@ -16,5 +16,5 @@
       virtual ~CAlgorithmTransformationTransfer() {};
       virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut);
-      void computeRecvElement(CLocalView* srcView, CLocalView* dstView) ;
+      virtual void computeRecvElement(CLocalView* srcView, CLocalView* dstView) ;
    
     protected:
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_weight.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_weight.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/algorithm_transformation_weight.hpp	(revision 2007)
@@ -18,5 +18,5 @@
       virtual ~CAlgorithmTransformationWeight() {};
       virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut);
-      void computeRecvElement(CLocalView* srcView, CLocalView* dstView);
+      virtual void computeRecvElement(CLocalView* srcView, CLocalView* dstView);
     protected:
       virtual void computeAlgorithm(CLocalView* srcView, CLocalView* dstView) ;
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_temporal_splitting.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_temporal_splitting.cpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_temporal_splitting.cpp	(revision 2007)
@@ -10,4 +10,5 @@
 #include "grid.hpp"
 #include "grid_transformation_factory_impl.hpp"
+#include "temporal_transform_filter.hpp"
 
 namespace xios {
@@ -43,9 +44,13 @@
 
 CAxisAlgorithmTemporalSplitting::CAxisAlgorithmTemporalSplitting(bool isSource, CAxis* axisDestination, CScalar* scalarSource, CTemporalSplitting* algo)
- : CAxisAlgorithmTransformation(isSource, axisDestination, scalarSource)
+ : CAlgorithmTransformationNoDataModification(isSource)
 {
-
+  nrecords_ = axisDestination->n_glo ; // also axis must not be distributed, make more test later
 }
 
+CTransformFilter* CAxisAlgorithmTemporalSplitting::createTransformFilter(CGarbageCollector& gc, CGridAlgorithm* algo, bool detectMissingValues, double defaultValue)
+{
+  return new CTemporalTransformFilter(gc, algo, nrecords_, detectMissingValues, defaultValue) ;
+}
 
 CAxisAlgorithmTemporalSplitting::~CAxisAlgorithmTemporalSplitting()
@@ -53,29 +58,4 @@
 }
 
-void CAxisAlgorithmTemporalSplitting::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs)
-TRY
-{
-  this->transformationMapping_.resize(1);
-  this->transformationWeight_.resize(1);
-
-  TransformationIndexMap& transMap = this->transformationMapping_[0];
-  TransformationWeightMap& transWeight = this->transformationWeight_[0];
-
-  CArray<int,1>& axisDstIndex = axisDest_->index;
-
-  int nbAxisIdx = axisDstIndex.numElements();
-  for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
-  {
-    int globalAxisIdx = axisDstIndex(idxAxis);
-    if (idxAxis==0)
-    {
-      transMap[globalAxisIdx].resize(1);
-      transWeight[globalAxisIdx].resize(1);
-      transMap[globalAxisIdx][0] = 0 ;
-      transWeight[globalAxisIdx][0] = 1.0 ;
-    }
-  }
-}
-CATCH
 
 }
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_temporal_splitting.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_temporal_splitting.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_temporal_splitting.hpp	(revision 2007)
@@ -10,43 +10,38 @@
 #define __XIOS_AXIS_ALGORITHM_TEMPORAL_SPLITTING_HPP__
 
-#include "axis_algorithm_transformation.hpp"
 #include "transformation.hpp"
+#include "algorithm_transformation_no_data_modification.hpp" 
+namespace xios 
+{
 
-namespace xios {
+  class CAxis;
+  class CScalar;
+  class CTemporalSplitting;
 
-class CAxis;
-class CScalar;
-class CTemporalSplitting;
-
-
-
-/*!
-  \class CAxisAlgorithmExtractDomain
-  Extract a domain to an axis
-*/
-class CAxisAlgorithmTemporalSplitting : public CAxisAlgorithmTransformation
-{
-public:
-  CAxisAlgorithmTemporalSplitting(bool isSource, CAxis* axisDestination, CScalar* scalarSource, CTemporalSplitting* algo);
-
-  virtual ~CAxisAlgorithmTemporalSplitting();
-
-  static bool registerTrans();
-
-protected:
-  void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
-
-private:
-  static CGenericAlgorithmTransformation* create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
-                                                CTransformation<CAxis>* transformation,
-                                                int elementPositionInGrid,
-                                                std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
-                                                std::map<int, int>& elementPositionInGridSrc2AxisPosition,
-                                                std::map<int, int>& elementPositionInGridSrc2DomainPosition,
-                                                std::map<int, int>& elementPositionInGridDst2ScalarPosition,
-                                                std::map<int, int>& elementPositionInGridDst2AxisPosition,
-                                                std::map<int, int>& elementPositionInGridDst2DomainPosition);
-  static bool dummyRegistered_;
-};
+  /*!
+    \class CAxisAlgorithmExtractDomain
+    Extract a domain to an axis
+  */
+  class CAxisAlgorithmTemporalSplitting : public CAlgorithmTransformationNoDataModification  
+  {
+    public:
+      CAxisAlgorithmTemporalSplitting(bool isSource, CAxis* axisDestination, CScalar* scalarSource, CTemporalSplitting* algo);
+      virtual ~CAxisAlgorithmTemporalSplitting();
+      static bool registerTrans();
+      virtual CTransformFilter* createTransformFilter(CGarbageCollector& gc, CGridAlgorithm* algo, bool detectMissingValues, double defaultValue) ;
+    
+    private:
+      static CGenericAlgorithmTransformation* create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
+                                                     CTransformation<CAxis>* transformation,
+                                                     int elementPositionInGrid,
+                                                     std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
+                                                     std::map<int, int>& elementPositionInGridSrc2AxisPosition,
+                                                     std::map<int, int>& elementPositionInGridSrc2DomainPosition,
+                                                     std::map<int, int>& elementPositionInGridDst2ScalarPosition,
+                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition,
+                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition);
+    int nrecords_;
+    static bool dummyRegistered_;
+  };
 
 }
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_compute_connectivity.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_compute_connectivity.cpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_compute_connectivity.cpp	(revision 2007)
@@ -38,4 +38,5 @@
 
 bool CDomainAlgorithmComputeConnectivity::dummyRegistered_ = CDomainAlgorithmComputeConnectivity::registerTrans();
+
 bool CDomainAlgorithmComputeConnectivity::registerTrans()
 TRY
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_interpolate.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_interpolate.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_interpolate.hpp	(revision 2007)
@@ -84,5 +84,5 @@
 
 
-private:
+public:
 
   static CGenericAlgorithmTransformation* create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_reorder.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_reorder.cpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_reorder.cpp	(revision 2007)
@@ -45,4 +45,6 @@
 {
   reorderDomain->checkValid(domainSource);
+  domainDestination->checkAttributes() ; // for now but maybe use domainSource as template for domain destination
+
   if (domainDestination->type !=  CDomain::type_attr::rectilinear)
   {
@@ -115,4 +117,6 @@
     }
   }
+
+  domainDestination->checkAttributes() ;
 }
 CATCH
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/generic_algorithm_transformation.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/generic_algorithm_transformation.cpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/generic_algorithm_transformation.cpp	(revision 2007)
@@ -16,4 +16,6 @@
 #include "transform_connector.hpp"
 #include "weight_transform_connector.hpp"
+#include "grid_algorithm_generic.hpp"
+#include "transform_filter.hpp"
 
 namespace xios 
@@ -1145,39 +1147,18 @@
 CGridAlgorithm* CGenericAlgorithmTransformation::createGridAlgorithm(CGrid* gridSrc, CGrid* gridDst, int pos)
 {
-  return new CGridAlgorithm(gridSrc, gridDst, pos, this) ;
-}
-
-
-void CGenericAlgorithmTransformation::computeAlgorithm(CLocalView* srcView, CLocalView* dstView)
-{
- 
-  this->computeRecvElement(srcView, dstView) ;
-/*
-  transformConnector_ = new CTransformConnector(srcView, recvElement.getView(CElementView::FULL), CContext::getCurrent()->getIntraComm())  ;
-  transformConnector_->computeConnector() ; 
-*/
-  weightTransformConnector_ = new  CWeightTransformConnector(recvElement_->getView(CElementView::FULL), dstView, transformationMapping_[0], transformationWeight_[0]) ; 
-}
- 
-void CGenericAlgorithmTransformation::computeRecvElement(CLocalView* srcView, CLocalView* dstView)
-{
-  auto& srcMap = transformationMapping_[0] ;
-  set<size_t> srcIndex ;
-  for(auto& it : srcMap)
-    for(size_t index : it.second) srcIndex.insert(index) ;
-
-  CArray<size_t,1> srcArrayIndex(srcIndex.size()) ;
-  int i=0 ;
-  for(size_t index : srcIndex) { srcArrayIndex(i) = index ; i++ ;}
-  recvElement_ = new CLocalElement(CContext::getCurrent()->getIntraCommRank(), srcView->getGlobalSize(), srcArrayIndex) ;
-  recvElement_->addFullView() ;
+  return new CGridAlgorithmGeneric(gridSrc, gridDst, pos, this) ;
+}
+
+
+
+CTransformFilter* CGenericAlgorithmTransformation::createTransformFilter(CGarbageCollector& gc, CGridAlgorithm* algo, bool detectMissingValues, double defaultValue)
+{
+  return new CTransformFilter(gc, algo, detectMissingValues, defaultValue) ;
 }
 
 void CGenericAlgorithmTransformation::apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
 {
-  //CArray<double,1> dataOutTmp ;
-  //transformConnector_->transfer(dimBefore, dimAfter, dataIn, dataOutTmp) ;
-  weightTransformConnector_ -> transfer(dimBefore, dimAfter, dataIn, dataOut) ;
-}
-
-}
+  // tranform into pure virtual funtion later
+  abort() ;
+}
+}
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/generic_algorithm_transformation.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/generic_algorithm_transformation.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/generic_algorithm_transformation.hpp	(revision 2007)
@@ -25,4 +25,6 @@
   class CScalar;
   class CGridAlgorithm ;
+  class CTransformFilter ;
+  class CGarbageCollector ;
 
   /*!
@@ -182,8 +184,7 @@
   public : 
   
-    virtual void computeAlgorithm(CLocalView* srcView, CLocalView* dstView) ;
-    virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut);
     virtual CGridAlgorithm* createGridAlgorithm(CGrid* gridSrc, CGrid* newGrid, int pos) ;
-    virtual void computeRecvElement(CLocalView* srcView, CLocalView* dstView) ;
+    virtual CTransformFilter* createTransformFilter(CGarbageCollector& gc, CGridAlgorithm* algo, bool detectMissingValues, double defaultValue) ;
+    virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut); // transform into pure virtual function later
   protected :
 
@@ -192,8 +193,4 @@
     CLocalElement* getRecvElement(void) { return recvElement_ ;}
   
-  protected:
-    CTransformConnector* transformConnector_ ;
-    CWeightTransformConnector* weightTransformConnector_ ;
-
 };
 
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm.cpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm.cpp	(revision 2007)
@@ -1,83 +1,11 @@
 #include "grid_algorithm.hpp"
-#include "grid_elements.hpp"
-#include "grid_local_view.hpp"
-#include "grid.hpp"
-#include "algo_types.hpp"
-#include "context.hpp"
+#include "generic_algorithm_transformation.hpp"
 
 namespace xios
 {
 
-  CGridAlgorithm::CGridAlgorithm(CGrid* gridSrc, CGrid* gridDst, int pos,  CGenericAlgorithmTransformation* algo)
-  : gridSrc_(gridSrc), gridDst_(gridDst), pos_(pos), algorithm_(algo)
-  {
-    //! Scalar
-    CScalarAlgorithmReduceAxis::registerTrans();
-    CScalarAlgorithmExtractAxis::registerTrans();
-    CScalarAlgorithmReduceDomain::registerTrans();
-    CScalarAlgorithmReduceScalar::registerTrans();
-
-    //! Axis
-    CAxisAlgorithmZoom::registerTrans();
-    CAxisAlgorithmExtractDomain::registerTrans();
-    CAxisAlgorithmInterpolate::registerTrans();
-    CAxisAlgorithmExtract::registerTrans();
-    CAxisAlgorithmInverse::registerTrans();
-    CAxisAlgorithmReduceDomain::registerTrans();
-    CAxisAlgorithmReduceAxis::registerTrans();
-    CAxisAlgorithmTemporalSplitting::registerTrans();
-    CAxisAlgorithmDuplicateScalar::registerTrans();
-
-    //! Domain
-    CDomainAlgorithmComputeConnectivity::registerTrans();
-    CDomainAlgorithmInterpolate::registerTrans();
-    CDomainAlgorithmZoom::registerTrans();
-    CDomainAlgorithmExpand::registerTrans();
-    CDomainAlgorithmReorder::registerTrans();
-    CDomainAlgorithmExtract::registerTrans();
-
-    this->computeAlgorithm() ;
-  }
-
-  void CGridAlgorithm::computeAlgorithm(void)
-  {
-    CGridLocalElements* gridSrcElements = gridSrc_->getGridLocalElements() ;
-    CGridLocalElements* gridDstElements = gridDst_->getGridLocalElements() ;
-    
-    CGridLocalView* srcView = gridSrcElements->getView(CElementView::WORKFLOW) ;
-    CGridLocalView* dstView = gridDstElements->getView(CElementView::WORKFLOW) ;
-    MPI_Comm comm = CContext::getCurrent()->getIntraComm() ;
-    int commSize = CContext::getCurrent()->getIntraCommSize() ;
-    int commRank = CContext::getCurrent()->getIntraCommRank() ;
-    
-    auto& elements =  gridSrcElements->getElements() ;
-    int nElements = elements.size() ;
-    vector<CLocalElement*> remoteElements(nElements) ;
-    vector<CLocalView*> remoteViews(nElements) ;
-    for(int i=0;i<nElements;i++)
-    {
-      if (i==pos_) remoteElements[i] = algorithm_->getRecvElement() ;
-      else
-      { 
-        CArray<size_t,1> globalIndexView ;
-        srcView->getView(i)->getGlobalIndexView(globalIndexView) ;
-        remoteElements[i] = new CLocalElement(commRank, srcView->getView(i)->getGlobalSize(),globalIndexView) ;
-        remoteElements[i]->addFullView() ;
-        if (i>pos_) dimBefore_ *= srcView->getView(i)->getSize() ;
-        else dimAfter_ *= srcView->getView(i)->getSize() ;
-          
-      }
-      remoteViews[i] = remoteElements[i] -> getView(CElementView::FULL);
-    }
-
-    gridTransformConnector_ = new CGridTransformConnector(srcView->getViews(), remoteViews, comm ) ;
- 
-  }
-
-  void CGridAlgorithm::apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
-  {
-    CArray<double,1> dataOutTmp ;
-    gridTransformConnector_->transfer(dataIn, dataOutTmp) ;
-    algorithm_->apply(dimBefore_, dimAfter_, dataOutTmp, dataOut) ;
+  CTransformFilter* CGridAlgorithm::createTransformFilter(CGarbageCollector& gc, bool detectMissingValues, double defaultValue)
+  {  
+    return algorithm_->createTransformFilter(gc, this, detectMissingValues, defaultValue) ;
   }
 
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm.hpp	(revision 2006)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm.hpp	(revision 2007)
@@ -1,4 +1,4 @@
-#ifndef __XIOS_GRID_ALGORITHM_TRANSFORMATION_HPP__
-#define __XIOS_GRID_ALGORITHM_TRANSFORMATION_HPP__
+#ifndef __XIOS_GRID_ALGORITHM_HPP__
+#define __XIOS_GRID_ALGORITHM_HPP__
 
 #include "grid_transform_connector.hpp"
@@ -16,21 +16,17 @@
   This class defines the interface for all other inherited algorithms class
   */
+class CTransformFilter ;
+class CGarbageCollector ;
+
 class CGridAlgorithm
 {
   public:
-    CGridAlgorithm(CGrid* gridSrc, CGrid* gridDst, int pos,  CGenericAlgorithmTransformation* algo) ;
-    virtual void computeAlgorithm(void) ;
-    
-    void apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut) ;
-
-  private:
-    CGenericAlgorithmTransformation* algorithm_=nullptr ;
-    CGridTransformConnector* gridTransformConnector_=nullptr ;
-    CGrid* gridSrc_ = nullptr ;
-    CGrid* gridDst_ = nullptr ;
-    int pos_ ;
-    int dimBefore_=1 ;
-    int dimAfter_=1 ;
-
+    CGridAlgorithm(CGenericAlgorithmTransformation* algorithm) : algorithm_(algorithm)  {} ;
+    virtual ~CGridAlgorithm() {} ;
+    virtual void apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut)=0 ;
+    virtual CTransformFilter* createTransformFilter(CGarbageCollector& gc, bool detectMissingValues, double defaultValue) ;
+   
+    protected:
+      CGenericAlgorithmTransformation* algorithm_=nullptr ;
 };
 
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_generic.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_generic.cpp	(revision 2007)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_generic.cpp	(revision 2007)
@@ -0,0 +1,62 @@
+#include "grid_algorithm_generic.hpp"
+#include "grid_elements.hpp"
+#include "grid_local_view.hpp"
+#include "grid.hpp"
+#include "algo_types.hpp"
+#include "context.hpp"
+#include "transform_filter.hpp"
+
+namespace xios
+{
+
+  CGridAlgorithmGeneric::CGridAlgorithmGeneric(CGrid* gridSrc, CGrid* gridDst, int pos,  CGenericAlgorithmTransformation* algo)
+  : CGridAlgorithm(algo), gridSrc_(gridSrc), gridDst_(gridDst), pos_(pos)
+  {
+    computeAlgorithm() ;
+  }
+
+  void CGridAlgorithmGeneric::computeAlgorithm(void)
+  {
+    CGridLocalElements* gridSrcElements = gridSrc_->getGridLocalElements() ;
+    CGridLocalElements* gridDstElements = gridDst_->getGridLocalElements() ;
+    
+    CGridLocalView* srcView = gridSrcElements->getView(CElementView::WORKFLOW) ;
+    CGridLocalView* dstView = gridDstElements->getView(CElementView::WORKFLOW) ;
+    MPI_Comm comm = CContext::getCurrent()->getIntraComm() ;
+    int commSize = CContext::getCurrent()->getIntraCommSize() ;
+    int commRank = CContext::getCurrent()->getIntraCommRank() ;
+    
+    auto& elements =  gridSrcElements->getElements() ;
+    int nElements = elements.size() ;
+    vector<CLocalElement*> remoteElements(nElements) ;
+    vector<CLocalView*> remoteViews(nElements) ;
+    for(int i=0;i<nElements;i++)
+    {
+      if (i==pos_) remoteElements[i] = algorithm_->getRecvElement() ;
+      else
+      { 
+        CArray<size_t,1> globalIndexView ;
+        srcView->getView(i)->getGlobalIndexView(globalIndexView) ;
+        remoteElements[i] = new CLocalElement(commRank, srcView->getView(i)->getGlobalSize(),globalIndexView) ;
+        remoteElements[i]->addFullView() ;
+        if (i>pos_) dimBefore_ *= srcView->getView(i)->getSize() ;
+        else dimAfter_ *= srcView->getView(i)->getSize() ;
+          
+      }
+      remoteViews[i] = remoteElements[i] -> getView(CElementView::FULL);
+    }
+
+    gridTransformConnector_ = new CGridTransformConnector(srcView->getViews(), remoteViews, comm ) ;
+ 
+  }
+
+  void CGridAlgorithmGeneric::apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
+  {
+    CArray<double,1> dataOutTmp ;
+    gridTransformConnector_->transfer(dataIn, dataOutTmp) ;
+    algorithm_->apply(dimBefore_, dimAfter_, dataOutTmp, dataOut) ;
+  }
+
+  
+
+}
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_generic.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_generic.hpp	(revision 2007)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_generic.hpp	(revision 2007)
@@ -0,0 +1,42 @@
+#ifndef __XIOS_GRID_ALGORITHM_GENERIC_HPP__
+#define __XIOS_GRID_ALGORITHM_GENERIC_HPP__
+
+#include "grid_transform_connector.hpp"
+#include <map>
+#include "array_new.hpp"
+#include "local_view.hpp"
+#include "grid_algorithm.hpp" 
+
+namespace xios
+{
+  class CGrid;
+  class CGenericAlgorithmTransformation ;
+
+  /*!
+  \class CGenericAlgorithmTransformation
+  This class defines the interface for all other inherited algorithms class
+  */
+class CTransformFilter ;
+class CGarbageCollector ;
+
+class CGridAlgorithmGeneric : public CGridAlgorithm
+{
+  public:
+    CGridAlgorithmGeneric(CGrid* gridSrc, CGrid* gridDst, int pos,  CGenericAlgorithmTransformation* algo) ;
+    virtual ~CGridAlgorithmGeneric() {} ;
+
+    void computeAlgorithm(void) ;
+    virtual void apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut) ;
+ 
+  protected:
+    CGridTransformConnector* gridTransformConnector_=nullptr ;
+    CGrid* gridSrc_ = nullptr ;
+    CGrid* gridDst_ = nullptr ;
+    int pos_ ;
+    int dimBefore_=1 ;
+    int dimAfter_=1 ;
+
+};
+
+}
+#endif // __XIOS_GRID_ALGORITHM_GENERIC_HPP__
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_no_data_modification.cpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_no_data_modification.cpp	(revision 2007)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_no_data_modification.cpp	(revision 2007)
@@ -0,0 +1,10 @@
+#include "grid_algorithm_no_data_modification.hpp"
+
+namespace xios
+{
+  void CGridAlgorithmNoDataModification::apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
+  {
+    dataOut.reference(dataIn) ;
+  }
+  
+}
Index: /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_no_data_modification.hpp
===================================================================
--- /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_no_data_modification.hpp	(revision 2007)
+++ /XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm_no_data_modification.hpp	(revision 2007)
@@ -0,0 +1,28 @@
+#ifndef __XIOS_GRID_ALGORITHM_NO_DATA_MODIFICATION_HPP__
+#define __XIOS_GRID_ALGORITHM_NO_DATA_MODIFICATION_HPP__
+
+#include "grid_algorithm.hpp"
+namespace xios
+{
+  class CGrid;
+  class CGenericAlgorithmTransformation ;
+
+  /*!
+  \class CGenericAlgorithmTransformation
+  This class defines the interface for all other inherited algorithms class
+  */
+class CTransformFilter ;
+class CGarbageCollector ;
+class CGenericAlgorithmTransformation ;
+
+class CGridAlgorithmNoDataModification : public CGridAlgorithm
+{
+  public:
+    CGridAlgorithmNoDataModification(CGenericAlgorithmTransformation* algo) : CGridAlgorithm(algo) {}
+    ~CGridAlgorithmNoDataModification(void) {};
+    void computeAlgorithm(void) {} ;
+    virtual void apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut) ;
+};
+
+}
+#endif // __XIOS_GRID_ALGORITHM_NO_DATA_MODIFICATION_HPP__
