Index: XIOS/dev/dev_trunk_graph/src/filter/client_to_server_store_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/filter/client_to_server_store_filter.cpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/filter/client_to_server_store_filter.cpp	(revision 2021)
@@ -38,11 +38,13 @@
       this->graphPackage->filterId = CWorkflowGraph::getNodeSize();
       if(!data[0]->graphPackage) data[0]->graphPackage = new CGraphDataPackage;
-      data[0]->graphPackage->currentField = this->graphPackage->inFields[0];
+      
       std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end());
       
-      CWorkflowGraph::addNode("Client to Server Store filter", 5, true, 1, data[0]);
-      
+      CWorkflowGraph::addNode("Client to Server Store filter", 6, true, 1, data[0]);
+     
       CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]);
-      data[0]->graphPackage->fromFilter = this->graphPackage->filterId;
+      // flux can be redirected to other filters. So don't change the 'from' parameter
+      //data[0]->graphPackage->fromFilter = this->graphPackage->filterId;
+      data[0]->graphPackage->currentField = this->graphPackage->inFields[0];
     }
   }
Index: XIOS/dev/dev_trunk_graph/src/filter/pass_through_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/filter/pass_through_filter.cpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/filter/pass_through_filter.cpp	(revision 2021)
@@ -19,4 +19,10 @@
     if(this->graphEnabled)
     {
+      if(data[0]->graphPackage->currentField->getId() == this->graphPackage->inFields[0]->getId())
+      {
+        std::cout<<"PASS THROUGH FILTER OMITTED "<<this<<std::endl;
+        std::cout<<data[0]->graphPackage->currentField->getId()<< "-------"<< this->graphPackage->inFields[0]->getId()<<std::endl;
+        return;
+      }
       this->graphPackage->filterId = CWorkflowGraph::getNodeSize();
       
@@ -26,9 +32,9 @@
         data[0]->graphPackage->fromFilter = -1;
       }
-          
+      
+      CWorkflowGraph::addNode("Pass through filter", 2, false, 1, data[0]);
       data[0]->graphPackage->currentField = this->graphPackage->inFields[0];
       std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end());
       
-      CWorkflowGraph::addNode("Pass through filter", 2, false, 1, data[0]);
       CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]);
       data[0]->graphPackage->fromFilter = this->graphPackage->filterId;
Index: XIOS/dev/dev_trunk_graph/src/filter/temporal_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/filter/temporal_filter.cpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/filter/temporal_filter.cpp	(revision 2021)
@@ -34,7 +34,8 @@
     if(this->graphEnabled)
     {
-      if(!data[0]->graphPackage) data[0]->graphPackage = new CGraphDataPackage;
-      data[0]->graphPackage->currentField = this->graphPackage->inFields[0];
-      std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end());
+      if(!data[0]->graphPackage)
+      {
+        data[0]->graphPackage = new CGraphDataPackage;
+      }
       
       if(this->graphPackage->sourceFilterIds.size()==0)
@@ -46,5 +47,7 @@
       CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]);
       data[0]->graphPackage->fromFilter = this->graphPackage->filterId;
-      this->graphPackage->sourceFilterIds.push_back(data[0]->graphPackage->fromFilter);    
+      this->graphPackage->sourceFilterIds.push_back(data[0]->graphPackage->fromFilter); 
+      data[0]->graphPackage->currentField = this->graphPackage->inFields[0];
+      std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end());
     }
 
Index: XIOS/dev/dev_trunk_graph/src/filter/transform_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/filter/transform_filter.cpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/filter/transform_filter.cpp	(revision 2021)
@@ -1,5 +1,5 @@
 #include "transform_filter.hpp"
 #include "grid_algorithm.hpp"
-
+#include "workflow_graph.hpp"
 namespace xios
 {
@@ -19,7 +19,10 @@
     packet->timestamp = data[0]->timestamp;
     packet->status = data[0]->status;
-
+    
     if (packet->status == CDataPacket::NO_ERROR) 
     {
+      cout<<"transformeFilter = "<<this<<" and graphEnabled = "<<this->graphEnabled<<std::endl;
+      buildWorkflowGraph(data, packet, algorithm_);
+      
       if (data.size()>1)
       {
@@ -33,5 +36,27 @@
   }
 
-
+  void CTransformFilter::buildWorkflowGraph(std::vector<CDataPacketPtr> data, CDataPacketPtr packet, CGridAlgorithm* algorithm)
+  {
+    if(this->graphEnabled)
+    {
+      this->graphPackage->filterId = CWorkflowGraph::getNodeSize();
+    
+      packet->graphPackage = new CGraphDataPackage;
+      if(data[0]->graphPackage)
+      {
+        packet->graphPackage->fromFilter = data[0]->graphPackage->fromFilter;
+      }
+      packet->graphPackage->toFilter = data[0]->graphPackage->toFilter;
+      packet->graphPackage->current_filter_name = data[0]->graphPackage->current_filter_name;
+      packet->graphPackage->contextId = data[0]->graphPackage->contextId;          
+      packet->graphPackage->currentField = data[0]->graphPackage->currentField;//this->graphPackage->inFields[0];
+      std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end());
+    
+      CWorkflowGraph::addNode("Spatial transform filter "+algorithm->getAlgoName(), 4, false, 1, packet);
+      CWorkflowGraph::addEdge(packet->graphPackage->fromFilter, this->graphPackage->filterId, packet);
+      packet->graphPackage->fromFilter = this->graphPackage->filterId;
+      packet->graphPackage->currentField = this->graphPackage->inFields[0];
+    }
+  }
 
 }
Index: XIOS/dev/dev_trunk_graph/src/filter/transform_filter.hpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/filter/transform_filter.hpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/filter/transform_filter.hpp	(revision 2021)
@@ -22,4 +22,6 @@
       */
       CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data) ;
+      void buildWorkflowGraph(std::vector<CDataPacketPtr> data, CDataPacketPtr packet, CGridAlgorithm* algorithm);
+      
 //      void apply(const CArray<double, 1>& dataSrc, CArray<double,1>& dataDest);
      
Index: XIOS/dev/dev_trunk_graph/src/graph_package.hpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/graph_package.hpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/graph_package.hpp	(revision 2021)
@@ -20,5 +20,6 @@
     int distanceFromStart=-1;
     StdString contextId;
-    
+
+    CGraphDataPackage(): fromFilter(-1) {}
   }; 
 } // namespace xios
Index: XIOS/dev/dev_trunk_graph/src/node/field.cpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/node/field.cpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/node/field.cpp	(revision 2021)
@@ -614,7 +614,7 @@
         // new
         
-        std::pair<std::shared_ptr<CFilter>, std::shared_ptr<CFilter> > filters = grid->buildTransformationGraph(gc, false,  gridSrc, detectMissingValues, defaultValue, newGrid, buildGraph_) ;
+        std::pair<std::shared_ptr<CFilter>, std::shared_ptr<CFilter> > filters = grid->buildTransformationGraph(gc, false,  gridSrc, detectMissingValues, defaultValue, newGrid, buildGraph_, this) ;
         lastFilter->connectOutput(filters.first, 0);
-        if(buildGraph_)
+        /*if(buildGraph_)
         {
           std::cout<<"============== field "<<this->getId()<<" calls a transformation filter 1 ============== "<<lastFilter<<" _ "<<filters.first<<" ***** "<<CXios::isClient<<std::endl;
@@ -622,5 +622,5 @@
           filters.first->graphPackage = new CGraphPackage;
           filters.first->graphPackage->inFields.push_back(this);
-        }
+        }*/
         lastFilter = filters.second;
         gridSrc = newGrid ;
Index: XIOS/dev/dev_trunk_graph/src/node/grid.cpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/node/grid.cpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/node/grid.cpp	(revision 2021)
@@ -1691,5 +1691,5 @@
 
   std::pair<std::shared_ptr<CFilter>, std::shared_ptr<CFilter> > 
-  CGrid::buildTransformationGraph(CGarbageCollector& gc, bool isSource, CGrid* gridSrc, double detectMissingValues, double defaultValue, CGrid*& newGrid, bool graphEnabled)
+  CGrid::buildTransformationGraph(CGarbageCollector& gc, bool isSource, CGrid* gridSrc, double detectMissingValues, double defaultValue, CGrid*& newGrid, bool graphEnabled, CField* field)
   TRY
   {
@@ -1714,5 +1714,6 @@
     else  
     {
-      cout<<"Create new grid : "<<newId<<endl ;
+      StdString role = CXios::isClient? "Client ": "Server ";
+      cout<<role<<"Create new grid : "<<newId<<endl ;
       newGrid = CGrid::create(newId) ;
       isNewGrid = true ;
@@ -1986,4 +1987,11 @@
         shared_ptr<CTransformFilter> transformFilter = shared_ptr<CTransformFilter>(gridAlgorithm->createTransformFilter(gc, detectMissingValues, defaultValue)) ;
         outputFilter->connectOutput(transformFilter,0) ;
+        if(graphEnabled)
+        {
+          transformFilter->graphEnabled=true;
+          transformFilter->graphPackage = new CGraphPackage;
+          transformFilter->graphPackage->inFields.push_back(field);
+        }
+        
         vector<string> auxFieldId = algo->getAuxFieldId() ; // better to do that at transformation not algo ??
         int i=1; 
@@ -1994,4 +2002,5 @@
           auxField->getInstantDataFilter()->connectOutput(transformFilter,i) ;
           i++ ;
+          
         }
         outputFilter = transformFilter ;
Index: XIOS/dev/dev_trunk_graph/src/node/grid.hpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/node/grid.hpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/node/grid.hpp	(revision 2021)
@@ -215,5 +215,5 @@
       public:
          pair<shared_ptr<CFilter>, shared_ptr<CFilter> > buildTransformationGraph(CGarbageCollector& gc, bool isSource, CGrid* gridSrc, double detectMissingValues,
-                                                                                  double defaultValue, CGrid*& newGrid, bool graphEnabled=false) ;
+                                                                                  double defaultValue, CGrid*& newGrid, bool graphEnabled=false, CField* field=nullptr) ;
       private:
         CGridAlgorithm* gridAlgorithm_ = nullptr ;
Index: XIOS/dev/dev_trunk_graph/src/transformation/algorithm_transformation_transfer.hpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/transformation/algorithm_transformation_transfer.hpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/transformation/algorithm_transformation_transfer.hpp	(revision 2021)
@@ -17,4 +17,5 @@
       virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, CArray<double,1>& dataOut);
       virtual void computeRecvElement(CLocalView* srcView, CLocalView* dstView) ;
+      virtual StdString getAlgoName() {return "CAlgorithm transformation Transfer";}
    
     protected:
Index: XIOS/dev/dev_trunk_graph/src/transformation/domain_algorithm/domain_algorithm_extract.hpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/transformation/domain_algorithm/domain_algorithm_extract.hpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/transformation/domain_algorithm/domain_algorithm_extract.hpp	(revision 2021)
@@ -21,4 +21,5 @@
 
   virtual ~CDomainAlgorithmExtract() {}
+  virtual StdString getAlgoName() {return "\\nextract_domain";}
 
   static bool registerTrans();
Index: XIOS/dev/dev_trunk_graph/src/transformation/generic_algorithm_transformation.hpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/transformation/generic_algorithm_transformation.hpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/transformation/generic_algorithm_transformation.hpp	(revision 2021)
@@ -41,4 +41,6 @@
     virtual void apply(int dimBefore, int dimAfter, const CArray<double,1>& dataIn, const vector<CArray<double,1>>& auxData, CArray<double,1>& dataOut) { abort() ;} //=0
     virtual bool isGenerateTransformation(void) { return false ;}
+    
+    virtual StdString getAlgoName() { return "Generic algorithm transformation";}
 
     virtual vector<string> getAuxFieldId(void) ;
Index: XIOS/dev/dev_trunk_graph/src/transformation/grid_algorithm.cpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/transformation/grid_algorithm.cpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/transformation/grid_algorithm.cpp	(revision 2021)
@@ -13,4 +13,10 @@
   { 
     return algorithm_->isGenerateTransformation() ;
-  }  
+  } 
+
+
+  StdString CGridAlgorithm::getAlgoName()
+  {
+    return algorithm_->getAlgoName();
+  } 
 }
Index: XIOS/dev/dev_trunk_graph/src/transformation/grid_algorithm.hpp
===================================================================
--- XIOS/dev/dev_trunk_graph/src/transformation/grid_algorithm.hpp	(revision 2020)
+++ XIOS/dev/dev_trunk_graph/src/transformation/grid_algorithm.hpp	(revision 2021)
@@ -28,4 +28,5 @@
     virtual CTransformFilter* createTransformFilter(CGarbageCollector& gc, bool detectMissingValues, double defaultValue) ;
     virtual bool isGenerateTranformation(void) ;
+    virtual StdString getAlgoName() ;
    
     protected:
