Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.cpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.cpp	(revision 2206)
@@ -221,5 +221,5 @@
    CATCH
 
-   CAxis* CAxis::get(const string& id)
+   CAxis* CAxis::get(const string& id, bool noError)
    {
      const regex r("::");
@@ -231,8 +231,36 @@
         if (fieldId.empty()) ERROR("CAxis* CAxis::get(string& id)", <<" id = "<<id<< "  -> bad format id, field name is empty");
         string suffix=m.suffix() ;
+        if (!CField::has(fieldId)) 
+          if (noError)  return nullptr ;
+          else ERROR("CAxis* CAxis::get(string& id, bool noError)", <<" id = "<<id<< "  -> field Id : < "<<fieldId<<" > doesn't exist");
         CField* field=CField::get(fieldId) ;
-        return field->getAssociatedAxis(suffix) ;
+        return field->getAssociatedAxis(suffix, noError) ;
      }
-     else return CObjectFactory::GetObject<CAxis>(id).get();
+     {
+       if (noError) if(!CObjectFactory::HasObject<CAxis>(id)) return nullptr ;
+       return CObjectFactory::GetObject<CAxis>(id).get();
+     }
+   }
+   
+   bool CAxis::has(const string& id)
+   {
+     if (CAxis::get(id,true)==nullptr) return false ;
+     else return true ;
+   }
+   
+   CField* CAxis::getFieldFromId(const string& id)
+   {
+     const regex r("::");
+     smatch m;
+     if (regex_search(id, m, r))
+     {
+        if (m.size()!=1) ERROR("CField* CAxis::getFieldFromId(const string& id)", <<" id = "<<id<< "  -> bad format id, separator :: append more than one time");
+        string fieldId=m.prefix() ;
+        if (fieldId.empty()) ERROR("CField* CAxis::getFieldFromId(const string& id)", <<" id = "<<id<< "  -> bad format id, field name is empty");
+        string suffix=m.suffix() ;
+        CField* field=CField::get(fieldId) ;
+        return field ;
+     }
+     else return nullptr;
    }
 
@@ -635,4 +663,29 @@
   }
   CATCH_DUMP_ATTR
+
+  bool CAxis::activateFieldWorkflow(CGarbageCollector& gc)
+  TRY
+  {
+    if (!axis_ref.isEmpty())
+    {
+      CField* field=getFieldFromId(axis_ref) ;
+      if (field!=nullptr)
+      {
+        bool ret = field->buildWorkflowGraph(gc) ;
+        if (!ret) return false ; // cannot build workflow graph at this state
+      }
+      else 
+      {
+        CAxis* axis = get(axis_ref) ;
+        bool ret = axis->activateFieldWorkflow(gc) ;
+        if (!ret) return false ; // cannot build workflow graph at this state
+        axis_ref=axis->getId() ; // replace domain_ref by solved reference
+      }
+    }
+    activateFieldWorkflow_done_=true ;
+    return true ;
+  }
+  CATCH_DUMP_ATTR
+
 
   void CAxis::setContextClient(CContextClient* contextClient)
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/axis.hpp	(revision 2206)
@@ -32,4 +32,5 @@
    class CAxisAttributes;
    class CAxis;
+   class CField;
 
    ///--------------------------------------------------------------
@@ -69,5 +70,7 @@
 
          static CAxis* createAxis();
-         static CAxis* get(const string& id) ; //<! return axis pointer using id
+         static CAxis* get(const string& id, bool noError=false) ; //<! return axis pointer using id
+         static bool has(const string& id) ; //<! return domain pointer using id
+         static CField*  getFieldFromId(const string& id) ;
 
          /// Accesseurs ///
@@ -144,4 +147,8 @@
       private:
         bool solveInheritanceTransformation_done_= false ;
+      public:
+        bool activateFieldWorkflow(CGarbageCollector& gc) ;
+      private:
+        bool activateFieldWorkflow_done_=false ;
       private:
         CGenericAlgorithmTransformation* transformationAlgorithm_ = nullptr ;
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.cpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.cpp	(revision 2206)
@@ -79,5 +79,5 @@
    CATCH
 
-   CDomain* CDomain::get(const string& id)
+   CDomain* CDomain::get(const string& id, bool noError)
    {
      const regex r("::");
@@ -89,10 +89,38 @@
         if (fieldId.empty()) ERROR("CDomain* CDomain::get(string& id)", <<" id = "<<id<< "  -> bad format id, field name is empty");
         string suffix=m.suffix() ;
+        if (!CField::has(fieldId)) 
+          if (noError)  return nullptr ;
+          else ERROR("CDomain* CDomain::get(string& id)", <<" id = "<<id<< "  -> field Id : < "<<fieldId<<" > doesn't exist");
         CField* field=CField::get(fieldId) ;
-        return field->getAssociatedDomain(suffix) ;
-     }
-     else return CObjectFactory::GetObject<CDomain>(id).get();
-   }
-
+        return field->getAssociatedDomain(suffix, noError) ;
+     }
+     else 
+     {
+       if (noError) if(!CObjectFactory::HasObject<CDomain>(id)) return nullptr ;
+       return CObjectFactory::GetObject<CDomain>(id).get();
+     }
+   }
+
+   bool CDomain::has(const string& id)
+   {
+     if (CDomain::get(id,true)==nullptr) return false ;
+     else return true ;
+   }
+   
+   CField* CDomain::getFieldFromId(const string& id)
+   {
+     const regex r("::");
+     smatch m;
+     if (regex_search(id, m, r))
+     {
+        if (m.size()!=1) ERROR("CField* CDomain::getFieldFromId(const string& id)", <<" id = "<<id<< "  -> bad format id, separator :: append more than one time");
+        string fieldId=m.prefix() ;
+        if (fieldId.empty()) ERROR("CField* CDomain::getFieldFromId(const string& id)", <<" id = "<<id<< "  -> bad format id, field name is empty");
+        string suffix=m.suffix() ;
+        CField* field=CField::get(fieldId) ;
+        return field ;
+     }
+     else return nullptr;
+   }
 
    const std::set<StdString> & CDomain::getRelFiles(void) const
@@ -2337,4 +2365,28 @@
   CATCH_DUMP_ATTR
   
+
+  bool CDomain::activateFieldWorkflow(CGarbageCollector& gc)
+  TRY
+  {
+    if (!domain_ref.isEmpty())
+    {
+      CField* field=getFieldFromId(domain_ref) ;
+      if (field!=nullptr)
+      {
+        bool ret = field->buildWorkflowGraph(gc) ;
+        if (!ret) return false ; // cannot build workflow graph at this state
+      }
+      else 
+      {
+        CDomain* domain = get(domain_ref) ;
+        bool ret = domain->activateFieldWorkflow(gc) ;
+        if (!ret) return false ; // cannot build workflow graph at this state
+        domain_ref=domain->getId() ; // replace domain_ref by solved reference
+      }
+    }
+    activateFieldWorkflow_done_=true ;
+    return true ;
+  }
+  CATCH_DUMP_ATTR
 /////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////// 
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.hpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/domain.hpp	(revision 2206)
@@ -36,4 +36,5 @@
    class CDomain;
    class CFile;
+   class CField ;
 
    ///--------------------------------------------------------------
@@ -72,6 +73,7 @@
        
          static CDomain* createDomain();
-         static CDomain* get(const string& id) ; //<! return domain pointer using id
-        // static bool has(const string& id) ;     //<! return true if domain with identifier id exist
+         static CDomain* get(const string& id, bool noError=false) ; //<! return domain pointer using id
+         static bool has(const string& id) ; //<! return domain pointer using id
+         static CField*  getFieldFromId(const string& id) ;
 
          CMesh* mesh;
@@ -109,4 +111,9 @@
       private:
         bool solveInheritanceTransformation_done_= false ;
+      public:
+        bool activateFieldWorkflow(CGarbageCollector& gc) ;
+      private:
+        bool activateFieldWorkflow_done_=false ;
+
       private:
         CGenericAlgorithmTransformation* transformationAlgorithm_ = nullptr ;
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp	(revision 2206)
@@ -327,23 +327,35 @@
   CATCH
 
-  CDomain* CField::getAssociatedDomain(const string& domainId) const
-  {
-    if (grid_==nullptr) ERROR("CDomain* CField::getAssociatedDomain(const string& domainId)", <<" field with id="<<getId()<<" has no associated grid, "
+  CDomain* CField::getAssociatedDomain(const string& domainId, bool noError) const
+  {
+    if (grid_==nullptr)
+    { 
+      if (noError) return nullptr ;
+      else ERROR("CDomain* CField::getAssociatedDomain(const string& domainId)", <<" field with id="<<getId()<<" has no associated grid, "
                               <<"check if the worklfow is enabled for this field");
-    grid_->getAssociatedDomain(domainId) ;
-  }
-
-  CAxis* CField::getAssociatedAxis(const string& axisId) const
-  {
-    if (grid_==nullptr) ERROR("CAxis* CField::getAssociatedAxis(const string& axisId)", <<" field with id="<<getId()<<" has no associated grid, "
+    }
+    return grid_->getAssociatedDomain(domainId, noError) ;
+  }
+
+  CAxis* CField::getAssociatedAxis(const string& axisId, bool noError) const
+  {
+    if (grid_==nullptr) 
+    {
+      if (noError) return nullptr ;
+      else  ERROR("CAxis* CField::getAssociatedAxis(const string& axisId)", <<" field with id="<<getId()<<" has no associated grid, "
                               <<"check if the worklfow is enabled for this field");
-    grid_->getAssociatedAxis(axisId) ;
-  }
-
-  CScalar* CField::getAssociatedScalar(const string& scalarId) const
-  {
-    if (grid_==nullptr) ERROR("CScalar* CField::getAssociatedScalar(const string& scalarId)", <<" field with id="<<getId()<<" has no associated grid, "
+    }
+    return grid_->getAssociatedAxis(axisId, noError) ;
+  }
+
+  CScalar* CField::getAssociatedScalar(const string& scalarId, bool noError) const
+  {
+    if (grid_==nullptr) 
+    { 
+      if (noError) return nullptr ;
+      else ERROR("CScalar* CField::getAssociatedScalar(const string& scalarId)", <<" field with id="<<getId()<<" has no associated grid, "
                               <<"check if the worklfow is enabled for this field");
-    grid_->getAssociatedScalar(scalarId) ;
+    }
+    return grid_->getAssociatedScalar(scalarId, noError) ;
   }
 
@@ -618,4 +630,5 @@
     solveGridReference() ; // grid_ is now defined
     if (!isGridCompleted()) return false;
+    if (grid_->activateFieldWorkflow(gc)==false) return false; // workflow graph cannot be built at this stage
 
     // Check if we have an expression to parse
@@ -1181,5 +1194,6 @@
       if (!domain_ref.isEmpty())
       {
-        StdString tmp = domain_ref.getValue();
+        CField* field=CDomain::getFieldFromId(domain_ref) ;
+        if (field!=nullptr) field->solveGridReference() ;
         if (CDomain::has(domain_ref))
         {
@@ -1195,4 +1209,6 @@
       if (!axis_ref.isEmpty())
       {
+        CField* field=CAxis::getFieldFromId(axis_ref) ;
+        if (field!=nullptr) field->solveGridReference() ;
         if (CAxis::has(axis_ref))
         {
@@ -1208,4 +1224,6 @@
       if (!scalar_ref.isEmpty())
       {
+        CField* field=CScalar::getFieldFromId(scalar_ref) ;
+        if (field!=nullptr) field->solveGridReference() ;
         if (CScalar::has(scalar_ref))
         {
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp	(revision 2206)
@@ -104,7 +104,7 @@
          CGrid* getRelGrid(void) const;
          CFile* getRelFile(void) const;
-         CDomain* getAssociatedDomain(const std::string& domainId) const;
-         CAxis*   getAssociatedAxis(const std::string& axisId) const;
-         CScalar* getAssociatedScalar(const std::string& scalarId) const;
+         CDomain* getAssociatedDomain(const std::string& domainId, bool noError=false) const;
+         CAxis*   getAssociatedAxis(const std::string& axisId, bool noError=false) const;
+         CScalar* getAssociatedScalar(const std::string& scalarId, bool noError=false) const;
 
          func::CFunctor::ETimeType getOperationTimeType() const;
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.cpp	(revision 2206)
@@ -400,5 +400,5 @@
   CATCH_DUMP_ATTR
 
-  CDomain* CGrid::getAssociatedDomain(const string& domainId)
+  CDomain* CGrid::getAssociatedDomain(const string& domainId, bool noError)
   {
     const regex r("\\[[0-9]*\\]");
@@ -413,5 +413,7 @@
     }
     std::vector<CDomain*> domainList = this->getDomains();
-    if (domainList.empty()) ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"no domain is compsing the grid");
+    if (domainList.empty()) 
+      if (noError) return nullptr ;
+      else ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"no domain is composing the grid");
     if (id.empty())
     {
@@ -419,9 +421,12 @@
       {
         if (domainList.size()==1) return domainList[0] ;
-        else ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"the grid contain more than 1 domain, use [#n] to specify which one must be retrieved");
+        else 
+          if (noError) return nullptr ;
+          else ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"the grid contain more than 1 domain, use [#n] to specify which one must be retrieved");
       }
       else
       {
         if (domainList.size()>pos) return domainList[pos] ;
+        else if (noError) return nullptr ;
         else ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"the position of the requested domain [ pos = "<<pos
                    <<" ] is greater than the number of domain composing the grid  [ numDomain = "<<domainList.size()<<" ]");
@@ -434,7 +439,11 @@
         int nbDomain=0 ;
         for(int i=0; i<domainList.size();i++) if (domainList[i]->getTemplateId()==id) nbDomain++ ;
-        if (nbDomain>1) ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"no domain with the id = "<<id
+        if (nbDomain>1) 
+          if (noError) return nullptr ;
+          else ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"no domain with the id = "<<id
                               <<" is composing the grid") ;
-        if (nbDomain==0) ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"the grid contain more than 1 domain with the id = "
+        if (nbDomain==0) 
+          if (noError) return nullptr ;
+          else ERROR("CGrid::getAssociatedDomain(const string& domainId)", <<"the grid contain more than 1 domain with the id = "
                                <<id<<" , use [#n] to specify which one must be retrieved") ;
         for(int i=0; i<domainList.size();i++) if (domainList[i]->getTemplateId()==id) return domainList[i]  ;
@@ -448,10 +457,11 @@
           currentPos++ ;
         }
-        ERROR("CGrid::getAssociatedDomain(const string& domainId)",<<"Cannot find domain with [ id = "<< id <<" ] at [ pos = "<<pos<<" ] in the grid");
+        if (noError) return nullptr ; 
+        else ERROR("CGrid::getAssociatedDomain(const string& domainId)",<<"Cannot find domain with [ id = "<< id <<" ] at [ pos = "<<pos<<" ] in the grid");
       }  
     }
   } 
 
-  CAxis* CGrid::getAssociatedAxis(const string& axisId)
+  CAxis* CGrid::getAssociatedAxis(const string& axisId, bool noError)
   {
     const regex r("\\[[0-9]*\\]");
@@ -466,5 +476,7 @@
     }
     std::vector<CAxis*> axisList = this->getAxis();
-    if (axisList.empty()) ERROR("CGrid::getAssociatedAxis(const string& AxisId)", <<"no axis is composing the grid");
+    if (axisList.empty())
+      if (noError) return nullptr;
+      else ERROR("CGrid::getAssociatedAxis(const string& AxisId)", <<"no axis is composing the grid");
     if (id.empty())
     {
@@ -472,10 +484,14 @@
       {
         if (axisList.size()==1) return axisList[0] ;
-        else ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"the grid contain more than 1 axis, use [#n] to specify which one must be retrieved");
+        else 
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"the grid contain more than 1 axis, use [#n] to specify which one must be retrieved");
       }
       else
       {
         if (axisList.size()>pos) return axisList[pos] ;
-        else ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"the position of the requested axis [ pos = "<<pos
+        else
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"the position of the requested axis [ pos = "<<pos
                    <<" ] is greater than the number of axis composing the grid  [ numAxis = "<<axisList.size()<<" ]");
       }
@@ -487,7 +503,11 @@
         int nbAxis=0 ;
         for(int i=0; i<axisList.size();i++) if (axisList[i]->getTemplateId()==id) nbAxis++ ;
-        if (nbAxis>1) ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"no axis with the id = "<<id
+        if (nbAxis>1) 
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"no axis with the id = "<<id
                               <<" is composing the grid") ;
-        if (nbAxis==0) ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"the grid contain more than 1 axis with the id = "
+        if (nbAxis==0) 
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedAxis(const string& axisId)", <<"the grid contain more than 1 axis with the id = "
                                <<id<<" , use [#n] to specify which one must be retrieved") ;
         for(int i=0; i<axisList.size();i++) if (axisList[i]->getTemplateId()==id) return axisList[i]  ;
@@ -501,10 +521,11 @@
           currentPos++ ;
         }
-        ERROR("CGrid::getAssociatedAxis(const string& axisId)",<<"Cannot find axis with [ id = "<< id <<" ] at [ pos = "<<pos<<" ] in the grid");
+        if (noError) return nullptr;
+        else ERROR("CGrid::getAssociatedAxis(const string& axisId)",<<"Cannot find axis with [ id = "<< id <<" ] at [ pos = "<<pos<<" ] in the grid");
       }  
     }
   } 
 
-  CScalar* CGrid::getAssociatedScalar(const string& scalarId)
+  CScalar* CGrid::getAssociatedScalar(const string& scalarId, bool noError)
   {
     const regex r("\\[[0-9]*\\]");
@@ -519,5 +540,7 @@
     }
     std::vector<CScalar*> scalarList = this->getScalars();
-    if (scalarList.empty()) ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"no scalar is composing the grid");
+    if (scalarList.empty()) 
+      if (noError) return nullptr;
+      else ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"no scalar is composing the grid");
     if (id.empty())
     {
@@ -525,10 +548,14 @@
       {
         if (scalarList.size()==1) return scalarList[0] ;
-        else ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"the grid contain more than 1 scalar, use [#n] to specify which one must be retrieved");
+        else 
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"the grid contain more than 1 scalar, use [#n] to specify which one must be retrieved");
       }
       else
       {
         if (scalarList.size()>pos) return scalarList[pos] ;
-        else ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"the position of the requested scalar [ pos = "<<pos
+        else 
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"the position of the requested scalar [ pos = "<<pos
                    <<" ] is greater than the number of scalar composing the grid  [ numScalar = "<<scalarList.size()<<" ]");
       }
@@ -540,7 +567,11 @@
         int nbScalar=0 ;
         for(int i=0; i<scalarList.size();i++) if (scalarList[i]->getTemplateId()==id) nbScalar++ ;
-        if (nbScalar>1) ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"no scalar with the id = "<<id
+        if (nbScalar>1) 
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"no scalar with the id = "<<id
                               <<" is composing the grid") ;
-        if (nbScalar==0) ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"the grid contain more than 1 scalar with the id = "
+        if (nbScalar==0) 
+          if (noError) return nullptr;
+          else ERROR("CGrid::getAssociatedScalar(const string& scalarId)", <<"the grid contain more than 1 scalar with the id = "
                                <<id<<" , use [#n] to specify which one must be retrieved") ;
         for(int i=0; i<scalarList.size();i++) if (scalarList[i]->getTemplateId()==id) return scalarList[i]  ;
@@ -554,5 +585,6 @@
           currentPos++ ;
         }
-        ERROR("CGrid::getAssociatedScalar(const string& scalarId)",<<"Cannot find scalar with [ id = "<< id <<" ] at [ pos = "<<pos<<" ] in the grid");
+        if (noError) return nullptr;
+        else ERROR("CGrid::getAssociatedScalar(const string& scalarId)",<<"Cannot find scalar with [ id = "<< id <<" ] at [ pos = "<<pos<<" ] in the grid");
       }  
     }
@@ -1774,4 +1806,34 @@
       pScalar->solveInheritanceTransformation();
     }
+  }
+  CATCH_DUMP_ATTR
+
+  bool CGrid::activateFieldWorkflow(CGarbageCollector& gc)
+  TRY
+  {
+    setDomainList();
+    for (auto domainId : domList_)
+    {
+      CDomain* pDom = CDomain::get(domainId);
+      bool ret = pDom->activateFieldWorkflow(gc);
+      if (!ret) return false ;
+    }
+
+    setAxisList();
+    for (auto axisId : axisList_)
+    {
+      CAxis* pAxis = CAxis::get(axisId);
+      bool ret = pAxis->activateFieldWorkflow(gc);
+      if (!ret) return false ;
+    }
+
+    setScalarList();
+    for (auto scalarId : scalarList_)
+    {
+      CScalar* pScalar = CScalar::get(scalarId);
+      bool ret = pScalar->activateFieldWorkflow(gc);
+      if (!ret) return false ;
+    }
+    return true ;
   }
   CATCH_DUMP_ATTR
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.hpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/grid.hpp	(revision 2206)
@@ -147,7 +147,7 @@
          static CGrid* cloneGrid(const StdString& idNewGrid, CGrid* gridSrc);
 
-         CDomain* getAssociatedDomain(const string& domainId) ;
-         CAxis*   getAssociatedAxis(const string& axisId) ;
-         CScalar* getAssociatedScalar(const string& scalarId) ;
+         CDomain* getAssociatedDomain(const string& domainId, bool noError=false) ;
+         CAxis*   getAssociatedAxis(const string& axisId, bool noError=false) ;
+         CScalar* getAssociatedScalar(const string& scalarId, bool noError=false) ;
       public:            
          void solveDomainAxisRef(bool areAttributesChecked);
@@ -158,4 +158,5 @@
          void solveScalarRef(bool checkAtt);
          void solveElementsRefInheritance(bool apply = true);
+         bool activateFieldWorkflow(CGarbageCollector& gc) ;
         // void solveTransformations();
          void solveDomainAxisBaseRef();
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.cpp	(revision 2206)
@@ -53,5 +53,5 @@
   }
 
-  CScalar* CScalar::get(const string& id)
+  CScalar* CScalar::get(const string& id, bool noError)
   {
     const regex r("::");
@@ -63,9 +63,38 @@
       if (fieldId.empty()) ERROR("CScalar* CScalar::get(string& id)", <<" id = "<<id<< "  -> bad format id, field name is empty");
       string suffix=m.suffix() ;
+      if (!CField::has(fieldId)) 
+          if (noError)  return nullptr ;
+          else ERROR("CScalar* CScalar::get(const string& id, bool noError)", <<" id = "<<id<< "  -> field Id : < "<<fieldId<<" > doesn't exist");
       CField* field=CField::get(fieldId) ;
-      return field->getAssociatedScalar(suffix) ;
-    }
-    else return CObjectFactory::GetObject<CScalar>(id).get();
-  }
+      return field->getAssociatedScalar(suffix, noError) ;
+    }
+    else
+    {
+       if (noError) if(!CObjectFactory::HasObject<CScalar>(id)) return nullptr ;
+       return CObjectFactory::GetObject<CScalar>(id).get();
+     }
+   }
+
+   bool CScalar::has(const string& id)
+   {
+     if (CScalar::get(id,true)==nullptr) return false ;
+     else return true ;
+   }
+   
+   CField* CScalar::getFieldFromId(const string& id)
+   {
+     const regex r("::");
+     smatch m;
+     if (regex_search(id, m, r))
+     {
+        if (m.size()!=1) ERROR("CField* CScalar::getFieldFromId(const string& id)", <<" id = "<<id<< "  -> bad format id, separator :: append more than one time");
+        string fieldId=m.prefix() ;
+        if (fieldId.empty()) ERROR("CField* CScalar::getFieldFromId(const string& id)", <<" id = "<<id<< "  -> bad format id, field name is empty");
+        string suffix=m.suffix() ;
+        CField* field=CField::get(fieldId) ;
+        return field ;
+     }
+     else return nullptr;
+   }
 
   bool CScalar::IsWritten(const StdString & filename) const
@@ -210,4 +239,29 @@
   }
   CATCH_DUMP_ATTR
+
+  bool CScalar::activateFieldWorkflow(CGarbageCollector& gc)
+  TRY
+  {
+    if (!scalar_ref.isEmpty())
+    {
+      CField* field=getFieldFromId(scalar_ref) ;
+      if (field!=nullptr)
+      {
+        bool ret = field->buildWorkflowGraph(gc) ;
+        if (!ret) return false ; // cannot build workflow graph at this state
+      }
+      else 
+      {
+        CScalar* scalar = get(scalar_ref) ;
+        bool ret = scalar->activateFieldWorkflow(gc) ;
+        if (!ret) return false ; // cannot build workflow graph at this state
+        scalar_ref=scalar->getId() ; // replace domain_ref by solved reference
+      }
+    }
+    activateFieldWorkflow_done_=true ;
+    return true ;
+  }
+  CATCH_DUMP_ATTR
+
 
   /* obsolete, to remove after reimplementing coupling */
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp	(revision 2204)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/node/scalar.hpp	(revision 2206)
@@ -29,4 +29,5 @@
   class CScalarAttributes;
   class CScalar;
+  class CField;
   ///--------------------------------------------------------------
 
@@ -78,5 +79,7 @@
     public:
       static CScalar* createScalar();
-      static CScalar* get(const string& id) ; //<! return scalar pointer using id
+      static CScalar* get(const string& id, bool noError=false) ; //<! return scalar pointer using id
+      static bool     has(const string& id) ; //<! return domain pointer using id
+      static CField*  getFieldFromId(const string& id) ;
 
     public:
@@ -118,4 +121,8 @@
       private:
         bool solveInheritanceTransformation_done_= false ;
+      public:
+        bool activateFieldWorkflow(CGarbageCollector& gc) ;
+      private:
+        bool activateFieldWorkflow_done_=false ;
       private:
         CGenericAlgorithmTransformation* transformationAlgorithm_ = nullptr ;
