Index: /XIOS/dev/XIOS_DEV_CMIP6/src/config/field_attribute.conf
===================================================================
--- /XIOS/dev/XIOS_DEV_CMIP6/src/config/field_attribute.conf	(revision 1523)
+++ /XIOS/dev/XIOS_DEV_CMIP6/src/config/field_attribute.conf	(revision 1524)
@@ -20,7 +20,7 @@
 DECLARE_ATTRIBUTE(bool,      check_if_active)
 
-DECLARE_ATTRIBUTE(StdString, domain_ref)
-DECLARE_ATTRIBUTE(StdString, axis_ref)
-DECLARE_ATTRIBUTE(StdString, scalar_ref)
+DECLARE_ATTRIBUTE(StdString, domain_ref, false)
+DECLARE_ATTRIBUTE(StdString, axis_ref, false)
+DECLARE_ATTRIBUTE(StdString, scalar_ref, false)
 DECLARE_ATTRIBUTE(StdString, grid_ref)
 DECLARE_ATTRIBUTE(StdString, field_ref)
Index: /XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp
===================================================================
--- /XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp	(revision 1523)
+++ /XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp	(revision 1524)
@@ -1315,4 +1315,9 @@
         std::vector<CScalar*> vecScalar;
         std::vector<int> axisDomainOrderTmp;
+
+        std::vector<CDomain*> vecDomRef;
+        std::vector<CAxis*> vecAxisRef;
+        std::vector<CScalar*> vecScalarRef;
+
         
         if (!domain_ref.isEmpty())
@@ -1322,9 +1327,10 @@
           {
             vecDom.push_back(CDomain::get(domain_ref));
+            vecDomRef.push_back(CDomain::createDomain());
+            vecDomRef.back()->domain_ref=domain_ref;
             axisDomainOrderTmp.push_back(2);
           }
-          else
-            ERROR("CField::solveGridReference(void)",
-                  << "Invalid reference to domain '" << domain_ref.getValue() << "'.");
+          else  ERROR("CField::solveGridReference(void)",
+                      << "Invalid reference to domain '" << domain_ref.getValue() << "'.");
         }
 
@@ -1334,9 +1340,10 @@
           {
             vecAxis.push_back(CAxis::get(axis_ref));
+            vecAxisRef.push_back(CAxis::createAxis());
+            vecAxisRef.back()->axis_ref=axis_ref;
             axisDomainOrderTmp.push_back(1);
           }
-          else
-            ERROR("CField::solveGridReference(void)",
-                  << "Invalid reference to axis '" << axis_ref.getValue() << "'.");
+          else  ERROR("CField::solveGridReference(void)",
+                      << "Invalid reference to axis '" << axis_ref.getValue() << "'.");
         }
 
@@ -1346,9 +1353,10 @@
           {
             vecScalar.push_back(CScalar::get(scalar_ref));
+            vecScalarRef.push_back(CScalar::createScalar());
+            vecScalarRef.back()->scalar_ref=scalar_ref;
             axisDomainOrderTmp.push_back(0);
           }
-          else
-            ERROR("CField::solveGridReference(void)",
-                  << "Invalid reference to scalar '" << scalar_ref.getValue() << "'.");
+          else ERROR("CField::solveGridReference(void)",
+                     << "Invalid reference to scalar '" << scalar_ref.getValue() << "'.");
         }
         
@@ -1361,16 +1369,12 @@
         // Warning: the gridId shouldn't be set as the grid_ref since it could be inherited
         StdString gridId = CGrid::generateId(vecDom, vecAxis, vecScalar,axisDomainOrder);
-        if (CGrid::has(gridId))
-          this->grid = CGrid::get(gridId);
-        else
-          this->grid = CGrid::createGrid(gridId, vecDom, vecAxis, vecScalar,axisDomainOrder);
+        if (CGrid::has(gridId)) this->grid = CGrid::get(gridId);
+        else  this->grid = CGrid::createGrid(gridId, vecDomRef, vecAxisRef, vecScalarRef,axisDomainOrder);
       }
       else
       {
-        if (CGrid::has(grid_ref))
-          this->grid = CGrid::get(grid_ref);
-        else
-          ERROR("CField::solveGridReference(void)",
-                << "Invalid reference to grid '" << grid_ref.getValue() << "'.");
+        if (CGrid::has(grid_ref)) this->grid = CGrid::get(grid_ref);
+        else  ERROR("CField::solveGridReference(void)",
+                     << "Invalid reference to grid '" << grid_ref.getValue() << "'.");
       }
    }
@@ -1617,4 +1621,21 @@
    }
 
+
+   /*!
+    * Send all Attributes to server. This method is overloaded, since only grid_ref attribute
+    * must be sent to server and not domain_ref/axis_ref/scalar_ref. 
+    */
+    
+   void CField::sendAllAttributesToServer(CContextClient* client)
+   {
+     if (grid_ref.isEmpty())
+     {
+       grid_ref=grid->getId() ;
+       SuperClass::sendAllAttributesToServer(client) ;
+       grid_ref.reset();
+     }
+     else SuperClass::sendAllAttributesToServer(client) ;
+   }
+    
    void CField::sendAddVariable(const string& id, CContextClient* client)
    {
Index: /XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp
===================================================================
--- /XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp	(revision 1523)
+++ /XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp	(revision 1524)
@@ -161,4 +161,5 @@
         template <int N> void setData(const CArray<double, N>& _data);
         static bool dispatchEvent(CEventServer& event);
+        void sendAllAttributesToServer(CContextClient* client) ; 
         void sendUpdateData(const CArray<double,1>& data);
         void sendUpdateData(const CArray<double,1>& data, CContextClient* client);
