Index: XIOS/dev/dev_trunk_omp/GENERIC_TESTCASE/context_atm.xml
===================================================================
--- XIOS/dev/dev_trunk_omp/GENERIC_TESTCASE/context_atm.xml	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/GENERIC_TESTCASE/context_atm.xml	(revision 1680)
@@ -363,5 +363,5 @@
   <file_definition  type="one_file" >
     
-    <file id="atm_output" output_freq="1ts" type="one_file" enabled="true">
+    <file id="atm_output" output_freq="4ts" type="one_file" enabled="true">
 <!--      <field field_ref="field3D" />
       <field field_ref="field2D" /> 
Index: XIOS/dev/dev_trunk_omp/inputs/iodef.xml
===================================================================
--- XIOS/dev/dev_trunk_omp/inputs/iodef.xml	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/inputs/iodef.xml	(revision 1680)
@@ -17,15 +17,15 @@
 
 
-   <file_definition type="one_file" par_access="collective" output_freq="4h" output_level="10" >
+   <file_definition type="one_file" par_access="collective" output_freq="1h" output_level="10" >
       <file id="output" name="output" enabled=".TRUE.">
         <!-- <field field_ref="field_Domain" name="field_A" /> -->
-        <field field_ref="field_A" name="field_A_name"  build_workflow_graph=".FALSE." /> 
-        <field field_ref="field_B" name="field_B_name"  build_workflow_graph=".FALSE."/> 
+        <field field_ref="field_A" name="field_A_name"  build_workflow_graph=".TRUE." /> 
+        <field field_ref="field_B" name="field_B_name"  build_workflow_graph=".TRUE."/> 
         <!-- <field field_ref="field_C" name="field_C_name" enabled=".TRUE." />  -->
-        <field id="field_D" field_ref="field_A" operation="instant" build_workflow_graph=".TRUE." name="field_D_name" build_workflow_graph_start="1h"  > field_A + field_B</field>
-        <!-- <field id="field_E" field_ref="field_A" operation="instant" build_workflow_graph=".TRUE." name="field_E_name" build_workflow_graph_start="1h" > field_D*2 </field> -->
+        <field id="field_D" field_ref="field_A" operation="instant" build_workflow_graph=".TRUE." name="field_D_name" build_workflow_graph_start="1h" > sqrt(field_A) + sqrt(field_B) + sqrt(field_C) </field>
+        <field id="field_E" field_ref="field_A" operation="instant" build_workflow_graph=".TRUE." name="field_E_name" build_workflow_graph_start="1h" > sqrt(field_A) + sqrt(field_B) + sqrt(field_C)</field>
         <!-- <field field_ref="field_A_zoom" name="field_B" build_workflow_graph=".TRUE."/> -->
      </file>
-     <file id="output1" name="output1" output_freq="8h" enabled=".FALSE.">
+     <file id="output1" name="output1" output_freq="8h" enabled=".TRUE.">
         <!-- <field field_ref="field_Domain" name="field_A" /> -->
         <field id="field_F" field_ref="field_A" name="field_A_zoom" grid_ref="grid_A_zoom" build_workflow_graph=".TRUE."   />        
Index: XIOS/dev/dev_trunk_omp/src/attribute.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute.hpp	(revision 1680)
@@ -42,4 +42,5 @@
             virtual void fromString(const StdString & str) = 0;
             virtual StdString dump(void) const = 0;
+            virtual StdString dump2(void) const = 0;
             virtual bool isEqual(const CAttribute& ) = 0;
 
Index: XIOS/dev/dev_trunk_omp/src/attribute_array.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_array.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_array.hpp	(revision 1680)
@@ -56,4 +56,5 @@
             virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer); }
             virtual string dump(void) const { return _dump();}
+            virtual string dump2(void) const { return _dump2();}
 
             virtual void generateCInterface(ostream& oss,const string& className) ;
@@ -71,4 +72,5 @@
           StdString _toString(void) const;
           StdString _dump(void) const;
+          StdString _dump2(void) const;
           void _fromString(const StdString & str);
           bool _toBuffer  (CBufferOut& buffer) const;
Index: XIOS/dev/dev_trunk_omp/src/attribute_array_impl.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_array_impl.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_array_impl.hpp	(revision 1680)
@@ -138,4 +138,13 @@
     }
 
+    template <typename T_numtype, int N_rank>
+    StdString CAttributeArray<T_numtype,N_rank>::_dump2(void) const
+    {
+      StdOStringStream oss;
+      if (! isEmpty() && this->hasId() && (this->numElements()!=0))
+        oss << this->getName() << "=" << CArray<T_numtype, N_rank>::dump() << "";
+      return (oss.str());
+    }
+
 
       template <typename T_numtype, int N_rank>
Index: XIOS/dev/dev_trunk_omp/src/attribute_enum.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_enum.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_enum.hpp	(revision 1680)
@@ -63,4 +63,5 @@
             virtual void fromString(const StdString & str) { if (str==resetInheritanceStr) { reset(); _canInherite=false ;}  else _fromString(str);}
             virtual StdString dump(void) const { return _toString();}
+            virtual StdString dump2(void) const { return _dump2();}
 
             virtual bool toBuffer  (CBufferOut& buffer) const { return _toBuffer(buffer);} 
@@ -79,4 +80,5 @@
           bool isEqual_(const CAttributeEnum& attr );
           StdString _toString(void) const;
+          StdString _dump2(void) const;
           void _fromString(const StdString & str);
           bool _toBuffer  (CBufferOut& buffer) const;
Index: XIOS/dev/dev_trunk_omp/src/attribute_enum_impl.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_enum_impl.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_enum_impl.hpp	(revision 1680)
@@ -149,4 +149,15 @@
   }
 
+
+  template <class T>
+  StdString CAttributeEnum<T>::_dump2(void) const
+  {
+     StdOStringStream oss;
+     if (!CEnum<T>::isEmpty() && this->hasId())
+        oss << this->getName() << "=" << CEnum<T>::toString() << "</br>";
+     return (oss.str());
+  }
+
+
   template <class T>
   void CAttributeEnum<T>::_fromString(const StdString & str)
Index: XIOS/dev/dev_trunk_omp/src/attribute_map.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_map.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_map.cpp	(revision 1680)
@@ -48,4 +48,31 @@
             {
               str.append(att.second->dump());
+              str.append(" ");
+            }
+            else if (str.length() == maxNbChar)
+            {
+              str.append("...");
+            }
+          }
+        }
+        return str;
+      }
+
+
+
+      StdString CAttributeMap::recordXiosAttributes(void) const
+      {
+        int maxNbChar = 250;
+        StdString str;
+        typedef std::pair<StdString, CAttribute*> StdStrAttPair;
+        auto it = SuperClassMap::begin(), end = SuperClassMap::end();
+        for (; it != end; it++)
+        {
+          const StdStrAttPair& att = *it;
+          if (!att.second->isEmpty())
+          {
+            if (str.length() < maxNbChar)
+            {
+              str.append(att.second->dump2());
               str.append(" ");
             }
Index: XIOS/dev/dev_trunk_omp/src/attribute_map.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_map.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_map.hpp	(revision 1680)
@@ -39,4 +39,5 @@
             void clearAllAttributes(void);
             StdString dumpXiosAttributes(void) const;
+            StdString recordXiosAttributes(void) const;
 
             void clearAttribute(const StdString& key);
Index: XIOS/dev/dev_trunk_omp/src/attribute_template.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_template.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_template.hpp	(revision 1680)
@@ -74,4 +74,5 @@
 //            virtual void fromBinary(StdIStream & is);
             virtual StdString dump(void) const { return _dump();}
+            virtual StdString dump2(void) const { return _dump2();}
 
             virtual bool toBuffer  (CBufferOut& buffer) const { return _toBuffer(buffer);}
@@ -99,4 +100,5 @@
           StdString _toString(void) const;
           StdString _dump(void) const;
+          StdString _dump2(void) const;
           void _fromString(const StdString & str);
           bool _toBuffer  (CBufferOut& buffer) const;
Index: XIOS/dev/dev_trunk_omp/src/attribute_template_impl.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/attribute_template_impl.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/attribute_template_impl.hpp	(revision 1680)
@@ -208,4 +208,13 @@
          if (!CType<T>::isEmpty() && this->hasId())
             oss << this->getName() << "=\"" << CType<T>::dump() << "\"";
+         return (oss.str());
+      }
+
+      template <class T>
+         StdString CAttributeTemplate<T>::_dump2(void) const
+      {
+         StdOStringStream oss;
+         if (!CType<T>::isEmpty() && this->hasId())
+            oss << this->getName() << "=" << CType<T>::dump() << "</br>";
          return (oss.str());
       }
Index: XIOS/dev/dev_trunk_omp/src/cxios.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/cxios.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/cxios.cpp	(revision 1680)
@@ -174,10 +174,10 @@
        
        // CGraphviz::showStaticWorkflowGraph();
-       CGraphviz::buildWorkflowGraphDot();
+       // CGraphviz::buildWorkflowGraphDot();
        CGraphviz::buildWorkflowGraphVisjs_with_info();
 
-      StdString commande_string="dot -Tpdf graph.dot -o graph.pdf";  
-      const char* command=commande_string.c_str();
-      system(command);
+      // StdString commande_string="dot -Tpdf graph.dot -o graph.pdf";  
+      // const char* command=commande_string.c_str();
+      // system(command);
 
   
Index: XIOS/dev/dev_trunk_omp/src/filter/binary_arithmetic_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/binary_arithmetic_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/binary_arithmetic_filter.cpp	(revision 1680)
@@ -1,4 +1,6 @@
 #include "binary_arithmetic_filter.hpp"
 #include "workflow_graph.hpp"
+#include "yacc_var.hpp"
+#include "file.hpp"
 
 
@@ -10,27 +12,5 @@
     , value(value)
   { 
-    StdString input_op_expression=op;
-    if(input_op_expression == "add")
-      op_expression = "+";
-    else if(input_op_expression == "minus")
-      op_expression = "-";
-    else if(input_op_expression == "mult")
-      op_expression = "x";
-    else if(input_op_expression == "div")
-      op_expression = "/";
-    else if(input_op_expression == "eq")
-      op_expression = "=";
-    else if(input_op_expression == "lt")
-      op_expression = "<";
-    else if(input_op_expression == "gt")
-      op_expression = ">";
-    else if(input_op_expression == "le")
-      op_expression = "<=";
-    else if(input_op_expression == "ge")
-      op_expression = ">=";
-    else if(input_op_expression == "ne")
-      op_expression = "!=";
-    else
-      op_expression = " ";
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
   };
 
@@ -38,29 +18,52 @@
   {
     bool building_graph = this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph : false;
+    // bool building_graph = true;
+    int unique_filter_id;
 
     if(building_graph)
     {
-      this->filterID = InvalidableObject::filterIdGenerator++;   
-      int edgeID = InvalidableObject::edgeIdGenerator++; 
-
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
-
-      std::cout<<"CScalarFieldArithmeticFilter::apply filter tag = "<<this->tag<<std::endl;
-
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "S "+op_expression +" F Filter" ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp ;
-
-      if(CWorkflowGraph::build_begin)
-      {
-        CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
-
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
+      CWorkflowGraph::allocNodeEdge();
+
+      size_t filterhash = std::hash<StdString>{}(expression+to_string(data[0]->timestamp)+this->field->getId());
+
+      // first round
+      if(CWorkflowGraph::mapHashFilterID_ptr->find(filterhash) == CWorkflowGraph::mapHashFilterID_ptr->end())
+      {
+        this->filterID = InvalidableObject::filterIdGenerator++;
+        int edgeID = InvalidableObject::edgeIdGenerator++;
+
+        CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 0, data[0]);
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_tag = this->tag;
+
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+        if(this->field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
+      
+
+        if(CWorkflowGraph::build_begin)
+        {
+          CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb ++;
+
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
+        }
+        else CWorkflowGraph::build_begin = true;
+
+        (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash] = this->filterID; 
+        unique_filter_id = this->filterID;
       }
-      else CWorkflowGraph::build_begin = true;
+      // not first round
+      else 
+      {
+        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash];
+        if(data[0]->src_filterID != unique_filter_id)
+        {
+          int edgeID = InvalidableObject::edgeIdGenerator++;
+          CWorkflowGraph::addEdge(edgeID, unique_filter_id, data[0]);  
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ; 
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[unique_filter_id].expected_entry_nb ++;
+        }
+      
+        
+      }  
     }
 
@@ -69,5 +72,5 @@
     packet->timestamp = data[0]->timestamp;
     packet->status = data[0]->status;
-    if(building_graph) packet->src_filterID = this->filterID;
+    if(building_graph) packet->src_filterID = unique_filter_id;
     packet->field = this->field;
 
@@ -83,29 +86,5 @@
     , value(value)
   { 
-    StdString input_op_expression=op;
-    if(input_op_expression == "add")
-      op_expression = "+";
-    else if(input_op_expression == "minus")
-      op_expression = "-";
-    else if(input_op_expression == "mult")
-      op_expression = "x";
-    else if(input_op_expression == "div")
-      op_expression = "/";
-    else if(input_op_expression == "pow")
-      op_expression = "^";
-    else if(input_op_expression == "eq")
-      op_expression = "=";
-    else if(input_op_expression == "lt")
-      op_expression = "<";
-    else if(input_op_expression == "gt")
-      op_expression = ">";
-    else if(input_op_expression == "le")
-      op_expression = "<=";
-    else if(input_op_expression == "ge")
-      op_expression = ">=";
-    else if(input_op_expression == "ne")
-      op_expression = "!=";
-    else
-      op_expression = " ";
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
   };
 
@@ -113,29 +92,52 @@
   {
     bool building_graph = this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph : false;
+    // bool building_graph = true;
+    int unique_filter_id;
 
     if(building_graph)
     {
-      this->filterID = InvalidableObject::filterIdGenerator++;
-      int edgeID = InvalidableObject::edgeIdGenerator++;
- 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
-
-      std::cout<<"CFieldScalarArithmeticFilter::apply filter tag = "<<this->tag<<std::endl;
-
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "F "+op_expression +" S Filter" ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp ;
-
-      if(CWorkflowGraph::build_begin)
-      {
-        CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
-
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
+      CWorkflowGraph::allocNodeEdge();
+
+      size_t filterhash = std::hash<StdString>{}(expression+to_string(data[0]->timestamp)+this->field->getId());
+
+      // first round
+      if(CWorkflowGraph::mapHashFilterID_ptr->find(filterhash) == CWorkflowGraph::mapHashFilterID_ptr->end())
+      {
+        this->filterID = InvalidableObject::filterIdGenerator++;
+        int edgeID = InvalidableObject::edgeIdGenerator++;
+
+        CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 0, data[0]);
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_tag = this->tag;
+
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+        if(this->field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
+      
+
+        if(CWorkflowGraph::build_begin)
+        {
+          CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb ++;
+
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
+        }
+        else CWorkflowGraph::build_begin = true;
+
+        (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash] = this->filterID; 
+        unique_filter_id = this->filterID;
       }
-      else CWorkflowGraph::build_begin = true;
+      // not first round
+      else 
+      {
+        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash];
+        if(data[0]->src_filterID != unique_filter_id)
+        {
+          int edgeID = InvalidableObject::edgeIdGenerator++;
+          CWorkflowGraph::addEdge(edgeID, unique_filter_id, data[0]);  
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ; 
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[unique_filter_id].expected_entry_nb ++;
+        }
+      
+        
+      }  
     }
 
@@ -144,5 +146,5 @@
     packet->timestamp = data[0]->timestamp;
     packet->status = data[0]->status;
-    if(building_graph) packet->src_filterID = this->filterID;
+    if(building_graph) packet->src_filterID = unique_filter_id;
     packet->field = this->field;
     
@@ -158,29 +160,5 @@
     , op(operatorExpr.getOpFieldField(op))
   { 
-    StdString input_op_expression=op;
-    if(input_op_expression == "add")
-      op_expression = "+";
-    else if(input_op_expression == "minus")
-      op_expression = "-";
-    else if(input_op_expression == "mult")
-      op_expression = "x";
-    else if(input_op_expression == "div")
-      op_expression = "/";
-    else if(input_op_expression == "pow")
-      op_expression = "^";
-    else if(input_op_expression == "eq")
-      op_expression = "=";
-    else if(input_op_expression == "lt")
-      op_expression = "<";
-    else if(input_op_expression == "gt")
-      op_expression = ">";
-    else if(input_op_expression == "le")
-      op_expression = "<=";
-    else if(input_op_expression == "ge")
-      op_expression = ">=";
-    else if(input_op_expression == "ne")
-      op_expression = "!=";
-    else
-      op_expression = " ";
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
   };
 
@@ -188,36 +166,66 @@
   {
     bool building_graph = this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph : false;
+    // bool building_graph = true;
+    int unique_filter_id;
 
     if(building_graph)
-    {
-
-      this->filterID = InvalidableObject::filterIdGenerator++;
-      int edgeID = InvalidableObject::edgeIdGenerator++;
-   
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+    {  
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CFieldFieldArithmeticFilter::apply filter tag = "<<this->tag<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "F "+op_expression +" F Filter" ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 2 ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date ;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp ;
-
-      if(CWorkflowGraph::build_begin)
-      {
-
-        CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
-
-        edgeID = InvalidableObject::edgeIdGenerator++;
-
-        CWorkflowGraph::addEdge(edgeID, this->filterID, data[1]);
-
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[1]->src_filterID].filter_filled = 0 ;
+      size_t filterhash = std::hash<StdString>{}(expression+to_string(data[0]->timestamp)+this->field->getId());
+
+      // first round
+      if(CWorkflowGraph::mapHashFilterID_ptr->find(filterhash) == CWorkflowGraph::mapHashFilterID_ptr->end())
+      {
+        this->filterID = InvalidableObject::filterIdGenerator++;
+        int edgeID = InvalidableObject::edgeIdGenerator++;
+    
+        CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 0, data[0]);
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+        if(this->field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
+    
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_tag = this->tag;
+        if(CWorkflowGraph::build_begin)
+        {
+
+          CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb ++;
+
+          edgeID = InvalidableObject::edgeIdGenerator++;
+
+          CWorkflowGraph::addEdge(edgeID, this->filterID, data[1]);
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb ++;
+
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[1]->src_filterID].filter_filled = 0 ;
+        }
+        CWorkflowGraph::build_begin = true;
+
+        (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash] = this->filterID; 
+        unique_filter_id = this->filterID;
+ 
       }
-      CWorkflowGraph::build_begin = true;
+      // not first round
+      else 
+      {
+        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash];
+        if(data[0]->src_filterID != unique_filter_id)
+        {
+          int edgeID = InvalidableObject::edgeIdGenerator++;
+          CWorkflowGraph::addEdge(edgeID, unique_filter_id, data[0]); 
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ; 
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[unique_filter_id].expected_entry_nb ++;
+        }
+        if(data[1]->src_filterID != unique_filter_id)
+        { 
+          int edgeID = InvalidableObject::edgeIdGenerator++;
+          CWorkflowGraph::addEdge(edgeID, unique_filter_id, data[1]);  
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[1]->src_filterID].filter_filled = 0 ;
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[unique_filter_id].expected_entry_nb ++;
+        }
+        
+      }  
     }
 
@@ -226,5 +234,5 @@
     packet->date = data[0]->date;
     packet->timestamp = data[0]->timestamp;
-    if(building_graph) packet->src_filterID = this->filterID;
+    if(building_graph) packet->src_filterID = unique_filter_id;
     packet->field = this->field;
     
Index: XIOS/dev/dev_trunk_omp/src/filter/binary_arithmetic_filter.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/binary_arithmetic_filter.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/binary_arithmetic_filter.hpp	(revision 1680)
@@ -24,4 +24,5 @@
       CScalarFieldArithmeticFilter(CGarbageCollector& gc, const std::string& op, double value);
       StdString virtual GetName(void);
+
 
     protected:
@@ -54,4 +55,5 @@
       StdString virtual GetName(void);
 
+
     protected:
       COperatorExpr::functionFieldScalar op; //!< The binary field-scalar operator attached to the binary arithmeric filter
@@ -82,4 +84,5 @@
       StdString virtual GetName(void);
 
+
     protected:
       COperatorExpr::functionFieldField op; //!< The binary field-field operator attached to the binary arithmeric filter
Index: XIOS/dev/dev_trunk_omp/src/filter/file_writer_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/file_writer_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/file_writer_filter.cpp	(revision 1680)
@@ -22,4 +22,5 @@
   {
     bool building_graph = this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph: false;
+    
     if(building_graph)
     {
@@ -27,15 +28,13 @@
       int edgeID = InvalidableObject::edgeIdGenerator++;
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "File Writer Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 4;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 0;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+      CWorkflowGraph::addNode(this->filterID, "File Writer Filter \\n("+this->field->file->getId()+".nc)", 6, 0, 1, data[0]);
 
-      if(CXios::isClient) std::cout<<"CFileWriterFilter::apply filter tag = "<<this->tag<<" start = "<<start_graph<<" end = "<<end_graph<<std::endl;
+      // (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->file->recordXiosAttributes();
+      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
+
+      // if(CXios::isClient) std::cout<<"CFileWriterFilter::apply filter tag = "<<this->tag<<" start = "<<start_graph<<" end = "<<end_graph<<std::endl;
 
       if(CXios::isClient && CWorkflowGraph::build_begin) 
Index: XIOS/dev/dev_trunk_omp/src/filter/filter.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/filter.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/filter.hpp	(revision 1680)
@@ -68,5 +68,5 @@
 
       int filterID;
-      StdString op_expression;
+      StdString expression;
 
     protected:
Index: XIOS/dev/dev_trunk_omp/src/filter/garbage_collector.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/garbage_collector.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/garbage_collector.cpp	(revision 1680)
@@ -8,4 +8,7 @@
   int InvalidableObject::edgeIdGenerator = 0;
   #pragma omp threadprivate(InvalidableObject::edgeIdGenerator)
+
+  int InvalidableObject::clusterIdGenerator = 0;
+  #pragma omp threadprivate(InvalidableObject::clusterIdGenerator)
   
   void CGarbageCollector::registerObject(InvalidableObject* Object, Time timestamp)
Index: XIOS/dev/dev_trunk_omp/src/filter/garbage_collector.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/garbage_collector.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/garbage_collector.hpp	(revision 1680)
@@ -28,4 +28,7 @@
     static int edgeIdGenerator;
     #pragma omp threadprivate(edgeIdGenerator)
+
+    static int clusterIdGenerator;
+    #pragma omp threadprivate(clusterIdGenerator)
 
     
Index: XIOS/dev/dev_trunk_omp/src/filter/output_pin.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/output_pin.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/output_pin.cpp	(revision 1680)
@@ -116,11 +116,9 @@
     {
 
-      if(parent_filters[i]->start_graph==0) parent_filters[i]->start_graph = start_graph;
-      else if(parent_filters[i]->start_graph<0) parent_filters[i]->start_graph = start_graph;
+      if(parent_filters[i]->start_graph<0) parent_filters[i]->start_graph = start_graph;
       else parent_filters[i]->start_graph = min(parent_filters[i]->start_graph, start_graph);
 
 
-      if(parent_filters[i]->end_graph==9223372036854775807) parent_filters[i]->end_graph = end_graph;  
-      else if(parent_filters[i]->end_graph<0) parent_filters[i]->end_graph = end_graph;  
+      if(parent_filters[i]->end_graph<0) parent_filters[i]->end_graph = end_graph;  
       else parent_filters[i]->end_graph = max(parent_filters[i]->end_graph, end_graph);
       
Index: XIOS/dev/dev_trunk_omp/src/filter/pass_through_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/pass_through_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/pass_through_filter.cpp	(revision 1680)
@@ -2,4 +2,5 @@
 #include "workflow_graph.hpp"
 #include "field.hpp"
+#include "file.hpp"
 
 namespace xios
@@ -16,17 +17,15 @@
     if(building_graph)
     {
-      std::cout<<"CPassThroughFilter::apply tag = "<<this->tag<<" start = "<<start_graph<<" end = "<<end_graph<<std::endl;
+      // std::cout<<"CPassThroughFilter::apply tag = "<<this->tag<<" start = "<<start_graph<<" end = "<<end_graph<<std::endl;
       this->filterID = InvalidableObject::filterIdGenerator++;
       int edgeID = InvalidableObject::edgeIdGenerator++;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "Pass Through Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 5;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+      CWorkflowGraph::allocNodeEdge();
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
+      CWorkflowGraph::addNode(this->filterID, "Pass Through Filter", 2, 1, 1, data[0]);
+
+      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+      if(this->field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
+
       
       if(CWorkflowGraph::build_begin)
Index: XIOS/dev/dev_trunk_omp/src/filter/source_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/source_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/source_filter.cpp	(revision 1680)
@@ -71,17 +71,11 @@
       packet->field = this->field;
       
-      
       if(CXios::isClient) std::cout<<"source filter tag = "<<this->tag<<" start = "<<start_graph<<" end = "<<end_graph<<std::endl;
     
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
-
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "Source Filter "+ this->field->getId();
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 0;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = packet->timestamp;
-
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge>;
+      CWorkflowGraph::allocNodeEdge();
+
+      CWorkflowGraph::addNode(this->filterID, "Source Filter ", 1, 1, 0, packet);
+      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].field_id = this->field->getId();
 
       CWorkflowGraph::build_begin = true;
Index: XIOS/dev/dev_trunk_omp/src/filter/spatial_transform_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/spatial_transform_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/spatial_transform_filter.cpp	(revision 1680)
@@ -9,4 +9,5 @@
 #endif
 #include "workflow_graph.hpp"
+#include "file.hpp"
 namespace xios
 {
@@ -184,21 +185,12 @@
     {
       this->filterID = InvalidableObject::filterIdGenerator++;
-      int edgeID = InvalidableObject::edgeIdGenerator++;
-    
-      std::cout<<"CSpatialTransformFilter::apply filter tag = "<<tag<<" start = "<<start_graph<<" end = "<<end_graph<<std::endl;
-    
-
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
-
-
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "Spatial Transform Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 6;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
-
-
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
+      int edgeID = InvalidableObject::edgeIdGenerator++;    
+
+      CWorkflowGraph::allocNodeEdge();
+
+      CWorkflowGraph::addNode(this->filterID, "Spatial Transform Filter", 4, 1, 1, data[0]);
+      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = field->recordXiosAttributes();
+      if(field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +field->file->recordXiosAttributes();
+
 
       if(CWorkflowGraph::build_begin)
@@ -229,5 +221,6 @@
       if (0 != packet->data.numElements())
         (packet->data)(0) = defaultValue;
-      apply(data[0]->data, packet->data, this->filterID);
+      if(building_graph) apply(data[0]->data, packet->data, this->filterID);
+      else apply(data[0]->data, packet->data);
     }
 
@@ -354,5 +347,8 @@
         int srcRank = itRecv->first;
 
-        if(filterID >=0) (*CWorkflowGraph::mapFilters_ptr_with_info)[filterID].transform_type = (*itAlgo)->getName();
+        if(filterID >=0)
+        {
+           (*CWorkflowGraph::mapFilters_ptr_with_info)[filterID].filter_name = (*itAlgo)->getName();
+        } 
         if (srcRank != rank)
         {
Index: XIOS/dev/dev_trunk_omp/src/filter/store_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/store_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/store_filter.cpp	(revision 1680)
@@ -3,4 +3,5 @@
 #include "grid.hpp"
 #include "timer.hpp"
+#include "file.hpp"
 
 namespace xios
@@ -98,16 +99,11 @@
       int edgeID = InvalidableObject::edgeIdGenerator++;
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
+ 
+      CWorkflowGraph::addNode(this->filterID, "Store Filter", 4, 1, 1, data[0]);
+      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+      if(this->field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
 
-
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "Store Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 4;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
-
-      if(CXios::isClient) std::cout<<"CStoreFilter::apply filter tag = "<<this->tag<<std::endl;
+      // if(CXios::isClient) std::cout<<"CStoreFilter::apply filter tag = "<<this->tag<<std::endl;
 
       if(CXios::isClient && CWorkflowGraph::build_begin) 
Index: XIOS/dev/dev_trunk_omp/src/filter/temporal_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/temporal_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/temporal_filter.cpp	(revision 1680)
@@ -3,4 +3,5 @@
 #include "calendar_util.hpp"
 #include "workflow_graph.hpp"
+#include "file.hpp"
 
 namespace xios
@@ -28,4 +29,5 @@
 //    , nextOperationDate(initDate + opFreq + this->samplingOffset)
     , isFirstOperation(true)
+    , temp_op(opId)
   {
   }
@@ -34,38 +36,16 @@
   {
     bool building_graph=this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph : false;
-   
+
     if(building_graph)
     {
-      if(this->filterIDoutputs.size()==0) this->filterID = InvalidableObject::filterIdGenerator++;
       int edgeID = InvalidableObject::edgeIdGenerator++;
-      
-
-      std::cout<<"CTemporalFilter::apply filter tag = "<<this->tag<<" start = "<<this->start_graph<<" end = "<<this->end_graph<<std::endl;
-
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
+
+      CWorkflowGraph::allocNodeEdge();
 
       if(CWorkflowGraph::build_begin)
       {
-
-        CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
-
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
-      }
-      
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
-
-      if(this->filterIDoutputs.size()==0)
-      {
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "Temporal Filter";   
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 3;   
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;   
-        // (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = (initDate + nbOperationDates*opFreq - samplingFreq + offsetMonth + offsetAllButMonth) / data[0]->date +1 ;   
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb =-1;   
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;   
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;   
-      }
-
-
-      this->filterIDoutputs.push_back(data[0]->src_filterID); 
+        CWorkflowGraph::addEdge(edgeID, -1, data[0]);        
+      }
+      this->filterIDoutputs_pair.push_back(make_pair(edgeID, data[0]->src_filterID)); 
     }
     
@@ -101,4 +81,26 @@
       if (outputResult)
       {
+        if(building_graph)
+        {
+          this->filterID = InvalidableObject::filterIdGenerator++;
+          CWorkflowGraph::addNode(this->filterID, "Temporal Filter\\n("+this->temp_op+")", 5, 1, 0, data[0]);   
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].transform_type = this->temp_op;   
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].inputs_complete = true ;
+
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+          if(this->field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
+
+
+          for(int i=0; i<this->filterIDoutputs_pair.size(); i++)
+          {
+            (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterIDoutputs_pair[i].second].filter_filled = 0 ;  
+            (*CWorkflowGraph::mapFieldToFilters_ptr_with_info)[this->filterIDoutputs_pair[i].first].to = this->filterID ;  
+          }
+
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = this->filterIDoutputs_pair.size() ;
+        }
+
+
+
         nbOperationDates ++;
         if (!copyLess)
@@ -117,8 +119,103 @@
 
         isFirstOperation = false;
+        
+        packet->field = this->field;
         if(building_graph) packet->src_filterID=this->filterID;
+        if(building_graph) this->filterIDoutputs_pair.clear();
+        if(building_graph) CWorkflowGraph::build_begin=true;
+      }
+    }
+
+    return packet;
+  }
+
+
+
+  CDataPacketPtr CTemporalFilter::apply_old(std::vector<CDataPacketPtr> data)
+  {
+    bool building_graph=this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph : false;
+   
+    if(building_graph)
+    {
+      if(this->filterIDoutputs.size()==0) this->filterID = InvalidableObject::filterIdGenerator++;
+      int edgeID = InvalidableObject::edgeIdGenerator++;
+      
+      // std::cout<<"CTemporalFilter::apply filter tag = "<<this->tag<<" start = "<<this->start_graph<<" end = "<<this->end_graph<<std::endl;
+
+      CWorkflowGraph::allocNodeEdge();
+
+      if(this->filterIDoutputs.size()==0)
+      {
+        CWorkflowGraph::addNode(this->filterID, "Temporal Filter\\n("+this->temp_op+")", 5, 1, 0, data[0]);   
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].transform_type = this->temp_op;   
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].inputs_complete = false ;
+      }
+
+      if(CWorkflowGraph::build_begin)
+      {
+
+        CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
+
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb += 1 ;
+      }
+
+
+      this->filterIDoutputs.push_back(data[0]->src_filterID); 
+    }
+    
+    
+    CDataPacketPtr packet;
+
+    if (data[0]->status != CDataPacket::END_OF_STREAM)
+    {
+      bool usePacket, outputResult, copyLess;
+      if (isOnceOperation)
+        usePacket = outputResult = copyLess = isFirstOperation;
+      else
+      {
+        usePacket = (data[0]->date >= nextSamplingDate);
+        outputResult = (data[0]->date  > initDate + nbOperationDates*opFreq - samplingFreq + offsetMonth + offsetAllButMonth);
+        copyLess = (isInstantOperation && usePacket && outputResult);
+      }
+
+      if (usePacket)
+      {
+        nbSamplingDates ++;
+        if (!copyLess)
+        {
+          if (!tmpData.numElements())
+            tmpData.resize(data[0]->data.numElements());
+
+          (*functor)(data[0]->data);
+        }
+
+        nextSamplingDate = ((initDate + offsetMonth) + nbSamplingDates * samplingFreq) + offsetAllButMonth + initDate.getRelCalendar().getTimeStep();
+      }
+
+      if (outputResult)
+      {
+        nbOperationDates ++;
+        if (!copyLess)
+        {
+          functor->final();
+
+          packet = CDataPacketPtr(new CDataPacket);
+          packet->date = data[0]->date;
+          packet->timestamp = data[0]->timestamp;
+          packet->status = data[0]->status;
+          packet->data.resize(tmpData.numElements());
+          packet->data = tmpData;
+        }
+        else
+          packet = data[0];
+
+        isFirstOperation = false;
+        
         packet->field = this->field;
+        if(building_graph) packet->src_filterID=this->filterID;
         if(building_graph) this->filterIDoutputs.clear();
         if(building_graph) CWorkflowGraph::build_begin=true;
+        if(building_graph) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].inputs_complete = true ;
       }
     }
Index: XIOS/dev/dev_trunk_omp/src/filter/temporal_filter.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/temporal_filter.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/temporal_filter.hpp	(revision 1680)
@@ -40,4 +40,5 @@
        */
       CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data);
+      CDataPacketPtr virtual apply_old(std::vector<CDataPacketPtr> data);
 
       /*!
@@ -54,5 +55,8 @@
        */
       bool virtual isDataExpected(const CDate& date) const;
-      std::vector<int> filterIDoutputs;
+      std::vector<int > filterIDoutputs;
+      std::vector<std::pair<int, int> > filterIDoutputs_pair;
+
+      StdString temp_op;
 
     private:
Index: XIOS/dev/dev_trunk_omp/src/filter/ternary_arithmetic_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/ternary_arithmetic_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/ternary_arithmetic_filter.cpp	(revision 1680)
@@ -1,4 +1,5 @@
 #include "ternary_arithmetic_filter.hpp"
 #include "workflow_graph.hpp"
+#include "yacc_var.hpp"
 
 namespace xios
@@ -9,5 +10,8 @@
     , value1(value1)
     , value2(value2)
-  { /* Nothing to do */ };
+  { 
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
+    /* Nothing to do */ 
+  };
 
   CDataPacketPtr CScalarScalarFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data)
@@ -20,15 +24,11 @@
        int edgeID = InvalidableObject::edgeIdGenerator++;
     
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CScalarScalarFieldArithmeticFilter::apply connection = "<<data[0]->src_filterID<<" <-> "<<this->filterID<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "SSF Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+
+
+      CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 1, data[0]);
 
 
@@ -61,5 +61,8 @@
     , value1(value1)
     , value2(value2)
-  { /* Nothing to do */ };
+  { 
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
+    /* Nothing to do */ 
+  };
 
   CDataPacketPtr CScalarFieldScalarArithmeticFilter::apply(std::vector<CDataPacketPtr> data)
@@ -73,15 +76,11 @@
     
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CScalarFieldScalarArithmeticFilter::apply connection = "<<data[0]->src_filterID<<" <-> "<<this->filterID<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "SFS Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+
+
+      CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 1, data[0]);
 
       if(CWorkflowGraph::build_begin)
@@ -111,5 +110,8 @@
     , op(operatorExpr.getOpScalarFieldField(op))
     , value(value)
-  { /* Nothing to do */ };
+  { 
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
+    /* Nothing to do */ 
+  };
 
   CDataPacketPtr CScalarFieldFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data)
@@ -123,15 +125,10 @@
     
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CScalarFieldFieldArithmeticFilter::apply connection = "<<data[0]->src_filterID<<" <-> "<<this->filterID<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "SFF Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+
+      CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 2, data[0]);
 
       if(CWorkflowGraph::build_begin)
@@ -177,5 +174,8 @@
     , value1(value1)
     , value2(value2)
-  { /* Nothing to do */ };
+  { 
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
+    /* Nothing to do */ 
+  };
 
   CDataPacketPtr CFieldScalarScalarArithmeticFilter::apply(std::vector<CDataPacketPtr> data)
@@ -189,15 +189,9 @@
     
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CFieldScalarScalarArithmeticFilter::apply connection = "<<data[0]->src_filterID<<" <-> "<<this->filterID<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "FSS Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+      CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 1, data[0]);
 
       if(CWorkflowGraph::build_begin)
@@ -229,5 +223,8 @@
     , op(operatorExpr.getOpFieldScalarField(op))
     , value(value)
-  { /* Nothing to do */ };
+  { 
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
+    /* Nothing to do */ 
+  };
 
   CDataPacketPtr CFieldScalarFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data)
@@ -241,15 +238,9 @@
     
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CFieldScalarFieldArithmeticFilter::apply connection = "<<data[0]->src_filterID<<" <-> "<<this->filterID<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "FSF Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+      CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 2, data[0]);
 
       if(CWorkflowGraph::build_begin)
@@ -291,5 +282,9 @@
     , op(operatorExpr.getOpFieldFieldScalar(op))
     , value(value)
-  { /* Nothing to do */ };
+  { 
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
+    std::cout<<"expression = "<<expression;
+    /* Nothing to do */ 
+  };
 
   CDataPacketPtr CFieldFieldScalarArithmeticFilter::apply(std::vector<CDataPacketPtr> data)
@@ -302,15 +297,10 @@
       int edgeID = InvalidableObject::edgeIdGenerator++;
     
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CFieldFieldScalarArithmeticFilter::apply connection = "<<data[0]->src_filterID<<" <-> "<<this->filterID<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "FFS Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+
+      CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 2, data[0]);
 
       if(CWorkflowGraph::build_begin)
@@ -352,5 +342,8 @@
     : CFilter(gc, 3, this)
     , op(operatorExpr.getOpFieldFieldField(op))
-  { /* Nothing to do */ };
+  { 
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
+    /* Nothing to do */ 
+  };
 
   CDataPacketPtr CFieldFieldFieldArithmeticFilter::apply(std::vector<CDataPacketPtr> data)
@@ -364,15 +357,10 @@
     
 
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+      CWorkflowGraph::allocNodeEdge();
 
       std::cout<<"CFieldFieldFieldArithmeticFilter::apply connection = "<<data[0]->src_filterID<<" <-> "<<this->filterID<<std::endl;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "FFF Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 3;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+
+      CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 3, data[0]);
 
       if(CWorkflowGraph::build_begin)
Index: XIOS/dev/dev_trunk_omp/src/filter/unary_arithmetic_filter.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/filter/unary_arithmetic_filter.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/filter/unary_arithmetic_filter.cpp	(revision 1680)
@@ -1,4 +1,7 @@
 #include "unary_arithmetic_filter.hpp"
 #include "workflow_graph.hpp"
+#include "yacc_var.hpp"
+#include "file.hpp"
+
 namespace xios
 {
@@ -7,23 +10,5 @@
     , op(operatorExpr.getOpField(op))
   { 
-    StdString input_op_expression=op;
-    if(input_op_expression == "neg")
-      op_expression = "-";
-    else if(input_op_expression == "sin")
-      op_expression = "sin";
-    else if(input_op_expression == "cos")
-      op_expression = "cos";
-    else if(input_op_expression == "tan")
-      op_expression = "tan";
-    else if(input_op_expression == "exp")
-      op_expression = "exp";
-    else if(input_op_expression == "log")
-      op_expression = "log";
-    else if(input_op_expression == "log10")
-      op_expression = "log10";
-    else if(input_op_expression == "sqrt")
-      op_expression = "sqrt";
-    else
-      op_expression = " ";
+    expression.assign(*yacc_globalInputText_ptr, 0, yacc_globalInputText_ptr->size()-1);
   };
 
@@ -31,30 +16,49 @@
   {
     bool building_graph = this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph : false;
-
+    int unique_filter_id;
+    
     if(building_graph)
     {
-      this->filterID = InvalidableObject::filterIdGenerator++;
-      int edgeID = InvalidableObject::edgeIdGenerator++;
+      CWorkflowGraph::allocNodeEdge();
+      size_t filterhash = std::hash<StdString>{}(expression+to_string(data[0]->timestamp)+this->field->getId());
+
+      // first round
+      if(CWorkflowGraph::mapHashFilterID_ptr->find(filterhash) == CWorkflowGraph::mapHashFilterID_ptr->end())
+      {
+        this->filterID = InvalidableObject::filterIdGenerator++;
+        int edgeID = InvalidableObject::edgeIdGenerator++;
+
+        CWorkflowGraph::addNode(this->filterID, "Arithmetic Filter\\n("+expression+")", 3, 1, 0, data[0]);
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_tag = this->tag;
+
+        (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->recordXiosAttributes();
+        if(this->field->file) (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->recordXiosAttributes();
       
-      if(CWorkflowGraph::mapFieldToFilters_ptr_with_info==0) CWorkflowGraph::mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
-      if(CWorkflowGraph::mapFilters_ptr_with_info==0) CWorkflowGraph::mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+        if(CWorkflowGraph::build_begin)
+        {
 
-      std::cout<<"CunaryArithmeticFilter::apply filter tag = "<<this->tag<<std::endl;
+          CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb ++;
 
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_name = "F Filter";
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_class = 2;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].filter_filled = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].expected_entry_nb = 1;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].date = data[0]->date;
-      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].timestamp = data[0]->timestamp;
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ; 
+        }
+        else CWorkflowGraph::build_begin = true;
 
-      if(CWorkflowGraph::build_begin)
+        (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash] = this->filterID; 
+        unique_filter_id = this->filterID;
+      }
+      else 
       {
-
-        CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
-
-        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ; 
-      }
-      else CWorkflowGraph::build_begin = true;
+        unique_filter_id = (*CWorkflowGraph::mapHashFilterID_ptr)[filterhash];
+        if(data[0]->src_filterID != unique_filter_id)
+        {
+          int edgeID = InvalidableObject::edgeIdGenerator++;
+          CWorkflowGraph::addEdge(edgeID, unique_filter_id, data[0]); 
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ; 
+          (*CWorkflowGraph::mapFilters_ptr_with_info)[unique_filter_id].expected_entry_nb ++;
+        }
+      
+        
+      } 
   
     }
@@ -69,7 +73,8 @@
       packet->data.reference(op(data[0]->data));
 
-    if(building_graph) packet->src_filterID = this->filterID;
+    if(building_graph) packet->src_filterID = unique_filter_id;
 
     return packet;
   }
 } // namespace xios
+
Index: XIOS/dev/dev_trunk_omp/src/graphviz.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/graphviz.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/graphviz.cpp	(revision 1680)
@@ -72,35 +72,66 @@
     {
       CWorkflowGraph::buildStaticWorkflow_with_info();
+
+      StdString color_table[7] = {"black", "red", "blue", "green", "purple", "yellow", "gray"};
     
       std::ofstream fs_json;
       fs_json.open ("graph_data.json", std::fstream::out);
 
-      fs_json << "{ \"node\" : ["<<std::endl;
+      fs_json << "{\"nodes\":["<<std::endl<<"      ";
+      static bool firstnode=true;
+      static bool firstedge=true;
     
       for (auto it=CWorkflowGraph::mapFilters_ptr_with_info->begin(); it != CWorkflowGraph::mapFilters_ptr_with_info->end(); it++)
       {
-        fs_json << "        {\"id\": "<<it->first +1<<"}, "<<std::endl;
-        fs_json << "            {\"label\": \""<<it->second.filter_name<<"\"}, "<<std::endl  ;
-        fs_json << "            {\"class\": "<<it->second.filter_class<<"}, "<<std::endl  ;
-        fs_json << "            {\"filled\": "<<it->second.filter_filled<<"}, "<<std::endl  ;
-        fs_json << "            {\"entry\": "<<it->second.expected_entry_nb<<"}, "<<std::endl  ;
-        // fs_json << "            {\"date\": \""<<it->second.date<<"\"}, "<<std::endl  ;
-        fs_json << "            {\"type\": \""<<it->second.transform_type<<"\"}, "<<std::endl  ;
+        if(firstnode) 
+        {
+          fs_json << "{\"id\": "<<it->first +1<<", "<<std::endl;
+          firstnode = false;
+        }
+        else
+        {
+          fs_json << ",{\"id\": "<<it->first +1<<", "<<std::endl;
+        }
+        if(it->second.filter_class == 1) // source filter
+          fs_json << "       \"label\": \""<<it->second.filter_name<<"\\n("<<it->second.field_id<<")\", "<<std::endl;
+        else
+          fs_json << "       \"label\": \""<<it->second.filter_name<<"\", "<<std::endl;
+        fs_json << "       \"class\": \""<<it->second.filter_class<<"\", "<<std::endl;
+        fs_json << "       \"filled\": \""<<it->second.filter_filled<<"\", "<<std::endl;
+        fs_json << "       \"type\": \""<<it->second.transform_type<<"\", "<<std::endl;
+        fs_json << "       \"entry\": \""<<it->second.expected_entry_nb<<"\", "<<std::endl;
+        fs_json << "       \"inputs\": \""<<it->second.inputs_complete<<"\", "<<std::endl;
+        fs_json << "       \"tag\": \""<<it->second.filter_tag<<"\", "<<std::endl;
+        if(it->second.clusterID != -1) fs_json << "       \"cid\": \""<<it->second.clusterID<<"\", "<<std::endl;
+        fs_json << "       \"attributes\": \""<<it->second.attributes<<"\"}"<<std::endl<<"      ";
       }
-      fs_json << "    ]}"<<std::endl<<std::endl;
-
-      fs_json << "{ \"edge\" : ["<<std::endl;
+      fs_json << "    ],"<<std::endl;
+
+
+      fs_json << " \"edges\" : ["<<std::endl<<"      ";
 
       for (auto it=CWorkflowGraph::mapFieldToFilters_ptr_with_info->begin(); it != CWorkflowGraph::mapFieldToFilters_ptr_with_info->end(); it++)
       {
-        fs_json << "        {\"id\": "<<it->first +1<<"}, "<<std::endl;
-        fs_json << "            {\"from\": "<<it->second.from +1<<"}, "<<std::endl;
-        fs_json << "            {\"to\": "<<it->second.to+1<<"}, "<<std::endl  ;
-        fs_json << "            {\"fid\": \""<<it->second.field_id<<"\"}, "<<std::endl  ;
-        fs_json << "            {\"fname\": \""<<it->second.field_name<<"\"}, "<<std::endl  ;
-        fs_json << "            {\"gid\": \""<<it->second.grid_id<<"\"}, "<<std::endl  ;
-        fs_json << "            {\"date\": \""<<it->second.date<<"\"}, "<<std::endl  ;
+        if(firstedge)
+        {
+          fs_json << "{\"id\": "<<it->first +1<<", "<<std::endl;
+          firstedge = false;
+        }
+        else
+        {
+          fs_json << ",{\"id\": "<<it->first +1<<", "<<std::endl;
+        }
+        fs_json << "       \"from\": "<<it->second.from+1<<", "<<std::endl;
+        fs_json << "       \"to\": "<<it->second.to+1<<", "<<std::endl;
+        fs_json << "       \"label\": \""<<it->second.field_id<<"\\n"<<it->second.date<<"\", "<<std::endl;
+        // fs_json << "       \"title\": \""<<"Show more information about this field"<<"\", "<<std::endl;
+        // fs_json << "       \"fid\": \""<<it->second.field_id<<"\", "<<std::endl;
+        // fs_json << "       \"fname\": \""<<it->second.field_name<<"\", "<<std::endl;
+        // fs_json << "       \"gid\": \""<<it->second.grid_id<<"\", "<<std::endl;
+        fs_json << "       \"date\": \""<<it->second.date<<"\", "<<std::endl;
+        fs_json << "       \"attributes\": \"id = "<<it->second.field_id<<"</br>"<<it->second.attributes<<"\"}"<<std::endl<<"      ";
+
       }
-      fs_json << "    ]}"<<std::endl<<std::endl;
+      fs_json << "    ]}"<<std::endl;
 
 
@@ -114,65 +145,68 @@
 
 
-      std::ofstream fs;
-      fs.open ("graph_with_info.html", std::fstream::out);
-
-      fs << "<html>" <<std::endl;
-      fs << "<head>" <<std::endl;
-      fs << "    <script type=\"text/javascript\" src=\"../../../vis-4.21.0/dist/vis.js\"></script>" <<std::endl;
-      fs << "    <link href=\"../../../vis-4.21.0/dist/vis.css\" rel=\"stylesheet\" type=\"text/css\" />" <<std::endl <<std::endl;
-      fs << "    <style type=\"text/css\">"<<std::endl;
-      fs << "        #mynetwork {"<<std::endl;
-      fs << "            width: 1000px;"<<std::endl;
-      fs << "            height: 800px;"<<std::endl;
-      fs << "            border: 1px solid lightgray"<<std::endl;
-      fs << "        }"<<std::endl;
-      fs << "    </style>"<<std::endl;
-      fs << "</head>"<<std::endl;
-      fs << "<body>"<<std::endl;
-      fs << "<div id=\"mynetwork\"></div>"<<std::endl<<std::endl;
-      fs << "<script type=\"text/javascript\">"<<std::endl;
-
-      fs << "    var nodes = new vis.DataSet(["<<std::endl;
-      for(int i=0; i<CWorkflowGraph::filters.size(); i++)
-      {
-        fs << "        {id: "<<i+1<<", label: \'"<<CWorkflowGraph::filters[i]<<"\'},"<<std::endl  ;
-      }
-      fs << "    ]);"<<std::endl<<std::endl;
-
-
-      fs << "    var edges = new vis.DataSet(["<<std::endl;
-      for(int i=0; i<CWorkflowGraph::fieldsToFilters.size(); i++)
-      {
-        fs <<"        {from: "<<CWorkflowGraph::fieldsToFilters[i].first+1<<", to: "<<CWorkflowGraph::fieldsToFilters[i].second+1<<", label: \'"<<CWorkflowGraph::fields[i]<<"\'},"<<std::endl;
-      }
-      fs << "    ]);"<<std::endl<<std::endl;
+      // std::ofstream fs;
+      // fs.open ("graph_with_info.html", std::fstream::out);
+
+      // fs << "<html>" <<std::endl;
+      // fs << "<head>" <<std::endl;
+      // fs << "    <script type=\"text/javascript\" src=\"../../../vis-4.21.0/dist/vis.js\"></script>" <<std::endl;
+      // fs << "    <link href=\"../../../vis-4.21.0/dist/vis.css\" rel=\"stylesheet\" type=\"text/css\" />" <<std::endl <<std::endl;
+      // fs << "    <style type=\"text/css\">"<<std::endl;
+      // fs << "        #mynetwork {"<<std::endl;
+      // fs << "            width: 1000px;"<<std::endl;
+      // fs << "            height: 800px;"<<std::endl;
+      // fs << "            border: 1px solid lightgray"<<std::endl;
+      // fs << "        }"<<std::endl;
+      // fs << "    </style>"<<std::endl;
+      // fs << "</head>"<<std::endl;
+      // fs << "<body>"<<std::endl;
+      // fs << "<div id=\"mynetwork\"></div>"<<std::endl<<std::endl;
+      // fs << "<script type=\"text/javascript\">"<<std::endl;
+
+      // fs << "    var nodes = new vis.DataSet(["<<std::endl;
+      // for(int i=0; i<CWorkflowGraph::filters.size(); i++)
+      // {
+      //   StdString color_table[7] = {"black", "red", "blue", "green", "purple", "yellow", "gray"};
+
+      //   fs << "        {id: "<<i+1<<", label: \'"<<CWorkflowGraph::filters[i]<<"\', title: \'"<<"Show more information about this filter"<<"\'";
+      //   fs <<", color: \'"<<color_table[(*CWorkflowGraph::mapFilters_ptr_with_info)[i].filter_class]<<"\'},"<<std::endl  ;
+      // }
+      // fs << "    ]);"<<std::endl<<std::endl;
+
+
+      // fs << "    var edges = new vis.DataSet(["<<std::endl;
+      // for(int i=0; i<CWorkflowGraph::fieldsToFilters.size(); i++)
+      // {
+      //   fs <<"        {from: "<<CWorkflowGraph::fieldsToFilters[i].first+1<<", to: "<<CWorkflowGraph::fieldsToFilters[i].second+1<<", label: \'"<<CWorkflowGraph::fields[i]<<"\', title: \'"<<"Show more information about this field"<<"\'},"<<std::endl  ;
+      // }
+      // fs << "    ]);"<<std::endl<<std::endl;
 
   
-      fs << "    var container = document.getElementById(\'mynetwork\');" <<std::endl<<std::endl;
-      fs << "    var data = {" <<std::endl;
-      fs << "        nodes: nodes," <<std::endl;
-      fs << "        edges: edges" <<std::endl;
-      fs << "    };" <<std::endl;
-      fs << "    var options = {"<<std::endl;
-      fs << "        edges:{"<<std::endl;
-      fs << "            smooth: false,"<<std::endl;
-      fs << "            arrows: \'to\',"<<std::endl;
-      fs << "            color: 'red',"<<std::endl;
-      fs << "            font:{align: \'middle\'},"<<std::endl;
-      fs << "        },"<<std::endl;
-      fs << "        physics:{"<<std::endl;
-      fs << "            enabled: false,"<<std::endl;
-      fs << "        },"<<std::endl;
-      fs << "};" <<std::endl<<std::endl;
-
-      fs << "    var network = new vis.Network(container, data, options);" <<std::endl<<std::endl;
-
-      fs << "</script>"<<std::endl;
-      fs << "</body>"<<std::endl;
-      fs << "</html>"<<std::endl;
+      // fs << "    var container = document.getElementById(\'mynetwork\');" <<std::endl<<std::endl;
+      // fs << "    var data = {" <<std::endl;
+      // fs << "        nodes: nodes," <<std::endl;
+      // fs << "        edges: edges" <<std::endl;
+      // fs << "    };" <<std::endl;
+      // fs << "    var options = {"<<std::endl;
+      // fs << "        edges:{"<<std::endl;
+      // fs << "            smooth: false,"<<std::endl;
+      // fs << "            arrows: \'to\',"<<std::endl;
+      // fs << "            color: 'red',"<<std::endl;
+      // fs << "            font:{align: \'middle\'},"<<std::endl;
+      // fs << "        },"<<std::endl;
+      // fs << "        physics:{"<<std::endl;
+      // fs << "            enabled: false,"<<std::endl;
+      // fs << "        },"<<std::endl;
+      // fs << "};" <<std::endl<<std::endl;
+
+      // fs << "    var network = new vis.Network(container, data, options);" <<std::endl<<std::endl;
+
+      // fs << "</script>"<<std::endl;
+      // fs << "</body>"<<std::endl;
+      // fs << "</html>"<<std::endl;
 
       
 
-      fs.close();
+      // fs.close();
          
     }
Index: XIOS/dev/dev_trunk_omp/src/node/field.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/node/field.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/node/field.cpp	(revision 1680)
@@ -922,4 +922,5 @@
    TRY
    {
+
      CContext* context = CContext::getCurrent();
      bool hasClient = context->hasClient;
@@ -1200,5 +1201,4 @@
            {
              CField* fieldRef = CField::get(field_ref);
-             fieldRef->build_workflow_graph.setValue(buildWorkflowGraph);
              CGrid* gridRef = fieldRef->grid;
 
@@ -1236,5 +1236,4 @@
          else if (!field_ref.isEmpty())
          {
-           CField::get(field_ref)->build_workflow_graph.setValue(buildWorkflowGraph);
            instantDataFilter = getFieldReference(gc);
            instantDataFilter->tag = buildWorkflowGraph;
@@ -1297,5 +1296,5 @@
            fileWriterFilter->end_graph = filter_end;
 
-           std::cout<<"CFileWriterFilter filter start = "<<filter_start<<" end = "<<filter_end<<std::endl;
+           // std::cout<<"CFileWriterFilter filter start = "<<filter_start<<" end = "<<filter_end<<" field = "<<this->getId()<<std::endl;
 
          }
@@ -1368,5 +1367,5 @@
        filters.second->parent_filters[0]= fieldRef->getInstantDataFilter();
 
-       filters.second->tag = buildWorkflowGraph || filters.second->parent_filters[0]->tag;
+       filters.second->tag = (buildWorkflowGraph || filters.second->parent_filters[0]->tag);
 
        filters.second->start_graph = filter_start;
@@ -1528,5 +1527,5 @@
 
        const bool detectMissingValues = (!detect_missing_value.isEmpty() && detect_missing_value == true);
-       bool buildWorkflowGraph = buildWorkflowGraph = (!build_workflow_graph.isEmpty() && build_workflow_graph == true);
+       bool buildWorkflowGraph = (!build_workflow_graph.isEmpty() && build_workflow_graph == true);
        std::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation,
                                                                            CContext::getCurrent()->getCalendar()->getInitDate(),
Index: XIOS/dev/dev_trunk_omp/src/parse_expr/filter_expr_node.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/parse_expr/filter_expr_node.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/parse_expr/filter_expr_node.cpp	(revision 1680)
@@ -106,9 +106,17 @@
   std::shared_ptr<COutputPin> CFilterUnaryOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch = child->reduce(gc, thisField);
+
     std::shared_ptr<CUnaryArithmeticFilter> filter(new CUnaryArithmeticFilter(gc, opId));
-    child->reduce(gc, thisField)->connectOutput(filter, 0);
-
-    (filter->parent_filters).resize(1);
-    (filter->parent_filters)[0] = child->reduce(gc, thisField);
+    ch->connectOutput(filter, 0);
+
+    (filter->parent_filters).resize(1);
+    (filter->parent_filters)[0] = ch;
+
+    filter->tag = ch->tag;
+    filter->start_graph = ch->start_graph;
+    filter->end_graph = ch->end_graph;
+    filter->field = &thisField;
+
 
     return filter;
@@ -127,9 +135,15 @@
   std::shared_ptr<COutputPin> CFilterScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch2 = child2->reduce(gc, thisField);
     std::shared_ptr<CScalarFieldArithmeticFilter> filter(new CScalarFieldArithmeticFilter(gc, opId, child1->reduce()));
-    child2->reduce(gc, thisField)->connectOutput(filter, 0);
+    ch2->connectOutput(filter, 0);
     
     (filter->parent_filters).resize(1);
-    (filter->parent_filters)[0] = child2->reduce(gc, thisField);
+    (filter->parent_filters)[0] = ch2;
+
+    filter->tag = ch2->tag;
+    filter->start_graph = ch2->start_graph;
+    filter->end_graph = ch2->end_graph;
+    filter->field = &thisField;
 
     return filter;
@@ -148,9 +162,17 @@
   std::shared_ptr<COutputPin> CFilterFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch1 = child1->reduce(gc, thisField);
+
     std::shared_ptr<CFieldScalarArithmeticFilter> filter(new CFieldScalarArithmeticFilter(gc, opId, child2->reduce()));
-    child1->reduce(gc, thisField)->connectOutput(filter, 0);
-
-    (filter->parent_filters).resize(1);
-    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
+    ch1->connectOutput(filter, 0);
+
+    (filter->parent_filters).resize(1);
+    (filter->parent_filters)[0] = ch1;
+
+    filter->tag = ch1->tag;
+    filter->start_graph = ch1->start_graph;
+    filter->end_graph = ch1->end_graph;
+    filter->field = &thisField;
+
     return filter;
   }
@@ -168,11 +190,21 @@
   std::shared_ptr<COutputPin> CFilterFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch1 = child1->reduce(gc, thisField);
+    std::shared_ptr<COutputPin> ch2 = child2->reduce(gc, thisField);
+
     std::shared_ptr<CFieldFieldArithmeticFilter> filter(new CFieldFieldArithmeticFilter(gc, opId));
-    child1->reduce(gc, thisField)->connectOutput(filter, 0);
-    child2->reduce(gc, thisField)->connectOutput(filter, 1); 
+    ch1->connectOutput(filter, 0);
+    ch2->connectOutput(filter, 1); 
 
     (filter->parent_filters).resize(2);
-    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
-    (filter->parent_filters)[1] = child2->reduce(gc, thisField);
+    (filter->parent_filters)[0] = ch1;
+    (filter->parent_filters)[1] = ch2;
+
+    filter->tag = (ch1->tag || ch2->tag);
+    filter->start_graph = ch1->tag? ch1->start_graph : (ch2->tag? ch2->start_graph: -1);
+    filter->end_graph = ch1->tag? ch1->end_graph : (ch2->tag? ch2->end_graph: -1);
+    filter->field = &thisField;
+
+
     return filter;
   }
@@ -194,9 +226,16 @@
   std::shared_ptr<COutputPin> CFilterScalarScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch3 = child3->reduce(gc, thisField);
+
     std::shared_ptr<CScalarScalarFieldArithmeticFilter> filter(new CScalarScalarFieldArithmeticFilter(gc, opId, child1->reduce(),child2->reduce()));
-    child3->reduce(gc, thisField)->connectOutput(filter, 0);
+    ch3->connectOutput(filter, 0);
     
     (filter->parent_filters).resize(1);
-    (filter->parent_filters)[0] = child3->reduce(gc, thisField);
+    (filter->parent_filters)[0] = ch3;
+
+    filter->tag = ch3->tag;
+    filter->start_graph = ch3->start_graph;
+    filter->end_graph = ch3->end_graph;
+    filter->field = &thisField;
 
     return filter;
@@ -217,9 +256,17 @@
   std::shared_ptr<COutputPin> CFilterScalarFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch2 = child2->reduce(gc, thisField);
+
     std::shared_ptr<CScalarFieldScalarArithmeticFilter> filter(new CScalarFieldScalarArithmeticFilter(gc, opId, child1->reduce(),child3->reduce()));
-    child2->reduce(gc, thisField)->connectOutput(filter, 0);
-
-    (filter->parent_filters).resize(1);
-    (filter->parent_filters)[0] = child2->reduce(gc, thisField);
+    ch2->connectOutput(filter, 0);
+
+    (filter->parent_filters).resize(1);
+    (filter->parent_filters)[0] = ch2;
+
+    filter->tag = ch2->tag;
+    filter->start_graph = ch2->start_graph;
+    filter->end_graph = ch2->end_graph;
+    filter->field = &thisField;
+
     return filter;
   }
@@ -239,11 +286,19 @@
   std::shared_ptr<COutputPin> CFilterScalarFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch2 = child2->reduce(gc, thisField);
+    std::shared_ptr<COutputPin> ch3 = child3->reduce(gc, thisField);
+
     std::shared_ptr<CScalarFieldFieldArithmeticFilter> filter(new CScalarFieldFieldArithmeticFilter(gc, opId, child1->reduce()));
-    child2->reduce(gc, thisField)->connectOutput(filter, 0);
-    child3->reduce(gc, thisField)->connectOutput(filter, 1);
+    ch2->connectOutput(filter, 0);
+    ch3->connectOutput(filter, 1);
 
     (filter->parent_filters).resize(2);
-    (filter->parent_filters)[0] = child2->reduce(gc, thisField);
-    (filter->parent_filters)[1] = child3->reduce(gc, thisField);
+    (filter->parent_filters)[0] = ch2;
+    (filter->parent_filters)[1] = ch3;
+
+    filter->tag = (ch3->tag || ch2->tag);
+    filter->start_graph = ch3->tag? ch3->start_graph : (ch2->tag? ch2->start_graph: -1);
+    filter->end_graph = ch3->tag? ch3->end_graph : (ch2->tag? ch2->end_graph: -1);
+    filter->field = &thisField;
 
     return filter;
@@ -265,9 +320,17 @@
   std::shared_ptr<COutputPin> CFilterFieldScalarScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch1 = child1->reduce(gc, thisField);
+
     std::shared_ptr<CFieldScalarScalarArithmeticFilter> filter(new CFieldScalarScalarArithmeticFilter(gc, opId, child2->reduce(),child3->reduce()));
-    child1->reduce(gc, thisField)->connectOutput(filter, 0);
-
-    (filter->parent_filters).resize(1);
-    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
+    ch1->connectOutput(filter, 0);
+
+    (filter->parent_filters).resize(1);
+    (filter->parent_filters)[0] = ch1;
+
+    filter->tag = ch1->tag;
+    filter->start_graph = ch1->start_graph;
+    filter->end_graph = ch1->end_graph;
+    filter->field = &thisField;
+
     return filter;
   }
@@ -288,11 +351,19 @@
   std::shared_ptr<COutputPin> CFilterFieldScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch1 = child1->reduce(gc, thisField);
+    std::shared_ptr<COutputPin> ch3 = child3->reduce(gc, thisField);
+
     std::shared_ptr<CFieldScalarFieldArithmeticFilter> filter(new CFieldScalarFieldArithmeticFilter(gc, opId, child2->reduce()));
-    child1->reduce(gc, thisField)->connectOutput(filter, 0);
-    child3->reduce(gc, thisField)->connectOutput(filter, 1);
+    ch1->connectOutput(filter, 0);
+    ch3->connectOutput(filter, 1);
 
     (filter->parent_filters).resize(2);
-    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
-    (filter->parent_filters)[1] = child3->reduce(gc, thisField);
+    (filter->parent_filters)[0] = ch1;
+    (filter->parent_filters)[1] = ch3;
+
+    filter->tag = (ch3->tag || ch1->tag);
+    filter->start_graph = ch3->tag? ch3->start_graph : (ch1->tag? ch1->start_graph: -1);
+    filter->end_graph = ch3->tag? ch3->end_graph : (ch1->tag? ch1->end_graph: -1);
+    filter->field = &thisField;
 
     return filter;
@@ -314,11 +385,19 @@
   std::shared_ptr<COutputPin> CFilterFieldFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch1 = child1->reduce(gc, thisField);
+    std::shared_ptr<COutputPin> ch2 = child2->reduce(gc, thisField);
+
     std::shared_ptr<CFieldFieldScalarArithmeticFilter> filter(new CFieldFieldScalarArithmeticFilter(gc, opId, child3->reduce()));
-    child1->reduce(gc, thisField)->connectOutput(filter, 0);
-    child2->reduce(gc, thisField)->connectOutput(filter, 1);
+    ch1->connectOutput(filter, 0);
+    ch2->connectOutput(filter, 1);
 
     (filter->parent_filters).resize(2);
-    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
-    (filter->parent_filters)[1] = child2->reduce(gc, thisField);
+    (filter->parent_filters)[0] = ch1;
+    (filter->parent_filters)[1] = ch2;
+
+    filter->tag = (ch2->tag || ch1->tag);
+    filter->start_graph = ch2->tag? ch2->start_graph : (ch1->tag? ch1->start_graph: -1);
+    filter->end_graph = ch2->tag? ch2->end_graph : (ch1->tag? ch1->end_graph: -1);
+    filter->field = &thisField;
     return filter;
   }
@@ -338,13 +417,25 @@
   std::shared_ptr<COutputPin> CFilterFieldFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
+    std::shared_ptr<COutputPin> ch1 = child1->reduce(gc, thisField);
+    std::shared_ptr<COutputPin> ch2 = child2->reduce(gc, thisField);
+    std::shared_ptr<COutputPin> ch3 = child3->reduce(gc, thisField);
+
     std::shared_ptr<CFieldFieldFieldArithmeticFilter> filter(new CFieldFieldFieldArithmeticFilter(gc, opId));
-    child1->reduce(gc, thisField)->connectOutput(filter, 0);
-    child2->reduce(gc, thisField)->connectOutput(filter, 1);
-    child3->reduce(gc, thisField)->connectOutput(filter, 2);
+    std::cout<<"std::shared_ptr<CFieldFieldFieldArithmeticFilter> filter(new CFieldFieldFieldArithmeticFilter(gc, opId))" <<std::endl;
+    ch1->connectOutput(filter, 0);
+    ch2->connectOutput(filter, 1);
+    ch3->connectOutput(filter, 2);
 
     (filter->parent_filters).resize(3);
-    (filter->parent_filters)[0] = child1->reduce(gc, thisField);
-    (filter->parent_filters)[1] = child2->reduce(gc, thisField);
-    (filter->parent_filters)[2] = child3->reduce(gc, thisField);
+    (filter->parent_filters)[0] = ch1;
+    (filter->parent_filters)[1] = ch2;
+    (filter->parent_filters)[2] = ch3;
+
+
+    filter->tag = (ch1->tag || ch1->tag || ch3->tag);
+    filter->start_graph = ch1->tag? ch1->start_graph : (ch2->tag? ch2->start_graph: (ch3->tag? ch3->start_graph: -1));
+    filter->end_graph = ch1->tag? ch1->end_graph : (ch2->tag? ch2->end_graph: (ch3->tag? ch3->end_graph: -1));
+    filter->field = &thisField;
+
 
     return filter;
Index: XIOS/dev/dev_trunk_omp/src/parse_expr/yacc_parser.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/parse_expr/yacc_parser.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/parse_expr/yacc_parser.cpp	(revision 1680)
@@ -70,4 +70,6 @@
 #include "exception.hpp"
 
+#include "yacc_var.hpp"
+
 using namespace std;
 using namespace xios;
@@ -86,6 +88,13 @@
   #pragma omp threadprivate(parsed, globalInputText_ptr, globalReadOffset)
 
+  
+  std::string *xios::yacc_globalInputText_ptr = 0;
+  // #pragma omp threadprivate(xios::yacc_globalInputText_ptr)
+
   int readInputForLexer(char* buffer, size_t* numBytesRead, size_t maxBytesToRead)
   {
+    yacc_globalInputText_ptr = globalInputText_ptr;
+
+    std::cout<<"========= yacc_globalInputText_ptr = "<<*yacc_globalInputText_ptr<<std::endl;
     if(globalInputText_ptr == 0) globalInputText_ptr = new std::string;
     size_t numBytesToRead = maxBytesToRead;
Index: XIOS/dev/dev_trunk_omp/src/parse_expr/yacc_parser.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/parse_expr/yacc_parser.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/parse_expr/yacc_parser.hpp	(revision 1680)
@@ -92,3 +92,4 @@
 int yyparse (void);
 
+
 #endif /* !YY_YY_YACC_PARSER_HPP_INCLUDED  */
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_duplicate_scalar.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_duplicate_scalar.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_duplicate_scalar.hpp	(revision 1680)
@@ -33,4 +33,6 @@
   static bool registerTrans();
 
+  virtual StdString getName() {return "Axis Trans. Filter \\n Duplicate Scalar";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_extract.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_extract.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_extract.hpp	(revision 1680)
@@ -27,4 +27,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Axis Trans. Filter \\n Extract";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_extract_domain.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_extract_domain.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_extract_domain.hpp	(revision 1680)
@@ -40,4 +40,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Axis Trans. Filter \\n Extract Domain";}
+
 protected:
   enum ExtractDirection {
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_interpolate.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_interpolate.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_interpolate.hpp	(revision 1680)
@@ -32,4 +32,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Axis Trans. Filter \\n Interpolation";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_inverse.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_inverse.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_inverse.hpp	(revision 1680)
@@ -31,4 +31,6 @@
   static bool registerTrans();
 
+  virtual StdString getName() {return "Axis Trans. Filter \\n Inverse";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_reduce_axis.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_reduce_axis.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_reduce_axis.hpp	(revision 1680)
@@ -40,4 +40,6 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Axis Trans. Filter \\n Reduce Axis";}
 protected:
   
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_reduce_domain.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 1680)
@@ -41,4 +41,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Axis Trans. Filter \\n Reduce Domain";}
+
 protected:
   enum ReduceDirection {
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_temporal_splitting.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_temporal_splitting.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_temporal_splitting.hpp	(revision 1680)
@@ -34,4 +34,6 @@
   static bool registerTrans();
 
+  virtual StdString getName() {return "Axis Trans. Filter \\n Temporal Splitting";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_transformation.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_transformation.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_transformation.hpp	(revision 1680)
@@ -31,4 +31,6 @@
   virtual ~CAxisAlgorithmTransformation();
 
+  virtual StdString getName() {return "Axis Trans. Filter \\n Transformation";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_zoom.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_zoom.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/axis_algorithm_zoom.hpp	(revision 1680)
@@ -27,4 +27,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Axis Trans. Filter \\n Zoom";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_compute_connectivity.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_compute_connectivity.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_compute_connectivity.hpp	(revision 1680)
@@ -28,4 +28,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Domain Trans. Filter \\n Compute Connectivity";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_expand.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_expand.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_expand.hpp	(revision 1680)
@@ -28,4 +28,6 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Domain Trans. Filter \\n Expand";}
 
 protected:
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_extract.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_extract.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_extract.hpp	(revision 1680)
@@ -23,4 +23,6 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Domain Trans. Filter \\n Extract";}
 protected:
   void updateDomainAttributes();
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_generate_rectilinear.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_generate_rectilinear.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_generate_rectilinear.hpp	(revision 1680)
@@ -33,4 +33,6 @@
   virtual ~CDomainAlgorithmGenerateRectilinear() {}
 
+  virtual StdString getName() {return "Domain Trans. Filter \\n Generate Rectilinear";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_interpolate.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_interpolate.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_interpolate.hpp	(revision 1680)
@@ -39,4 +39,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Domain Trans. Filter \\n Interpolation";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_reorder.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_reorder.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_reorder.hpp	(revision 1680)
@@ -26,4 +26,6 @@
   static bool registerTrans();
 
+  virtual StdString getName() {return "Domain Trans. Filter \\n Reorder";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_transformation.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_transformation.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_transformation.hpp	(revision 1680)
@@ -27,4 +27,6 @@
   virtual ~CDomainAlgorithmTransformation();
 
+  virtual StdString getName() {return "Domain Trans. Filter \\n Transformation";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >&);
Index: XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_zoom.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_zoom.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/domain_algorithm_zoom.hpp	(revision 1680)
@@ -23,4 +23,6 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Domain Trans. Filter \\n Zoom";}
 protected:
   void updateDomainAttributes();
Index: XIOS/dev/dev_trunk_omp/src/transformation/generic_algorithm_transformation.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/generic_algorithm_transformation.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/generic_algorithm_transformation.hpp	(revision 1680)
@@ -74,5 +74,5 @@
                      bool ignoreMissingValue, bool firstPass);
 
-  virtual StdString getName() {return "Generic algorithm transformation";}
+  virtual StdString getName() {return "Generic Trans. Filter";}
 
   /*!
Index: XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_extract_axis.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_extract_axis.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_extract_axis.hpp	(revision 1680)
@@ -40,4 +40,6 @@
   static bool registerTrans();
 
+  virtual StdString getName() {return "Scalar Trans. Filter \\n Extract Axis";}
+
 protected:
   int pos_;
Index: XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_axis.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_axis.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_axis.hpp	(revision 1680)
@@ -41,4 +41,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Scalar Trans. Filter \\n Reduce Axis";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_domain.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_domain.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_domain.hpp	(revision 1680)
@@ -41,4 +41,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Scalar Trans. Filter \\n Reduce Domain";}
+
 protected:
   bool local ;
Index: XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_scalar.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_scalar.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_reduce_scalar.hpp	(revision 1680)
@@ -36,4 +36,7 @@
 
   static bool registerTrans();
+
+  virtual StdString getName() {return "Scalar Trans. Filter \\n Reduce Scalar";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_transformation.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_transformation.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/transformation/scalar_algorithm_transformation.hpp	(revision 1680)
@@ -31,4 +31,6 @@
   virtual ~CScalarAlgorithmTransformation();
 
+  virtual StdString getName() {return "Scalar Trans. Filter \\n Transformation";}
+
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);
Index: XIOS/dev/dev_trunk_omp/src/workflow_graph.cpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/workflow_graph.cpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/workflow_graph.cpp	(revision 1680)
@@ -9,4 +9,7 @@
   std::unordered_map <int, graph_info_box_edge > *CWorkflowGraph::mapFieldToFilters_ptr_with_info = 0;
   #pragma omp threadprivate(CWorkflowGraph::mapFieldToFilters_ptr_with_info)
+
+  std::unordered_map <size_t, int> *CWorkflowGraph::mapHashFilterID_ptr = 0;
+  #pragma omp threadprivate(CWorkflowGraph::mapHashFilterID_ptr)
 
 
@@ -121,4 +124,18 @@
 
 
+  void CWorkflowGraph::addNode(int nodeID, StdString filterName, int filterClass, bool filterFilled, int entry_nb, CDataPacketPtr packet)
+  TRY
+  {
+    (*mapFilters_ptr_with_info)[nodeID].filter_name = filterName;
+    (*mapFilters_ptr_with_info)[nodeID].filter_class = filterClass;
+    (*mapFilters_ptr_with_info)[nodeID].filter_filled = filterFilled;
+    (*mapFilters_ptr_with_info)[nodeID].expected_entry_nb = entry_nb;
+    (*mapFilters_ptr_with_info)[nodeID].date = packet->date;
+    (*mapFilters_ptr_with_info)[nodeID].timestamp = packet->timestamp;
+  }
+  CATCH
+
+
+
   void CWorkflowGraph::addEdge(int edgeID, int toID, CDataPacketPtr packet)
   TRY
@@ -131,4 +148,16 @@
     (*mapFieldToFilters_ptr_with_info)[edgeID].date = packet->date;
     (*mapFieldToFilters_ptr_with_info)[edgeID].timestamp = packet->timestamp;
+    (*mapFieldToFilters_ptr_with_info)[edgeID].field = packet->field;
+    (*mapFieldToFilters_ptr_with_info)[edgeID].attributes = packet->field->recordXiosAttributes();
+  }
+  CATCH
+
+
+  void CWorkflowGraph::allocNodeEdge()
+  TRY
+  {
+    if(mapFilters_ptr_with_info==0) mapFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_node>;
+    if(mapFieldToFilters_ptr_with_info==0) mapFieldToFilters_ptr_with_info = new std::unordered_map <int, graph_info_box_edge >;
+    if(mapHashFilterID_ptr==0) mapHashFilterID_ptr = new std::unordered_map <size_t, int >;
   }
   CATCH
Index: XIOS/dev/dev_trunk_omp/src/workflow_graph.hpp
===================================================================
--- XIOS/dev/dev_trunk_omp/src/workflow_graph.hpp	(revision 1679)
+++ XIOS/dev/dev_trunk_omp/src/workflow_graph.hpp	(revision 1680)
@@ -12,4 +12,5 @@
 namespace xios
 {
+  class CField;
 
   struct graph_info_box_node
@@ -23,4 +24,9 @@
     Time timestamp;
     StdString transform_type;
+    StdString attributes;
+    StdString field_id;
+    bool inputs_complete;
+    int filter_tag;
+    int clusterID;
   };
 
@@ -34,4 +40,6 @@
     CDate date;
     Time timestamp;
+    CField *field;
+    StdString attributes;
     
   };
@@ -60,9 +68,14 @@
       #pragma omp threadprivate(mapFieldToFilters_ptr_with_info)
 
+      static std::unordered_map <size_t, int> *mapHashFilterID_ptr;
+      #pragma omp threadprivate(mapHashFilterID_ptr)
+
 
       static bool build_begin;
       #pragma omp threadprivate(build_begin)
 
+      static void addNode(int nodeID, StdString filterName, int filter_class, bool filter_filled, int entry_nb, CDataPacketPtr packet);
       static void addEdge(int edgeID, int toID, CDataPacketPtr packet);
+      static void allocNodeEdge();
 
     private:
