Index: /XIOS/dev/dev_olga/extern/remap/src/elt.hpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/elt.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/elt.hpp	(revision 1158)
@@ -105,4 +105,17 @@
 	}
 
+  void insert_vertex(int i, const Coord& v)
+  {
+    for(int j=n; j > i ; j--)
+    {
+      vertex[j]=vertex[j-1] ;
+      edge[j]=edge[j-1] ;
+      d[j]=d[j-1] ;
+      neighbour[j]=neighbour[j-1] ;
+    }
+    vertex[i+1]=v ;
+    n++ ;
+  }
+  
 	int neighbour[NMAX];
 	double d[NMAX]; /**< distance of centre of small circle to origin, zero if great circle */
Index: /XIOS/dev/dev_olga/extern/remap/src/intersect.cpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/intersect.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/intersect.cpp	(revision 1158)
@@ -37,4 +37,153 @@
 }
 
+/** New methods to find an insert a neighbour in a cell of the source mesh.
+ *  return true/false if cell b is a neighbour of a. if "insert" is true, then b will be inserted as a neighbour
+ * in cell a . This is needed for 2 order interpolation that need neighboround for gradient computing.
+ * A cell is a neighbour if :
+ *  - it shares 2 countiguous vertex (ie an edge) with a
+ *  - A vertex of b is located on one of an edge of a.
+ **/
+bool insertNeighbour( Elt& a, const Elt& b, bool insert )
+{
+  // for now suppose pole -> Oz
+  Coord pole(0,0,1) ;
+  Coord O, Oa1, Oa2,Ob1,Ob2,V1,V2 ;
+  double da,db,alpha,alpha1,alpha2,delta ;
+  
+    
+  for (int i = 0; i < a.n; i++)
+  {
+    for (int j = 0; j < b.n; j++)
+    {
+// share a full edge ? be carefull at the orientation
+      assert(squaredist(a.vertex[ i       ], b.vertex[ j       ]) > 1e-10*1e-10 ||
+             squaredist(a.vertex[(i+1)%a.n], b.vertex[(j+1)%b.n]) > 1e-10*1e-10);
+      if (   squaredist(a.vertex[ i       ], b.vertex[ j           ]) < 1e-10*1e-10 &&
+             squaredist(a.vertex[(i+1)%a.n], b.vertex[(j+b.n-1)%b.n]) < 1e-10*1e-10)
+      {
+        if (insert) a.neighbour[i] = b.id.ind ;
+        return true;
+      }
+      
+
+// 1 or 2 vertices of b is located on an edge of a
+       da=a.d[i] ;
+       if (scalarprod(a.edge[i], pole) < 0) da=-da ;
+       db=b.d[(j+b.n-1)%b.n] ;
+       if (scalarprod(b.edge[(j+b.n-1)%b.n], pole) < 0) db=-db ;
+      
+      if ( fabs(da-db)<1e-10 ) 
+      {
+        O=pole*da ;
+        Oa1=a.vertex[i]-O ;
+        Oa2=a.vertex[(i+1)%a.n]-O ; 
+        Ob1=b.vertex[j]-O ;
+        Ob2=b.vertex[(j+b.n-1)%b.n]-O ;
+        V1=crossprod(Oa1,Oa2) ;
+        V2=crossprod(Ob1,Ob2) ;
+        if (norm(crossprod(V1,V2))/(norm(V1)*norm(V2)) < 1e-10)
+        {
+          alpha = vectAngle(Oa1,Oa2,V1) ;
+          alpha1= vectAngle(Oa1,Ob1,V1) ;
+          alpha2= vectAngle(Oa1,Ob2,V1) ;
+          delta= alpha2-alpha1 ;
+          if (delta >= M_PI) delta=2*M_PI-delta ;
+          else if (delta <= -M_PI) delta=2*M_PI+delta ;
+          
+          if (alpha >= 0)
+          {
+            if (alpha1 > 1e-10 && alpha1 < alpha-1e-10)
+            {
+              if (alpha2 > 1e-10 && alpha2 < alpha-1e-10)
+              {
+                assert(delta > 0) ;
+                if (insert)
+                {
+                // insert both
+                  a.insert_vertex(i,b.vertex[(j+b.n-1)%b.n]);
+                  a.insert_vertex(i,b.vertex[j]);
+                  a.neighbour[i+1] = b.id.ind ;
+                }
+                return true ;
+              }
+              else
+              {
+                assert( delta > 0 ) ;
+                if (insert)
+                {
+                //insert alpha1
+                  a.insert_vertex(i,b.vertex[j]);
+                  a.neighbour[i+1] = b.id.ind ;
+                }
+                return true ;
+              }
+            }
+            else if (alpha2 > 1e-10 && alpha2 < alpha-1e-10)
+            {
+              assert( delta > 0 ) ;
+              if (insert)
+              {
+              // insert alpha2
+                a.insert_vertex(i,b.vertex[(j+b.n-1)%b.n]);
+                a.neighbour[i] = b.id.ind ;
+              }
+              return true ;
+            }
+            else
+            {
+              // nothing to do
+            } 
+
+          }
+          else  // alpha < 0
+          {
+            if (alpha1 < -1e-10 && alpha1 > alpha+1e-10)
+            {
+              if (alpha2 < -1e-10 && alpha2 > alpha+1e-10)
+              {
+                assert(delta < 0) ;
+                if (insert)
+                {
+                // insert both
+                  a.insert_vertex(i,b.vertex[(j+b.n-1)%b.n]);
+                  a.insert_vertex(i,b.vertex[j]);
+                  a.neighbour[i+1] = b.id.ind ;
+                }
+                return true ;
+              }
+              else
+              {
+                assert(delta < 0) ;
+                if (insert)
+                {
+                //insert alpha1
+                  a.insert_vertex(i,b.vertex[j]);
+                  a.neighbour[i+1] = b.id.ind ;
+                }
+                return true ;
+              }
+            }
+            else if (alpha2 < -1e-10 && alpha2 > alpha+1e-10)
+            {
+              assert(delta < 0) ;
+              if (insert)
+              {
+              // insert alpha2
+                a.insert_vertex(i,b.vertex[(j+b.n-1)%b.n]);
+                a.neighbour[i] = b.id.ind ;
+              }
+              return true ;
+            }
+            else
+            {
+               // nothing to do
+            }
+          }
+        }
+      }
+    }
+  }
+  return false;
+}
 
 /**
@@ -44,14 +193,18 @@
 void set_neighbour(Elt& a, const Elt& b)
 {
-	if (b.id.ind == a.id.ind) return;
-	int idx = neighbour_idx(a, b);
-	if (idx != NOT_FOUND)
-		a.neighbour[idx] = b.id.ind;
+  if (b.id.ind == a.id.ind) return;
+/*
+  int idx = neighbour_idx(a, b);
+  if (idx != NOT_FOUND)
+  a.neighbour[idx] = b.id.ind;
+*/
+  insertNeighbour(a,b,true) ; 
 }
 
 /** return true if `a` and `b` share an edge */
-bool isNeighbour(const Elt& a, const Elt& b)
-{
-	return neighbour_idx(a, b) != NOT_FOUND;
+bool isNeighbour(Elt& a, const Elt& b)
+{
+	// return neighbour_idx(a, b) != NOT_FOUND;
+  return insertNeighbour(a,b,false) ;
 }
 
Index: /XIOS/dev/dev_olga/extern/remap/src/intersect.hpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/intersect.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/intersect.hpp	(revision 1158)
@@ -2,5 +2,5 @@
 
 void set_neighbour(Elt& elt, const Elt& elt2);
-bool isNeighbour(const Elt& elt, const Elt& elt2);
+bool isNeighbour(Elt& elt, const Elt& elt2);
 
 void intersect(Elt *a, Elt *b);
Index: /XIOS/dev/dev_olga/extern/remap/src/mapper.cpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/mapper.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/mapper.cpp	(revision 1158)
@@ -109,5 +109,5 @@
 }
 
-vector<double> Mapper::computeWeights(int interpOrder, bool renormalize)
+vector<double> Mapper::computeWeights(int interpOrder, bool renormalize, bool quantity)
 {
 	vector<double> timings;
@@ -152,5 +152,5 @@
 	if (mpiRank == 0 && verbose) cout << "Remapping..." << endl;
 	tic = cputime();
-	nWeights = remap(&targetElements[0], targetElements.size(), interpOrder, renormalize);
+	nWeights = remap(&targetElements[0], targetElements.size(), interpOrder, renormalize, quantity);
 	timings.push_back(cputime() - tic);
 
@@ -166,5 +166,5 @@
    @param order is the order of interpolaton (must be 1 or 2).
 */
-int Mapper::remap(Elt *elements, int nbElements, int order, bool renormalize)
+int Mapper::remap(Elt *elements, int nbElements, int order, bool renormalize, bool quantity)
 {
 	int mpiSize, mpiRank;
@@ -184,4 +184,5 @@
 	int **sendElement = new int*[mpiSize]; /* indices of elements required from other rank */
 	double **recvValue = new double*[mpiSize];
+	double **recvArea = new double*[mpiSize];
 	Coord **recvGrad = new Coord*[mpiSize];
 	GloId **recvNeighIds = new GloId*[mpiSize]; /* ids of the of the source neighbours which also contribute through gradient */
@@ -205,4 +206,5 @@
 			sendElement[rank] = new int[nbSendElement[rank]];
 			recvValue[rank]   = new double[nbSendElement[rank]];
+			recvArea[rank]    = new double[nbSendElement[rank]];
 			if (order == 2)
 			{
@@ -234,8 +236,9 @@
 	int **recvElement = new int*[mpiSize];
 	double **sendValue = new double*[mpiSize];
+	double **sendArea = new double*[mpiSize];
 	Coord **sendGrad = new Coord*[mpiSize];
 	GloId **sendNeighIds = new GloId*[mpiSize];
-	MPI_Request *sendRequest = new MPI_Request[3*mpiSize];
-	MPI_Request *recvRequest = new MPI_Request[3*mpiSize];
+	MPI_Request *sendRequest = new MPI_Request[4*mpiSize];
+	MPI_Request *recvRequest = new MPI_Request[4*mpiSize];
 	for (int rank = 0; rank < mpiSize; rank++)
 	{
@@ -250,4 +253,5 @@
 			recvElement[rank] = new int[nbRecvElement[rank]];
 			sendValue[rank]   = new double[nbRecvElement[rank]];
+			sendArea[rank]   = new double[nbRecvElement[rank]];
 			if (order == 2)
 			{
@@ -263,7 +267,8 @@
 		}
 	}
-	MPI_Status *status = new MPI_Status[3*mpiSize];
-	MPI_Waitall(nbRecvRequest, recvRequest, status);
+	MPI_Status *status = new MPI_Status[4*mpiSize];
+	
 	MPI_Waitall(nbSendRequest, sendRequest, status);
+        MPI_Waitall(nbRecvRequest, recvRequest, status);
 
 	/* for all indices that have been received from requesting ranks: pack values and gradients, then send */
@@ -278,4 +283,5 @@
 			{
 				sendValue[rank][j] = sstree.localElements[recvElement[rank][j]].val;
+				sendArea[rank][j] = sstree.localElements[recvElement[rank][j]].area;
 				if (order == 2)
 				{
@@ -297,4 +303,6 @@
 			MPI_Issend(sendValue[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]);
 			nbSendRequest++;
+			MPI_Issend(sendArea[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]);
+			nbSendRequest++;
 			if (order == 2)
 			{
@@ -317,4 +325,6 @@
 			MPI_Irecv(recvValue[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]);
 			nbRecvRequest++;
+			MPI_Irecv(recvArea[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]);
+			nbRecvRequest++;
 			if (order == 2)
 			{
@@ -334,6 +344,8 @@
 		}
 	}
+        
+        MPI_Waitall(nbSendRequest, sendRequest, status);
 	MPI_Waitall(nbRecvRequest, recvRequest, status);
-	MPI_Waitall(nbSendRequest, sendRequest, status);
+	
 
 	/* now that all values and gradients are available use them to computed interpolated values on target
@@ -357,10 +369,12 @@
 			int rank = (*it)->id.rank;
 			double fk = recvValue[rank][n1];
+			double srcArea = recvArea[rank][n1];
 			double w = (*it)->area;
+      if (quantity) w/=srcArea ;
 
 			/* first order: src value times weight (weight = supermesh area), later divide by target area */
 			int kk = (order == 2) ? n1 * (NMAX + 1) : n1;
 			GloId neighID = recvNeighIds[rank][kk];
-			wgt_map[neighID] += (*it)->area;
+			wgt_map[neighID] += w;
 
 			if (order == 2)
@@ -383,5 +397,6 @@
     for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++)
 		{
-			this->remapMatrix[i] = (it->second / e.area) / renorm;
+      if (quantity)  this->remapMatrix[i] = (it->second ) / renorm;
+			else this->remapMatrix[i] = (it->second / e.area) / renorm;
 			this->srcAddress[i] = it->first.ind;
 			this->srcRank[i] = it->first.rank;
@@ -400,4 +415,5 @@
 			delete[] sendElement[rank];
 			delete[] recvValue[rank];
+			delete[] recvArea[rank];
 			if (order == 2)
 			{
@@ -410,4 +426,5 @@
 			delete[] recvElement[rank];
 			delete[] sendValue[rank];
+			delete[] sendArea[rank];
 			if (order == 2)
 				delete[] sendGrad[rank];
Index: /XIOS/dev/dev_olga/extern/remap/src/mapper.hpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/mapper.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/mapper.hpp	(revision 1158)
@@ -34,5 +34,5 @@
        /** @param trgElts are the elements of the unstructured target grid
            Returns the timings for substeps: */
-       vector<double> computeWeights(int interpOrder, bool renormalize=false);
+       vector<double> computeWeights(int interpOrder, bool renormalize=false, bool quantity=false);
        int getNbWeights(void) { return nWeights ; }
 /*
@@ -51,5 +51,5 @@
 private:
        /** @return number of weights (local to cpu) */
-       int remap(Elt* elements, int nbElements, int order, bool renormalize=false);
+       int remap(Elt* elements, int nbElements, int order, bool renormalize=false, bool quantity=false);
 
        void buildMeshTopology();
Index: /XIOS/dev/dev_olga/extern/remap/src/tree.cpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/tree.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/tree.cpp	(revision 1158)
@@ -142,5 +142,6 @@
 	root->parent = 0;
 	root->leafCount = 0;
-	root->centre = ORIGIN;
+// initialize root node on the sphere
+  root->centre.x=1 ; root->centre.y=0 ; root->centre.z=0 ; 
 	root->radius = 0.;
 	root->reinserted = false;
Index: /XIOS/dev/dev_olga/extern/remap/src/triple.cpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/triple.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/triple.cpp	(revision 1158)
@@ -124,3 +124,17 @@
 }
 
+// return oriented vector angle in range [-pi..pi], pole must be orthogonal to a and b
+double vectAngle(const Coord &a, const Coord &b, const Coord &pole)
+{ 
+  double nab = 1./(norm(a)*norm(b)) ;
+  
+  Coord a_cross_b=crossprod(a, b)*nab ;
+  double sinVect ;
+  if (scalarprod(a_cross_b, pole) >= 0) sinVect=norm(a_cross_b) ;
+  else sinVect=-norm(a_cross_b) ;
+  double cosVect=scalarprod(a,b)*nab ;
+
+  return atan2(sinVect,cosVect) ;
 }
+
+}
Index: /XIOS/dev/dev_olga/extern/remap/src/triple.hpp
===================================================================
--- /XIOS/dev/dev_olga/extern/remap/src/triple.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/extern/remap/src/triple.hpp	(revision 1158)
@@ -121,4 +121,8 @@
 
 double angle(const Coord &a, const Coord &b, const Coord &pole);
+
+// return oriented vector angle in range [-pi..pi], pole must be orthogonal to a and b
+double vectAngle(const Coord &a, const Coord &b, const Coord &pole) ;
+
 void print_Coord(Coord &p);
 
Index: /XIOS/dev/dev_olga/src/array_new.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/array_new.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/array_new.hpp	(revision 1158)
@@ -302,4 +302,19 @@
       }
 
+      bool operator== (const CArray<T_numtype,N_rank>& array)
+      {
+        size_t nbThis = this->numElements();
+        size_t nbArr  = array.numElements();
+        if (nbThis != nbArr) return false;
+        typename Array<T_numtype,N_rank>::const_iterator itx=array.begin(), itxe=array.end(), ity=this->begin() ;
+        for(;itx!=itxe;++itx,++ity) if (*itx!=*ity) return false ;
+        return true;
+      }
+
+      bool operator== (const Array<T_numtype,N_rank>& array)
+      {
+        return ((*this) == (dynamic_cast<const CArray<T_numtype,N_rank>& >(array)));
+      }
+
       void resize(int extent)
       {
@@ -552,4 +567,79 @@
   };
 
+
+#define macro(NRANK)\
+\
+  template <>\
+  inline size_t CArray<StdString,NRANK>::size(void) const\
+  {\
+    size_t size=(1 + NRANK) * sizeof(int) ;\
+    Array<StdString,NRANK>::const_iterator it, itb=this->begin(), ite=this->end() ;\
+\
+    for(it=itb;it!=ite;++it)\
+    {\
+      size+= sizeof(size_t) ;\
+      size+= (*it).size();\
+    } \
+    return size ;\
+  }\
+\
+/* for array string this function is an evaluation of maximum size of the array, considering stringArrayLen is the maximum size of the strings*/ \
+  template <>\
+  inline size_t CArray<StdString,NRANK>::size(sizeType numElements)\
+  {\
+    return (NRANK + 1) * sizeof(int) + numElements * stringArrayLen;\
+  }\
+  \
+  template <>\
+  inline bool CArray<StdString,NRANK>::toBuffer(CBufferOut& buffer) const\
+  {\
+    bool ret;\
+    ret =  buffer.put(this->dimensions());\
+    ret &= buffer.put(this->shape().data(), this->dimensions());\
+\
+    Array<StdString,NRANK>::const_iterator it, itb=this->begin(), ite=this->end() ;\
+\
+    for(it=itb;it!=ite;++it)\
+    {\
+      ret &= buffer.put((*it).size()) ;\
+      ret &= buffer.put((*it).data(),(*it).size());\
+    } \
+    return ret;\
+  }\
+\
+  template <>\
+  inline bool CArray<StdString,NRANK>::fromBuffer(CBufferIn& buffer)\
+  {\
+     bool ret;\
+     int numDim;\
+     TinyVector<int,NRANK> vect;\
+     size_t ne;\
+\
+     ret =  buffer.get(numDim);\
+     ret &= buffer.get(vect.data(), NRANK);\
+     this->resize(vect);\
+\
+     Array<StdString,NRANK>::iterator it, itb=this->begin(), ite=this->end() ;\
+     for(it=itb;it!=ite;++it)\
+     {\
+       ret &= buffer.get(ne) ;\
+       char* str = new char[ne] ;\
+       ret &= buffer.get(str, ne);\
+       *it = string(str,ne) ;\
+       delete [] str ;\
+     }\
+     initialized = true;\
+     return ret;\
+  }
+macro(1)
+macro(2)
+macro(3)
+macro(4)
+macro(5)
+macro(6)
+macro(7)
+
+#undef macro
+
   template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray<T_numtype,N_rank>& array)
   {
Index: /XIOS/dev/dev_olga/src/attribute.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute.cpp	(revision 1158)
@@ -6,15 +6,13 @@
 namespace xios
 {
+
+      const StdString CAttribute::resetInheritanceStr("_reset_") ;
+
       /// ////////////////////// DÃ©finitions ////////////////////// ///
       CAttribute::CAttribute(const StdString & id)
-         : CObject(id), CBaseType()
+         : CObject(id), CBaseType(), _canInherite(true)
 //         , value()
       { /* Ne rien faire de plus */ }
 /*
-      CAttribute::CAttribute(const CAttribute & attribut)
-         : CObject(attribut.getId()),CBaseType()
-      { 
- //        this->value = attribut.getAnyValue(); 
-      }
 */      
       CAttribute::~CAttribute(void)
@@ -22,28 +20,5 @@
       
       ///--------------------------------------------------------------
-/*
-      const boost::any & CAttribute::getAnyValue(void) const
-      { 
-         return (this->value); 
-      }
 
-
-      void CAttribute::setAnyValue(const boost::any & value)
-      { 
-         this->value = value; 
-      }
-      
-      void CAttribute::clear(void)
-      {
-         this->value = boost::any(); 
-      }
-
-      //---------------------------------------------------------------
-
-      bool CAttribute::isEmpty(void) const
-      { 
-         return (this->value.empty()); 
-      }
-*/
       const StdString & CAttribute::getName(void) const
       { 
@@ -79,5 +54,4 @@
       ///--------------------------------------------------------------
 
-
       CMessage& operator<<(CMessage& msg,CAttribute& type)
       {
Index: /XIOS/dev/dev_olga/src/attribute.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute.hpp	(revision 1158)
@@ -16,4 +16,9 @@
 {
       /// ////////////////////// DÃ©clarations ////////////////////// ///
+   /*!
+   \class CAttribute
+      The fundamental class which describes the attributes of other different class in XIOS.
+      This class only plays a role of interface, its class child will have specific implelemtation corresponding to type of attribute
+   */
       class CAttribute : public CObject, public virtual CBaseType
       {
@@ -24,21 +29,8 @@
             /// Constructeurs ///
             explicit CAttribute(const StdString & id);
-//            CAttribute(const CAttribute & attribut);
-//            CAttribute(const CAttribute * const attribut); // Not implemented.
 
             /// Accesseurs ///
             const StdString & getName(void) const;
-//            const boost::any & getAnyValue(void) const;
-//            template <typename T> inline T getValue(void) const;
-//            template <typename T> inline T* getRef(void);
 
-//            /// Mutateurs ///
-//            template <typename T> inline void setValue(const T & value);
-//            void setAnyValue(const boost::any & value);
-//            void clear(void);
-
-            /// Test ///
-//            bool isEmpty(void) const;
-//            template <typename T> inline bool isType(void) const;
             virtual void set(const CAttribute& ) =0 ;
             virtual void reset(void ) =0 ;
@@ -49,7 +41,5 @@
             virtual StdString toString(void) const = 0;
             virtual void fromString(const StdString & str) = 0;
-
-//            virtual void toBinary  (StdOStream & os) const = 0;
-//            virtual void fromBinary(StdIStream & is) = 0;
+            virtual bool isEqual(const CAttribute& ) = 0;
 
             //! Returns true if and only if the attribute should be publicly exposed in the API
@@ -59,4 +49,7 @@
             virtual bool doSend() const { return true; }
 
+            /*
+              Groupd of functions to generate C and Fortran interface 
+            */
             virtual void generateCInterface(ostream& oss, const string& className) = 0 ;
             virtual void generateCInterfaceIsDefined(ostream& oss, const string& className) ;
@@ -75,42 +68,12 @@
             virtual void setInheritedValue(const CAttribute& ) = 0 ;
             virtual bool hasInheritedValue(void) const = 0;
-            
-         protected :
 
-            /// Constructeurs ///
-//            CAttribute(void);  // Not implemented.
-
-            /// PropriÃ©tÃ© ///
-//            boost::any value;
+            bool canInherite(void) {return _canInherite ;}
+         protected : 
+            bool _canInherite ;
+            static const StdString resetInheritanceStr ; 
 
       }; // class CAttribute
 
-      /// ////////////////////// DÃ©finitions ////////////////////// ///
-/*
-      template <typename T>
-         T CAttribute::getValue(void) const
-      { 
-         return (boost::any_cast<T>(this->value)); 
-      }
-
-      template <typename T>
-         T* CAttribute::getRef(void)
-      { 
-         return (boost::any_cast<T>(&value)); 
-      }
-
-      template <typename T>
-         void CAttribute::setValue(const T & value)
-      { 
-         this->value = value; 
-      }
-
-      template<typename T>
-         bool CAttribute::isType(void) const
-      { 
-         return (this->value.type() == typeid(T)); 
-      }
-*/
- 
    CMessage& operator<<(CMessage& msg,CAttribute& type) ;
    CMessage& operator<<(CMessage& msg, const CAttribute&  type) ;
Index: /XIOS/dev/dev_olga/src/attribute_array.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_array.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_array.hpp	(revision 1158)
@@ -13,4 +13,8 @@
 {
       /// ////////////////////// DÃ©clarations ////////////////////// ///
+      /*!
+        \class CAttributeArray
+        This class implements the attribute representing array of value
+      */
       template <typename T_numtype, int N_rank>
          class CAttributeArray : public CAttribute, public CArray<T_numtype, N_rank>
@@ -19,5 +23,4 @@
 
            using CArray<T_numtype,N_rank>::operator = ;
-//           using Array<T_numtype,N_rank>::operator = ;
 
             /// Constructeurs ///
@@ -40,4 +43,7 @@
             CArray<T_numtype, N_rank> getInheritedValue(void) const ;
             bool hasInheritedValue(void) const;
+            
+            bool isEqual(const CAttributeArray& attr);
+            bool isEqual(const CAttribute& attr);
 
             /// Destructeur ///
@@ -47,5 +53,5 @@
             /// Autre ///
             virtual string toString(void) const { return _toString();}
-            virtual void fromString(const StdString & str) { _fromString(str);}
+            virtual void fromString(const StdString & str) { if (str==resetInheritanceStr) { reset(); _canInherite=false ;}  else _fromString(str);}
             virtual bool toBuffer  (CBufferOut& buffer) const { return _toBuffer(buffer);}
             virtual bool fromBuffer(CBufferIn& buffer) { return _fromBuffer(buffer); }
@@ -60,9 +66,4 @@
             virtual void generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) ;
 
-
-         protected :
-
-            /// Constructeurs ///
-
          private :
           CArray<T_numtype, N_rank> inheritedValue ;
Index: /XIOS/dev/dev_olga/src/attribute_array_decl.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_array_decl.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_array_decl.cpp	(revision 1158)
@@ -17,3 +17,5 @@
   template class CAttributeArray<bool,6> ;
   template class CAttributeArray<bool,7> ;
+  template class CAttributeArray<StdString,1> ;
+  template class CAttributeArray<StdString,2> ;
 }
Index: /XIOS/dev/dev_olga/src/attribute_array_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_array_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_array_impl.hpp	(revision 1158)
@@ -83,5 +83,5 @@
     void CAttributeArray<T_numtype,N_rank>::setInheritedValue(const CAttributeArray& attr)
     {
-      if (this->isEmpty() && attr.hasInheritedValue())
+      if (this->isEmpty() && _canInherite && attr.hasInheritedValue())
       {
         inheritedValue.resize(attr.shape()) ;
@@ -103,4 +103,15 @@
     }
 
+    template <typename T_numtype, int N_rank>
+    bool CAttributeArray<T_numtype,N_rank>::isEqual(const CAttributeArray& attr)
+    {
+      return ((dynamic_cast<CArray<T_numtype,N_rank>& >(*this)) == (dynamic_cast<const CArray<T_numtype,N_rank>& >(attr)));      
+    }
+
+    template <typename T_numtype, int N_rank>
+    bool CAttributeArray<T_numtype,N_rank>::isEqual(const CAttribute& attr)
+    {
+      return ((*this) == (dynamic_cast<const CAttributeArray<T_numtype,N_rank>& >(attr)));      
+    }
 
     template <typename T_numtype, int N_rank>
Index: /XIOS/dev/dev_olga/src/attribute_enum.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_enum.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_enum.hpp	(revision 1158)
@@ -15,4 +15,8 @@
 {
       /// ////////////////////// Déclarations ////////////////////// ///
+        /*!
+        \class CAttributeEnum
+        This class implements the attribute representing enumeration
+      */
       template <class T>
          class CAttributeEnum : public CAttribute, public CEnum<T>
@@ -47,4 +51,7 @@
             bool hasInheritedValue(void) const;          
           
+            bool isEqual(const CAttributeEnum& attr );
+            bool isEqual(const CAttribute& attr );
+
             /// Destructeur ///
             virtual ~CAttributeEnum(void) { }
@@ -55,5 +62,5 @@
             /// Autre ///
             virtual StdString toString(void) const { return _toString();}
-            virtual void fromString(const StdString & str) { _fromString(str);}
+            virtual void fromString(const StdString & str) { if (str==resetInheritanceStr) { reset(); _canInherite=false ;}  else _fromString(str);}
 
             virtual bool toBuffer  (CBufferOut& buffer) const { return _toBuffer(buffer);} 
@@ -69,9 +76,4 @@
             virtual void generateFortranInterfaceGetDeclaration(ostream& oss,const string& className) ;
 
-      
-         protected :
-
-            /// Constructeurs ///
-//            CAttributeTemplate(void); // Not implemented.
          private :
           StdString _toString(void) const;
Index: /XIOS/dev/dev_olga/src/attribute_enum_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_enum_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_enum_impl.hpp	(revision 1158)
@@ -88,5 +88,5 @@
   void CAttributeEnum<T>::setInheritedValue(const CAttributeEnum& attr)
   {
-    if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue());
+    if (this->isEmpty() && _canInherite && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue());
   }
 
@@ -109,4 +109,16 @@
   {
     return !this->isEmpty() || !inheritedValue.isEmpty();
+  }
+
+  template <class T>
+  bool CAttributeEnum<T>::isEqual(const CAttribute& attr)
+  {
+    return (this->isEqual(dynamic_cast<const CAttributeEnum<T>& >(attr)));
+  }
+
+  template <class T>
+  bool CAttributeEnum<T>::isEqual(const CAttributeEnum& attr)
+  {
+    return ((dynamic_cast<const CEnum<T>& >(*this)) == (dynamic_cast<const CEnum<T>& >(attr)));
   }
 
Index: /XIOS/dev/dev_olga/src/attribute_map.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_map.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_map.cpp	(revision 1158)
@@ -16,4 +16,7 @@
       ///--------------------------------------------------------------
 
+      /*!
+         Clear all attributes of an object and reset them to empty state
+      */
       void CAttributeMap::clearAllAttributes(void)
       {
@@ -29,4 +32,8 @@
       //---------------------------------------------------------------
 
+      /*
+        Clear an attribute and reset its value
+        \param[in] key id of attribute
+      */
       void CAttributeMap::clearAttribute(const StdString& key)
       {
@@ -36,4 +43,9 @@
       //---------------------------------------------------------------
 
+      /*!
+        Set an attribute of certain id with a value
+        \param[in] key id of the attribute
+        \param[in] attr value of attribute
+      */
       void CAttributeMap::setAttribute(const StdString& key, CAttribute* const attr)
       {
@@ -50,4 +62,7 @@
       //---------------------------------------------------------------
 
+      /*!
+        Subscript operator. Return attribute with a specific id
+      */
       CAttribute* CAttributeMap::operator[](const StdString& key)
       {
@@ -103,4 +118,46 @@
          }
       }
+
+      /*!
+         Compare two attribute maps
+         \param [in] another attribute map to compare
+         \param [in] excludedAttrs attribute to be excluded from comparasion
+         \return true if these two maps have same attributes whose value are identical
+      */
+      bool CAttributeMap::isEqual(const CAttributeMap& another, const vector<StdString>& excludedAttrs)
+      {
+         SuperClassMap::const_iterator itb = another.begin(), ite = another.end(), it;
+         for (it = itb; it !=ite; ++it)
+         {
+            bool excluded = false;
+            for (int idx = 0; idx < excludedAttrs.size(); ++idx)
+            {
+               if (0 == (*it).first.compare(excludedAttrs[idx]))
+               {
+                 excluded = true;
+                 break;
+               } 
+            }
+
+            if (!excluded)
+            {
+              if ((*it).first.compare(StdString("id")) != 0 && (*it).first.compare(StdString("src")) != 0)
+              {
+                if (this->hasAttribute(it->first))
+                { 
+                  if (!((*it).second->isEqual(*(*this)[it->first])))
+                  {
+                    return false;
+                  }
+                }
+                else
+                  return false;
+              }
+            }
+         }
+
+         return true;
+      }
+
 
       //---------------------------------------------------------------
@@ -129,5 +186,5 @@
                if (apply)
                {
-                 if (currentAtt->isEmpty() && !el.second->isEmpty())
+                 if (currentAtt->isEmpty() && currentAtt->canInherite() && !el.second->isEmpty())
                  {
                     this->setAttribute(el.first, el.second);
@@ -139,4 +196,9 @@
       }
 
+      /*!
+        Duplicate attribute map with a specific attribute map.
+        Copy all non-empty attribute of the current attribute map
+        \param [in] srcAttr attribute map which is copied from.
+      */
       void CAttributeMap::duplicateAttributes(const CAttributeMap* const srcAttr)
       {
@@ -216,4 +278,5 @@
       }
  */
+      
       void CAttributeMap::generateCInterface(ostream& oss, const string& className)
       {
Index: /XIOS/dev/dev_olga/src/attribute_map.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_map.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_map.hpp	(revision 1158)
@@ -12,4 +12,10 @@
 {
       /// ////////////////////// DÃ©clarations ////////////////////// ///
+      /*!
+        \class CAttributeMap
+        This class represents the set of attributes which an object can have.
+        Each attribute in the set is represented by an unique id.
+      */
+
       class CAttributeMap
          : public xios_map<StdString, CAttribute*>
@@ -34,4 +40,5 @@
 
             void clearAttribute(const StdString& key);
+            bool isEqual(const CAttributeMap& another, const vector<StdString>& excludedAttrs);
 
             /// Destructeur ///
@@ -74,5 +81,5 @@
       inline bool CAttributeMap::hasAttribute(const StdString& key) const
       {
-        return (this->find(key) != this->end());
+         return (this->find(key) != this->end());
       }
 
Index: /XIOS/dev/dev_olga/src/attribute_template.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_template.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_template.hpp	(revision 1158)
@@ -16,4 +16,8 @@
 {
       /// ////////////////////// DÃ©clarations ////////////////////// ///
+  /*!
+    \class CAttributeTemplate
+    The class implements attribute of some basic types
+  */
       template <class T>
          class CAttributeTemplate : public CAttribute, public CType<T>
@@ -54,4 +58,7 @@
             bool hasInheritedValue(void) const;
 
+            bool isEqual_(const CAttributeTemplate& attr );
+            bool isEqual(const CAttribute& attr );
+
             /// Destructeur ///
             virtual ~CAttributeTemplate(void) { }
@@ -62,5 +69,5 @@
             /// Autre ///
             virtual StdString toString(void) const { return _toString();}
-            virtual void fromString(const StdString & str) { _fromString(str);}
+            virtual void fromString(const StdString & str) { if (str==resetInheritanceStr) { reset(); _canInherite=false ;}  else _fromString(str);}
 //            virtual CAttributeTemplate* clone() const {}
 //            virtual void toBinary  (StdOStream & os) const;
Index: /XIOS/dev/dev_olga/src/attribute_template_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/attribute_template_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/attribute_template_impl.hpp	(revision 1158)
@@ -71,13 +71,13 @@
          T CAttributeTemplate<T>::getValue(void) const
       {
-         return CType<T>::get() ;
-/*
-         if (SuperClass::isEmpty())
-         {
-            ERROR("T CAttributeTemplate<T>::getValue(void) const",
-                  << "[ id = " << this->getId() << "]"
-                  << " L'attribut est requis mais n'est pas dÃ©fini !");
-          }
-         return (SuperClass::getValue<T>());
+        return CType<T>::get() ;
+/*
+        if (SuperClass::isEmpty())
+        {
+           ERROR("T CAttributeTemplate<T>::getValue(void) const",
+                 << "[ id = " << this->getId() << "]"
+                 << " L'attribut est requis mais n'est pas dÃ©fini !");
+         }
+        return (SuperClass::getValue<T>());
 */
       }
@@ -125,5 +125,5 @@
     void CAttributeTemplate<T>::setInheritedValue(const CAttributeTemplate& attr)
     {
-      if (this->isEmpty() && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()) ;
+      if (this->isEmpty() && _canInherite && attr.hasInheritedValue()) inheritedValue.set(attr.getInheritedValue()) ;
     }
 
@@ -139,4 +139,22 @@
     {
       return !this->isEmpty() || !inheritedValue.isEmpty() ;
+    }
+
+    template <class T>
+    bool CAttributeTemplate<T>::isEqual(const CAttribute& attr)
+    {
+      const CAttributeTemplate<T>& tmp = dynamic_cast<const CAttributeTemplate<T>& >(attr);
+      return this->isEqual_(tmp);
+    }
+
+    template <class T>
+    bool CAttributeTemplate<T>::isEqual_(const CAttributeTemplate& attr)
+    {
+      if ((!this->hasInheritedValue() && !attr.hasInheritedValue()))
+          return true;
+      if (this->hasInheritedValue() && attr.hasInheritedValue())
+          return (this->getInheritedValue() == attr.getInheritedValue());
+      else 
+        return false;
     }
 
Index: /XIOS/dev/dev_olga/src/client.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/client.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/client.cpp	(revision 1158)
@@ -18,5 +18,5 @@
     MPI_Comm CClient::interComm ;
     std::list<MPI_Comm> CClient::contextInterComms;
-    int CClient::serverLeader;
+    int CClient::serverLeader ;
     bool CClient::is_MPI_Initialized ;
     int CClient::rank_ = INVALID_RANK;
@@ -54,10 +54,9 @@
           }
           CTimer::get("XIOS").resume() ;
-          CTimer::get("XIOS init").resume() ;
+          CTimer::get("XIOS init/finalize").resume() ;
           boost::hash<string> hashString ;
 
-          unsigned long hashClient = hashString(codeId) ;
-          unsigned long hashServer = hashString(CXios::xiosCodeId);
-//          unsigned long hashServer = hashString(CXios::xiosCodeIdPrm);
+          unsigned long hashClient=hashString(codeId) ;
+          unsigned long hashServer=hashString(CXios::xiosCodeId) ;
           unsigned long* hashAll ;
           int size ;
@@ -71,5 +70,5 @@
           hashAll=new unsigned long[size] ;
 
-          MPI_Allgather(&hashClient, 1, MPI_LONG, hashAll, 1, MPI_LONG, CXios::globalComm) ;
+          MPI_Allgather(&hashClient,1,MPI_LONG,hashAll,1,MPI_LONG,CXios::globalComm) ;
 
           map<unsigned long, int> colors ;
@@ -90,5 +89,5 @@
           for (i=0; i < size; ++i)
           {
-            if (hashAll[i] == hashString(CXios::xiosCodeId))
+            if (hashServer == hashAll[i])
             {
               CXios::setUsingServer();
@@ -148,5 +147,5 @@
 
         CTimer::get("XIOS").resume() ;
-        CTimer::get("XIOS init").resume() ;
+        CTimer::get("XIOS init/finalize").resume() ;
 
         if (CXios::usingServer)
@@ -216,10 +215,11 @@
 
         int messageSize=msg.size() ;
-        void * buff = new char[messageSize] ;
-        CBufferOut buffer(buff,messageSize) ;
+        char * buff = new char[messageSize] ;
+        CBufferOut buffer((void*)buff,messageSize) ;
         buffer<<msg ;
 
-        MPI_Send(buff, buffer.count(), MPI_CHAR, serverLeader, 1, CXios::globalComm) ;
-        MPI_Intercomm_create(contextComm, 0, CXios::globalComm, serverLeader, 10+globalRank, &contextInterComm) ;
+        MPI_Send((void*)buff,buffer.count(),MPI_CHAR,serverLeader,1,CXios::globalComm) ;
+
+        MPI_Intercomm_create(contextComm,0,CXios::globalComm,serverLeader,10+globalRank,&contextInterComm) ;
         info(10)<<"Register new Context : "<<id<<endl ;
         MPI_Comm inter ;
@@ -257,5 +257,5 @@
       MPI_Comm_free(&intraComm);
 
-      CTimer::get("XIOS finalize").suspend() ;
+      CTimer::get("XIOS init/finalize").suspend() ;
       CTimer::get("XIOS").suspend() ;
 
@@ -267,12 +267,13 @@
       
       info(20) << "Client side context is finalized"<<endl ;
+      report(0) <<" Performance report : Whole time from XIOS init and finalize: "<< CTimer::get("XIOS init/finalize").getCumulatedTime()<<" s"<<endl ;
       report(0) <<" Performance report : total time spent for XIOS : "<< CTimer::get("XIOS").getCumulatedTime()<<" s"<<endl ;
       report(0)<< " Performance report : time spent for waiting free buffer : "<< CTimer::get("Blocking time").getCumulatedTime()<<" s"<<endl ;
-      report(0)<< " Performance report : Ratio : "<< CTimer::get("Blocking time").getCumulatedTime()/CTimer::get("XIOS").getCumulatedTime()*100.<<" %"<<endl ;
+      report(0)<< " Performance report : Ratio : "<< CTimer::get("Blocking time").getCumulatedTime()/CTimer::get("XIOS init/finalize").getCumulatedTime()*100.<<" %"<<endl ;
       report(0)<< " Performance report : This ratio must be close to zero. Otherwise it may be usefull to increase buffer size or numbers of server"<<endl ;
 //      report(0)<< " Memory report : Current buffer_size : "<<CXios::bufferSize<<endl ;
       report(0)<< " Memory report : Minimum buffer size required : " << CClientBuffer::maxRequestSize << " bytes" << endl ;
       report(0)<< " Memory report : increasing it by a factor will increase performance, depending of the volume of data wrote in file at each time step of the file"<<endl ;
-
+      report(100)<<CTimer::getAllCumulatedTime()<<endl ;
    }
 
Index: /XIOS/dev/dev_olga/src/client.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/client.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/client.hpp	(revision 1158)
@@ -11,5 +11,4 @@
       public:
         static void initialize(const string& codeId, MPI_Comm& localComm, MPI_Comm& returnComm);
-
         static void finalize(void);
         static void registerContext(const string& id, MPI_Comm contextComm);
Index: /XIOS/dev/dev_olga/src/client_client_dht_template_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/client_client_dht_template_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/client_client_dht_template_impl.hpp	(revision 1158)
@@ -307,5 +307,4 @@
 
   indexToInfoMappingLevel_.swap(indexToInfoMapping);
-
   if (0 != recvNbIndexCount) delete [] recvIndexBuff;
   for (boost::unordered_map<int,size_t*>::const_iterator it = client2ClientIndex.begin();
Index: /XIOS/dev/dev_olga/src/client_server_mapping.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/client_server_mapping.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/client_server_mapping.hpp	(revision 1158)
@@ -26,5 +26,4 @@
 public:
   typedef boost::unordered_map<int, std::vector<size_t> > GlobalIndexMap;
-//  typedef boost::map<int, std::vector<size_t> > GlobalIndexMap;
   public:
     /** Default constructor */
Index: /XIOS/dev/dev_olga/src/config/axis_attribute.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/axis_attribute.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/axis_attribute.conf	(revision 1158)
@@ -6,5 +6,5 @@
 
 DECLARE_ATTRIBUTE(int,       n_glo)
-DECLARE_ENUM2(positive, up, down)		
+DECLARE_ENUM2(positive, up, down)
 
 /* GLOBAL */
@@ -29,2 +29,4 @@
 DECLARE_ARRAY(bool, 1 , mask)
 DECLARE_ARRAY(double, 2 , bounds)
+DECLARE_ATTRIBUTE(int,       prec)
+DECLARE_ARRAY(StdString    ,1    , label)
Index: /XIOS/dev/dev_olga/src/config/domain_attribute.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/domain_attribute.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/domain_attribute.conf	(revision 1158)
@@ -53,2 +53,3 @@
 DECLARE_ENUM4(type,rectilinear,curvilinear,unstructured, gaussian)
 DECLARE_ATTRIBUTE(StdString, domain_ref)
+DECLARE_ATTRIBUTE(int,       prec)
Index: /XIOS/dev/dev_olga/src/config/domain_attribute_private.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/domain_attribute_private.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/domain_attribute_private.conf	(revision 1158)
@@ -14,4 +14,16 @@
 DECLARE_ARRAY_PRIVATE(double, 1, latvalue_rectilinear_read_from_file)
 
+// Array contain whole value (non distributed) of longitude and latitude of curvilinear read from a file
+DECLARE_ARRAY_PRIVATE(double, 2, lonvalue_curvilinear_read_from_file)
+DECLARE_ARRAY_PRIVATE(double, 2, latvalue_curvilinear_read_from_file)
+DECLARE_ARRAY_PRIVATE(double, 3, bounds_lonvalue_curvilinear_read_from_file)
+DECLARE_ARRAY_PRIVATE(double, 3, bounds_latvalue_curvilinear_read_from_file)
+
+// Array contain whole value (non distributed) of longitude and latitude of unstructured read from a file
+DECLARE_ARRAY_PRIVATE(double, 1, lonvalue_unstructured_read_from_file)
+DECLARE_ARRAY_PRIVATE(double, 1, latvalue_unstructured_read_from_file)
+DECLARE_ARRAY_PRIVATE(double, 2, bounds_lonvalue_unstructured_read_from_file)
+DECLARE_ARRAY_PRIVATE(double, 2, bounds_latvalue_unstructured_read_from_file)
+
 DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ibegin)
 DECLARE_ATTRIBUTE_PRIVATE(int,  global_zoom_ni)
Index: /XIOS/dev/dev_olga/src/config/expand_domain_attribute.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/expand_domain_attribute.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/expand_domain_attribute.conf	(revision 1158)
@@ -2,2 +2,6 @@
 
 DECLARE_ENUM2(type,node,edge)
+
+// Flag to determine if domain expension should be periodic (and in which direction)
+DECLARE_ATTRIBUTE(bool,      i_periodic)
+DECLARE_ATTRIBUTE(bool,      j_periodic)
Index: /XIOS/dev/dev_olga/src/config/file_attribute.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/file_attribute.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/file_attribute.conf	(revision 1158)
@@ -14,16 +14,20 @@
 DECLARE_ENUM2(format,        netcdf4, netcdf4_classic)
 DECLARE_ENUM2(convention,    CF, UGRID)
+DECLARE_ATTRIBUTE(StdString, convention_str)
 DECLARE_ENUM2(par_access,    collective, independent)
 DECLARE_ATTRIBUTE(bool,      append)
 DECLARE_ENUM2(mode,          read, write)
-DECLARE_ENUM4(time_counter,  centered, instant, record, none)
+DECLARE_ENUM7(time_counter,  centered, instant, record, exclusive, centered_exclusive, instant_exclusive, none)
 DECLARE_ATTRIBUTE(StdString, time_counter_name)
+DECLARE_ENUM2(time_units, seconds, days)
 DECLARE_ATTRIBUTE(int,       record_offset)
 DECLARE_ATTRIBUTE(bool,      cyclic)
 
 DECLARE_ATTRIBUTE(int,       compression_level)
-DECLARE_ATTRIBUTE(bool,      coupler)
 
 DECLARE_ENUM4(timeseries,    none, only, both, exclusive)
 DECLARE_ATTRIBUTE(StdString, ts_prefix)
-
+DECLARE_ATTRIBUTE(StdString, time_stamp_name)
+DECLARE_ATTRIBUTE(StdString, time_stamp_format)
+DECLARE_ATTRIBUTE(StdString, uuid_name)
+DECLARE_ATTRIBUTE(StdString, uuid_format)
Index: /XIOS/dev/dev_olga/src/config/interpolate_domain_attribute.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/interpolate_domain_attribute.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/interpolate_domain_attribute.conf	(revision 1158)
@@ -1,6 +1,6 @@
 /* GLOBAL */
-DECLARE_ATTRIBUTE(StdString, file)
 DECLARE_ATTRIBUTE(int, order)
 DECLARE_ATTRIBUTE(bool, renormalize)
+DECLARE_ATTRIBUTE(bool, quantity)
 
 /* Write interpolation weights into file */
Index: /XIOS/dev/dev_olga/src/config/scalar_attribute.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/scalar_attribute.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/scalar_attribute.conf	(revision 1158)
@@ -9,2 +9,3 @@
 
 DECLARE_ATTRIBUTE(StdString, scalar_ref)
+DECLARE_ATTRIBUTE(int, prec)
Index: /XIOS/dev/dev_olga/src/config/var_attribute.conf
===================================================================
--- /XIOS/dev/dev_olga/src/config/var_attribute.conf	(revision 1157)
+++ /XIOS/dev/dev_olga/src/config/var_attribute.conf	(revision 1158)
@@ -1,2 +1,3 @@
 DECLARE_TYPE(type)
 DECLARE_ATTRIBUTE(StdString, name)
+DECLARE_ENUM4(ts_target, file, field, both, none)
Index: /XIOS/dev/dev_olga/src/context_client.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/context_client.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/context_client.cpp	(revision 1158)
@@ -52,5 +52,6 @@
           ranksServerLeader.push_back(rankStart + i);
 
-        ranksServerNotLeader.resize(0);      }
+        ranksServerNotLeader.resize(0);
+      }
       else
       {
@@ -125,5 +126,5 @@
      * Send the temporarily buffered event (if any).
      *
-     * \return true if a temporarily buffered event could be sent, false otherwise
+     * \return true if a temporarily buffered event could be sent, false otherwise 
      */
     bool CContextClient::sendTemporarilyBufferedEvent()
@@ -171,5 +172,4 @@
       }
     }
-
 
     /*!
@@ -323,21 +323,21 @@
    }
 
-   /*!
-    Get leading server in the group of connected server
-    \return ranks of leading servers
-    */
-    const std::list<int>& CContextClient::getRanksServerNotLeader(void) const
-    {
-      return ranksServerNotLeader;
-    }
-
-    /*!
-    Check if client connects to leading server
-    \return connected(true), not connected (false)
-    */
-    bool CContextClient::isServerNotLeader(void) const
-    {
-      return !ranksServerNotLeader.empty();
-    }
+  /*!
+  Get leading server in the group of connected server
+  \return ranks of leading servers
+  */
+  const std::list<int>& CContextClient::getRanksServerNotLeader(void) const
+  {
+    return ranksServerNotLeader;
+  }
+
+  /*!
+  Check if client connects to leading server
+  \return connected(true), not connected (false)
+  */
+  bool CContextClient::isServerNotLeader(void) const
+  {
+    return !ranksServerNotLeader.empty();
+  }
 
   /*!
Index: /XIOS/dev/dev_olga/src/context_client.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/context_client.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/context_client.hpp	(revision 1158)
@@ -72,5 +72,5 @@
       MPI_Comm intraComm; //!< Communicator of client group
 
-      map<int,CClientBuffer*> buffers;         //!< Buffers for connection to servers
+      map<int,CClientBuffer*> buffers; //!< Buffers for connection to servers
 
     private:
Index: /XIOS/dev/dev_olga/src/context_server.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/context_server.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/context_server.cpp	(revision 1158)
@@ -23,5 +23,5 @@
 {
 
-  CContextServer::CContextServer(CContext* parent, MPI_Comm intraComm_,MPI_Comm interComm_)
+  CContextServer::CContextServer(CContext* parent,MPI_Comm intraComm_,MPI_Comm interComm_)
   {
     context=parent;
@@ -50,5 +50,4 @@
     pendingEvent=true;
   }
-
 
   bool CContextServer::hasPendingEvent(void)
@@ -207,6 +206,5 @@
   {
     map<int,CServerBuffer*>::iterator it;
-    for(it=buffers.begin();it!=buffers.end();++it)
-      delete it->second;
+    for(it=buffers.begin();it!=buffers.end();++it) delete it->second;
   }
 
@@ -263,4 +261,3 @@
     }
   }
-
 }
Index: /XIOS/dev/dev_olga/src/context_server.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/context_server.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/context_server.hpp	(revision 1158)
@@ -14,9 +14,9 @@
     public:
 
-    CContextServer(CContext* parent, MPI_Comm intraComm, MPI_Comm interComm) ;
-
+    CContextServer(CContext* parent,MPI_Comm intraComm,MPI_Comm interComm) ;
     bool eventLoop(bool enableEventsProcessing = true);
     void listen(void) ;
     void checkPendingRequest(void) ;
+    void processRequest(int rank, char* buff,int count) ;
     void processEvents(void) ;
     bool hasFinished(void);
@@ -24,6 +24,4 @@
     void setPendingEvent(void) ;
     bool hasPendingEvent(void) ;
-
-    void processRequest(int rank, char* buff,int count) ;
 
     MPI_Comm intraComm ;
@@ -50,6 +48,5 @@
 
     private:
-    std::map<int, StdSize> mapBufferSize_;
-
+      std::map<int, StdSize> mapBufferSize_;
   } ;
 
Index: /XIOS/dev/dev_olga/src/cxios.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/cxios.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/cxios.cpp	(revision 1158)
@@ -16,6 +16,4 @@
   string CXios::rootFile="./iodef.xml" ;
   string CXios::xiosCodeId="xios.x" ;
-//  string CXios::xiosCodeIdPrm="xios.x.1" ;
-//  string CXios::xiosCodeIdSnd="xios.x.2" ;
   string CXios::clientFile="./xios_client";
   string CXios::serverFile="./xios_server";
@@ -36,4 +34,5 @@
   bool CXios::isOptPerformance = true;
   CRegistry* CXios::globalRegistry = 0;
+  double CXios::recvFieldTimeout = 10.0;
 
   //! Parse configuration file and create some objects from it
@@ -71,4 +70,7 @@
     bufferSizeFactor = getin<double>("buffer_size_factor", defaultBufferSizeFactor);
     minBufferSize = getin<int>("min_buffer_size", 1024 * sizeof(double));
+    recvFieldTimeout = getin<double>("recv_field_timeout", 10.0);
+    if (recvFieldTimeout < 0.0)
+      ERROR("CXios::parseXiosConfig()", "recv_field_timeout cannot be negative.");
 
     globalComm=MPI_COMM_WORLD ;
@@ -115,10 +117,19 @@
        delete globalRegistry ;
      }
-     CClient::closeInfoStream();
-  
 
 #ifdef XIOS_MEMTRACK
+
+#ifdef XIOS_MEMTRACK_LIGHT
+       report(10) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
+       report(10) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
+#endif
+
+#ifdef XIOS_MEMTRACK_FULL
      MemTrack::TrackListMemoryUsage() ;
      MemTrack::TrackDumpBlocks();
+#endif
+
+     CClient::closeInfoStream();
+
 #endif
   }
@@ -138,10 +149,9 @@
   {
     initServer();
+    isClient = false;
+    isServer = true;
 
     // Initialize all aspects MPI
     CServer::initialize();
-    isServer = true;
-    isClient = false;
-
     if (CServer::getRank()==0) globalRegistry = new CRegistry(CServer::intraComm) ;
     
@@ -181,4 +191,17 @@
      }
     CServer::finalize();
+
+#ifdef XIOS_MEMTRACK
+
+#ifdef XIOS_MEMTRACK_LIGHT
+       report(10) << " Memory report : current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
+       report(10) << " Memory report : maximum memory used by XIOS : "<<  MemTrack::getMaxMemorySize()*1.0/(1024*1024)<<" Mbyte" << endl ;
+#endif
+
+#ifdef XIOS_MEMTRACK_FULL
+     MemTrack::TrackListMemoryUsage() ;
+     MemTrack::TrackDumpBlocks();
+#endif
+#endif
     CServer::closeInfoStream();
   }
Index: /XIOS/dev/dev_olga/src/cxios.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/cxios.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/cxios.hpp	(revision 1158)
@@ -37,6 +37,4 @@
      static bool isServer ; //!< Check if xios is server
 
-//     static int serverLevel ;
-
      static MPI_Comm globalComm ; //!< Global communicator
 
@@ -51,4 +49,5 @@
      static bool isOptPerformance; //!< Check if buffer size is for performance (as large as possible)
      static CRegistry* globalRegistry ; //!< global registry which is wrote by the root process of the servers
+     static double recvFieldTimeout; //!< Time to wait for data before issuing an error when receiving a field
 
     public:
Index: /XIOS/dev/dev_olga/src/data_output.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/data_output.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/data_output.cpp	(revision 1158)
@@ -84,11 +84,15 @@
       //----------------------------------------------------------------
 
-      void CDataOutput::writeField(CField* field)
+      void CDataOutput::writeFieldTimeAxis(CField* field)
       {
          CContext* context = CContext::getCurrent() ;
          boost::shared_ptr<CCalendar> calendar = context->getCalendar();
 
+         this->writeTimeAxis_(field, calendar);
+      }
+      
+      void CDataOutput::writeField(CField* field)
+      {
          this->writeField_(field);
-         this->writeTimeAxis_(field, calendar);
       }
 
Index: /XIOS/dev/dev_olga/src/data_output.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/data_output.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/data_output.hpp	(revision 1158)
@@ -25,4 +25,5 @@
             void closeFile     (void);
             void writeField    (CField* field);
+            void writeFieldTimeAxis(CField* field) ;
             void writeFieldGrid(CField* field);
             void writeTimeDimension(void);
Index: /XIOS/dev/dev_olga/src/date.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/date.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/date.cpp	(revision 1158)
@@ -62,4 +62,12 @@
          hour = date.hour; minute = date.minute; second = date.second;
          return (*this);
+      }
+
+      bool CDate::operator==(const CDate& date)
+      {         
+         return (&(*relCalendar) == &(*date.relCalendar) &&
+                 year == date.year && month  == date.month  && day == date.day &&
+                 hour == date.hour && minute == date.minute && second == date.second);
+         
       }
 
Index: /XIOS/dev/dev_olga/src/date.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/date.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/date.hpp	(revision 1158)
@@ -32,4 +32,5 @@
             /// OpÃ©rateurs ///
             CDate& operator=(const CDate& date);
+            bool operator==(const CDate& date);
             friend StdOStream& operator<<(StdOStream& out, const CDate& date);
             friend StdIStream& operator>>(StdIStream& in, CDate& date);
Index: /XIOS/dev/dev_olga/src/declare_ref_func.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/declare_ref_func.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/declare_ref_func.hpp	(revision 1158)
@@ -107,14 +107,14 @@
       if (refer_ptr->hasAutoGeneratedId() &&                           \
           refer_ptr->hasDirect##type##Reference())                     \
-          nameRef = refer_ptr->name_##_ref;                            \
+        nameRef = refer_ptr->name_##_ref;                              \
       else {                                                           \
-         nameRef = refer_ptr->getId(); break;                           \
-       }                                                                \
-       if (tmpRefObjects.end() != tmpRefObjects.find(refer_ptr))        \
-       {                                                                \
+        nameRef = refer_ptr->getId(); break;                           \
+      }                                                                \
+      if (tmpRefObjects.end() != tmpRefObjects.find(refer_ptr))        \
+      {                                                                \
         ERROR("const StdString& C" #type "::get" #type "OutputName(void) const ",      \
-               << "Circular dependency stopped for " #name_ " object "  \
-               << "with id = \"" << refer_ptr->getId() << "\".");       \
-       }                                                               \
+              << "Circular dependency stopped for " #name_ " object "  \
+              << "with id = \"" << refer_ptr->getId() << "\".");       \
+      }                                                                \
     }                                                                  \
     return nameRef;                                                    \
Index: /XIOS/dev/dev_olga/src/dht_auto_indexing.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/dht_auto_indexing.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/dht_auto_indexing.cpp	(revision 1158)
@@ -79,5 +79,6 @@
     for (itIdx = itbIdx; itIdx != iteIdx; ++itIdx)
     {
-      (itIdx->second)[0] = beginIndexOnProc_ + idx;
+//      (itIdx->second)[0] = beginIndexOnProc_ + idx;
+      (itIdx->second)[1] = beginIndexOnProc_ + idx;
       globalIndex_[idx] = beginIndexOnProc_ + idx;
       ++idx ;
Index: /XIOS/dev/dev_olga/src/distribution_client.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/distribution_client.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/distribution_client.cpp	(revision 1158)
@@ -152,4 +152,8 @@
   infoIndex_.resize(this->dims_);
 
+  // A trick to determine position of each domain in domainList
+  int domIndex = 0, axisIndex = 0, scalarIndex = 0;
+  idx = 0;
+
   elementLocalIndex_.resize(numElement_);
   elementGlobalIndex_.resize(numElement_);
@@ -158,16 +162,9 @@
   elementNLocal_.resize(numElement_);
   elementNGlobal_.resize(numElement_);
-
   elementNLocal_[0] = 1;
   elementNGlobal_[0] = 1;
+  size_t localSize = 1, globalSize = 1;
+
   isDataDistributed_ = false;
-
-  size_t localSize = 1, globalSize = 1;
-
-  // A trick to determine position of each domain in domainList
-  int domIndex = 0, axisIndex = 0, scalarIndex = 0;
-  idx = 0;
-
-  
   // Update all the vectors above
   for (idx = 0; idx < numElement_; ++idx)
Index: /XIOS/dev/dev_olga/src/distribution_server.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/distribution_server.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/distribution_server.hpp	(revision 1158)
@@ -43,7 +43,4 @@
     virtual void createGlobalIndex();
 
-    void createGlobalIndexFromIndex(const std::vector<CArray<int,1> >& globalIndexOnEachDimension,
-                                    const std::vector<int>& nbGlobal);
-
   protected:
     GlobalLocalMap globalLocalIndexMap_;
Index: /XIOS/dev/dev_olga/src/duration.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/duration.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/duration.cpp	(revision 1158)
@@ -26,4 +26,13 @@
       }
 
+      /*!
+        This operation may not serve much, it's here because of the need of operator== from generic class CType<T>
+      */
+      bool CDuration::operator==(const CDuration& duration)
+      {
+        return (year == duration.year && month  == duration.month  && day == duration.day &&
+                hour == duration.hour && minute == duration.minute && second == duration.second && timestep == duration.timestep);        
+      }
+
       StdOStream& operator<<(StdOStream& out, const CDuration& duration)
       {
@@ -38,4 +47,15 @@
         char   c = '/';
         bool   invalidUnit = false;
+        CDuration sentinel = NoneDu;
+
+#define setDuration(unit, value)                                                  \
+        {                                                                         \
+          if (sentinel.unit)                                                      \
+            ERROR("StdIStream& operator>>(StdIStream& in , CDuration& duration)", \
+                  << "Bad duration format: " #unit " has already been set.");      \
+                                                                                  \
+          duration.unit = value;                                                  \
+          sentinel.unit = 1.0;                                                    \
+        }
 
         do
@@ -48,13 +68,13 @@
           switch (c)
           {
-            case 'y': duration.year   = v; break;
-            case 'd': duration.day    = v; break;
-            case 'h': duration.hour   = v; break;
-            case 's': duration.second = v; break;
+            case 'y': setDuration(year, v) break;
+            case 'd': setDuration(day, v) break;
+            case 'h': setDuration(hour, v) break;
+            case 's': setDuration(second, v) break;
             case 'm':
             {
               in >> c;
-              if      (c == 'i') duration.minute = v;
-              else if (c == 'o') duration.month  = v;
+              if      (c == 'i') setDuration(minute, v)
+              else if (c == 'o') setDuration(month, v)
               else invalidUnit = true;
               break;
@@ -63,5 +83,5 @@
             {
               in >> c;
-              if (c == 's') duration.timestep = v;
+              if (c == 's') setDuration(timestep, v)
               else invalidUnit = true;
               break;
@@ -76,4 +96,6 @@
                   << "Bad duration format: invalid unit, unexpected '" << c << "' character.");
         } while (in.peek() != EOF); // check whether there is a next character to read
+
+#undef setDuration
 
         return in;
Index: /XIOS/dev/dev_olga/src/duration.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/duration.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/duration.hpp	(revision 1158)
@@ -22,4 +22,5 @@
             /// OpÃ©rateurs ///
             CDuration& operator=(const CDuration& duration);
+            bool operator==(const CDuration& duration);
 
             friend StdOStream& operator<<(StdOStream& out, const CDuration& duration);
Index: /XIOS/dev/dev_olga/src/event_scheduler.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/event_scheduler.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/event_scheduler.cpp	(revision 1158)
@@ -150,10 +150,9 @@
         size_t hashId=recvRequest->buffer[1] ;
         size_t lev=recvRequest->buffer[2] ;
-//        delete recvRequest ;
+        delete recvRequest ;
         pendingRecvParentRequest.pop() ;       
  
         if (lev==level) eventStack.push(pair<size_t,size_t>(timeLine,hashId)) ;
         else  bcastEvent(timeLine, hashId, lev) ;
-        delete recvRequest ;
       }
     }   
Index: /XIOS/dev/dev_olga/src/filter/file_server_writer_filter.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/file_server_writer_filter.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/file_server_writer_filter.cpp	(revision 1158)
@@ -18,3 +18,8 @@
     field->writeUpdateData(data[0]->data);
   }
+
+  bool CFileServerWriterFilter::isDataExpected(const CDate& date) const
+  {
+    return true;
+  }
 } // namespace xios
Index: /XIOS/dev/dev_olga/src/filter/file_server_writer_filter.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/file_server_writer_filter.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/file_server_writer_filter.hpp	(revision 1158)
@@ -23,4 +23,5 @@
       CFileServerWriterFilter(CGarbageCollector& gc, CField* field);
 
+      bool virtual isDataExpected(const CDate& date) const;
     protected:
       /*!
Index: /XIOS/dev/dev_olga/src/filter/file_writer_filter.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/file_writer_filter.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/file_writer_filter.cpp	(revision 1158)
@@ -2,4 +2,5 @@
 #include "exception.hpp"
 #include "field.hpp"
+#include "utils.hpp"
 
 namespace xios
@@ -16,5 +17,24 @@
   void CFileWriterFilter::onInputReady(std::vector<CDataPacketPtr> data)
   {
+    bool ignoreMissingValue = (!field->detect_missing_value.isEmpty() && 
+                               !field->default_value.isEmpty() && 
+                               field->detect_missing_value == true);
+    if (ignoreMissingValue)
+    {
+      double missingValue = field->default_value;
+      size_t nbData = data[0]->data.numElements();
+      for (size_t idx = 0; idx < nbData; ++idx)
+      {
+        if (NumTraits<double>::isnan(data[0]->data(idx)))
+          data[0]->data(idx) = missingValue;
+      }
+    }    
+
     field->sendUpdateData(data[0]->data);
   }
+
+  bool CFileWriterFilter::isDataExpected(const CDate& date) const
+  {
+    return true;
+  }
 } // namespace xios
Index: /XIOS/dev/dev_olga/src/filter/file_writer_filter.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/file_writer_filter.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/file_writer_filter.hpp	(revision 1158)
@@ -23,4 +23,11 @@
       CFileWriterFilter(CGarbageCollector& gc, CField* field);
 
+      /*!
+       * Tests whether data is expected for the specified date.
+       *
+       * \param date the date associated to the data
+       */
+      bool virtual isDataExpected(const CDate& date) const;
+
     protected:
       /*!
Index: /XIOS/dev/dev_olga/src/filter/filter.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/filter.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/filter.cpp	(revision 1158)
@@ -40,3 +40,8 @@
     return (CInputPin::canBeTriggered() || COutputPin::canBeTriggered());
   }
+
+  bool CFilter::isDataExpected(const CDate& date) const
+  {
+    return COutputPin::isDataExpected(date);
+  }
 } // namespace xios
Index: /XIOS/dev/dev_olga/src/filter/filter.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/filter.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/filter.hpp	(revision 1158)
@@ -48,4 +48,11 @@
       bool virtual canBeTriggered() const;
 
+      /*!
+       * Tests whether data is expected for the specified date.
+       *
+       * \param date the date associated to the data
+       */
+      bool virtual isDataExpected(const CDate& date) const;
+
     protected:
       IFilterEngine* engine; //!< The filter engine, might be the filter itself
Index: /XIOS/dev/dev_olga/src/filter/input_pin.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/input_pin.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/input_pin.hpp	(revision 1158)
@@ -60,4 +60,11 @@
 
       /*!
+       * Tests whether data is expected for the specified date.
+       *
+       * \param date the date associated to the data
+       */
+      bool virtual isDataExpected(const CDate& date) const = 0;
+
+      /*!
        * Removes all pending packets which are older than the specified timestamp.
        *
Index: /XIOS/dev/dev_olga/src/filter/output_pin.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/output_pin.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/output_pin.cpp	(revision 1158)
@@ -73,4 +73,16 @@
   }
 
+  bool COutputPin::isDataExpected(const CDate& date) const
+  {
+    std::vector<std::pair<boost::shared_ptr<CInputPin>, size_t> >::const_iterator it, itEnd;
+    for (it = outputs.begin(), itEnd = outputs.end(); it != itEnd; ++it)
+    {
+      if (it->first->isDataExpected(date))
+        return true;
+    }
+
+    return false;
+  }
+
   void COutputPin::invalidate(Time timestamp)
   {
Index: /XIOS/dev/dev_olga/src/filter/output_pin.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/output_pin.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/output_pin.hpp	(revision 1158)
@@ -46,4 +46,11 @@
 
       /*!
+       * Tests whether data is expected for the specified date.
+       *
+       * \param date the date associated to the data
+       */
+      bool virtual isDataExpected(const CDate& date) const;
+
+      /*!
        * Removes all pending packets which are older than the specified timestamp.
        *
Index: /XIOS/dev/dev_olga/src/filter/source_filter.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/source_filter.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/source_filter.cpp	(revision 1158)
@@ -3,12 +3,16 @@
 #include "exception.hpp"
 #include "calendar_util.hpp"
+#include <limits> 
 
 namespace xios
 {
   CSourceFilter::CSourceFilter(CGarbageCollector& gc, CGrid* grid,
-                               const CDuration offset /*= NoneDu*/, bool manualTrigger /*= false*/)
+                               const CDuration offset /*= NoneDu*/, bool manualTrigger /*= false*/,
+                               bool hasMissingValue /*= false*/,
+                               double defaultValue /*= 0.0*/)
     : COutputPin(gc, manualTrigger)
     , grid(grid)
     , offset(offset)
+    , hasMissingValue(hasMissingValue), defaultValue(defaultValue)
   {
     if (!grid)
@@ -29,4 +33,16 @@
     packet->data.resize(grid->storeIndex_client.numElements());
     grid->inputField(data, packet->data);
+
+    // Convert missing values to NaN
+    if (hasMissingValue)
+    {
+      double nanValue = std::numeric_limits<double>::quiet_NaN();
+      size_t nbData = packet->data.numElements();
+      for (size_t idx = 0; idx < nbData; ++idx)
+      {
+        if (defaultValue == packet->data(idx))
+          packet->data(idx) = nanValue;
+      }
+    }
 
     onOutputReady(packet);
Index: /XIOS/dev/dev_olga/src/filter/source_filter.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/source_filter.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/source_filter.hpp	(revision 1158)
@@ -23,7 +23,11 @@
        * \param offset the offset applied to the timestamp of all packets
        * \param manualTrigger whether the output should be triggered manually
+       * \param hasMissingValue whether data has missing value
+       * \param defaultValue missing value to detect
        */
       CSourceFilter(CGarbageCollector& gc, CGrid* grid,
-                    const CDuration offset = NoneDu, bool manualTrigger = false);
+                    const CDuration offset = NoneDu, bool manualTrigger = false,
+                    bool hasMissingValue = false,
+                    double defaultValue = 0.0);
 
       /*!
@@ -58,4 +62,6 @@
       CGrid* grid; //!< The grid attached to the data the filter can accept
       const CDuration offset; //!< The offset applied to the timestamp of all packets
+      bool hasMissingValue;
+      double defaultValue;
   }; // class CSourceFilter
 } // namespace xios
Index: /XIOS/dev/dev_olga/src/filter/spatial_transform_filter.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/spatial_transform_filter.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/spatial_transform_filter.cpp	(revision 1158)
@@ -11,5 +11,5 @@
 
   std::pair<boost::shared_ptr<CSpatialTransformFilter>, boost::shared_ptr<CSpatialTransformFilter> >
-  CSpatialTransformFilter::buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, double defaultValue)
+  CSpatialTransformFilter::buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, bool hasMissingValue, double missingValue)
   {
     if (!srcGrid || !destGrid)
@@ -26,4 +26,5 @@
       const std::vector<StdString>& auxInputs = gridTransformation->getAuxInputs();
       size_t inputCount = 1 + (auxInputs.empty() ? 0 : auxInputs.size());
+      double defaultValue  = (hasMissingValue) ? std::numeric_limits<double>::quiet_NaN() : 0.0;
       boost::shared_ptr<CSpatialTransformFilter> filter(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount));
 
@@ -103,5 +104,6 @@
       }
       packet->data.resize(gridTransformation->getGridDestination()->storeIndex_client.numElements());
-      packet->data = defaultValue;
+      if (0 != packet->data.numElements())
+        (packet->data)(0) = defaultValue;
       apply(data[0]->data, packet->data);
     }
@@ -115,6 +117,7 @@
 
     // Get default value for output data
-    double defaultValue = 0.0;
-    if (0 != dataDest.numElements()) defaultValue = dataDest(0);
+    bool ignoreMissingValue = false; 
+    double defaultValue = std::numeric_limits<double>::quiet_NaN();
+    if (0 != dataDest.numElements()) ignoreMissingValue = NumTraits<double>::isnan(dataDest(0));
 
     const std::list<CGridTransformation::SendingIndexGridSourceMap>& listLocalIndexSend = gridTransformation->getLocalIndexToSendFromGridSource();
@@ -191,5 +194,5 @@
         else dataCurrentDest(i) = defaultValue;
 
-      std::vector<bool> localInitFlag(dataCurrentDest.size(), true);
+      std::vector<bool> localInitFlag(dataCurrentDest.numElements(), true);
       currentBuff = 0;
       for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv)
@@ -201,5 +204,5 @@
                          dataCurrentDest,
                          localInitFlag,
-                         defaultValue);
+                         ignoreMissingValue);
 
         currentBuff += countSize;
Index: /XIOS/dev/dev_olga/src/filter/spatial_transform_filter.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/spatial_transform_filter.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/spatial_transform_filter.hpp	(revision 1158)
@@ -32,8 +32,10 @@
        * \param srcGrid the source grid
        * \param destGrid the destination grid
+       * \param hasMissingValue whether field source has missing value
+       * \param defaultValue default value
        * \return the first and the last filters of the filter graph
        */
       static std::pair<boost::shared_ptr<CSpatialTransformFilter>, boost::shared_ptr<CSpatialTransformFilter> >
-      buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, double defaultValue);
+      buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, bool hasMissingValue, double defaultValue);
 
     protected:
Index: /XIOS/dev/dev_olga/src/filter/store_filter.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/store_filter.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/store_filter.cpp	(revision 1158)
@@ -24,5 +24,5 @@
     CTimer timer("CStoreFilter::getPacket");
     CConstDataPacketPtr packet;
-    const double timeout = 10 ; // 10 seconds timeout
+    const double timeout = CXios::recvFieldTimeout;
 
     do
@@ -81,4 +81,9 @@
   }
 
+  bool CStoreFilter::isDataExpected(const CDate& date) const
+  {
+    return true;
+  }
+
   void CStoreFilter::invalidate(Time timestamp)
   {
Index: /XIOS/dev/dev_olga/src/filter/store_filter.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/store_filter.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/store_filter.hpp	(revision 1158)
@@ -50,4 +50,11 @@
 
       /*!
+       * Tests whether data is expected for the specified date.
+       *
+       * \param date the date associated to the data
+       */
+      bool virtual isDataExpected(const CDate& date) const;
+
+      /*!
        * Removes all pending packets which are older than the specified timestamp.
        *
Index: /XIOS/dev/dev_olga/src/filter/temporal_filter.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/temporal_filter.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/temporal_filter.cpp	(revision 1158)
@@ -5,34 +5,21 @@
 namespace xios
 {
+  static func::CFunctor* createFunctor(const std::string& opId, bool ignoreMissingValue, double missingValue, CArray<double, 1>& tmpData);
+
   CTemporalFilter::CTemporalFilter(CGarbageCollector& gc, const std::string& opId,
                                    const CDate& initDate, const CDuration samplingFreq, const CDuration samplingOffset, const CDuration opFreq,
                                    bool ignoreMissingValue /*= false*/, double missingValue /*= 0.0*/)
     : CFilter(gc, 1, this)
-    , samplingFreq(samplingFreq)
+    , functor(createFunctor(opId, ignoreMissingValue, missingValue, tmpData))
+    , isOnceOperation(functor->timeType() == func::CFunctor::once)
+    , isInstantOperation(functor->timeType() == func::CFunctor::instant)
+    // If we can optimize the sampling when dealing with an instant functor we do it
+    , samplingFreq((isInstantOperation && samplingFreq == TimeStep && samplingOffset == NoneDu) ? opFreq : samplingFreq)
+    , samplingOffset((isInstantOperation && samplingFreq == TimeStep && samplingOffset == NoneDu) ? opFreq - initDate.getRelCalendar().getTimeStep() : samplingOffset)
     , opFreq(opFreq)
-    , nextSamplingDate(initDate + samplingOffset + initDate.getRelCalendar().getTimeStep())
-    , nextOperationDate(initDate + opFreq)
+    , nextSamplingDate(initDate + this->samplingOffset + initDate.getRelCalendar().getTimeStep())
+    , nextOperationDate(initDate + this->samplingOffset + opFreq)
     , isFirstOperation(true)
   {
-#define DECLARE_FUNCTOR(MType, mtype) \
-    if (opId.compare(#mtype) == 0) \
-    { \
-      if (ignoreMissingValue) \
-      { \
-        functor.reset(new func::C##MType(tmpData, missingValue)); \
-      } \
-      else \
-      { \
-        functor.reset(new func::C##MType(tmpData)); \
-      } \
-    }
-
-#include "functor_type.conf"
-
-    if (!functor)
-      ERROR("CTemporalFilter::CTemporalFilter(CGarbageCollector& gc, const std::string& opId, ...)",
-            << "\"" << opId << "\" is not a valid operation.");
-
-    isOnceOperation = (functor->timeType() == func::CFunctor::once);
   }
 
@@ -43,26 +30,42 @@
     if (data[0]->status != CDataPacket::END_OF_STREAM)
     {
-      const bool usePacket = isOnceOperation ? isFirstOperation : (data[0]->date >= nextSamplingDate);
+      bool usePacket, outputResult, copyLess;
+      if (isOnceOperation)
+        usePacket = outputResult = copyLess = isFirstOperation;
+      else
+      {
+        usePacket = (data[0]->date >= nextSamplingDate);
+        outputResult = (data[0]->date + samplingFreq > nextOperationDate);
+        copyLess = (isInstantOperation && usePacket && outputResult);
+      }
+
       if (usePacket)
       {
-        if (!tmpData.numElements())
-          tmpData.resize(data[0]->data.numElements());
+        if (!copyLess)
+        {
+          if (!tmpData.numElements())
+            tmpData.resize(data[0]->data.numElements());
 
-        (*functor)(data[0]->data);
+          (*functor)(data[0]->data);
+        }
 
         nextSamplingDate = nextSamplingDate + samplingFreq;
       }
 
-      const bool outputResult = isOnceOperation ? isFirstOperation : (data[0]->date + samplingFreq > nextOperationDate);
       if (outputResult)
       {
-        functor->final();
+        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;
+          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;
@@ -73,3 +76,36 @@
     return packet;
   }
+
+  bool CTemporalFilter::isDataExpected(const CDate& date) const
+  {
+    return isOnceOperation ? isFirstOperation : (date >= nextSamplingDate || date + samplingFreq > nextOperationDate);
+  }
+
+  static func::CFunctor* createFunctor(const std::string& opId, bool ignoreMissingValue, double missingValue, CArray<double, 1>& tmpData)
+  {
+    func::CFunctor* functor = NULL;
+
+    double defaultValue = ignoreMissingValue ? std::numeric_limits<double>::quiet_NaN() : missingValue;
+
+#define DECLARE_FUNCTOR(MType, mtype) \
+    if (opId.compare(#mtype) == 0) \
+    { \
+      if (ignoreMissingValue) \
+      { \
+        functor = new func::C##MType(tmpData, defaultValue); \
+      } \
+      else \
+      { \
+        functor = new func::C##MType(tmpData); \
+      } \
+    }
+
+#include "functor_type.conf"
+
+    if (!functor)
+      ERROR("createFunctor(const std::string& opId, ...)",
+            << "\"" << opId << "\" is not a valid operation.");
+
+    return functor;
+  }
 } // namespace xios
Index: /XIOS/dev/dev_olga/src/filter/temporal_filter.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/filter/temporal_filter.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/filter/temporal_filter.hpp	(revision 1158)
@@ -40,13 +40,22 @@
       CDataPacketPtr virtual apply(std::vector<CDataPacketPtr> data);
 
+      /*!
+       * Tests whether data is expected for the specified date.
+       *
+       * \param date the date associated to the data
+       */
+      bool virtual isDataExpected(const CDate& date) const;
+
     private:
-      boost::scoped_ptr<func::CFunctor> functor; //!< The functor corresponding to the temporal operation
+      const boost::scoped_ptr<func::CFunctor> functor; //!< The functor corresponding to the temporal operation
       CArray<double, 1> tmpData; //!< The array of data used for temporary storage
       const CDuration samplingFreq; //!< The sampling frequency, i.e. the frequency at which the input data will be used
+      const CDuration samplingOffset; //!< The sampling offset, i.e. the offset after which the input data will be used
       const CDuration opFreq; //!< The operation frequency, i.e. the frequency at which the output data will be computed
       CDate nextSamplingDate; //!< The date of the next sampling
       CDate nextOperationDate; //!< The date of the next operation
       bool isFirstOperation; //!< True before the first operation was been computed
-      bool isOnceOperation; //!< True if the operation should be computed just once
+      const bool isOnceOperation; //!< True if the operation should be computed just once
+      const bool isInstantOperation; //!< True if the operation is instant
   }; // class CTemporalFilter
 } // namespace xios
Index: /XIOS/dev/dev_olga/src/functor/accumulate.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/functor/accumulate.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/functor/accumulate.cpp	(revision 1158)
@@ -1,4 +1,5 @@
 #include "accumulate.hpp"
 #include "array_new.hpp"
+#include "utils.hpp"
 
 namespace xios
@@ -33,7 +34,7 @@
             double* out=_doutput.dataFirst();
             for (i=0; i<n; ++i,++in,++out) 
-              if (*in!=missingValue)
+              if (!NumTraits<double>::isnan(*in))
               {
-                if(*out!=missingValue) *out  += *in;
+                if(!NumTraits<double>::isnan(*out)) *out  += *in;
                 else *out=*in ;
               }
Index: /XIOS/dev/dev_olga/src/functor/average.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/functor/average.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/functor/average.cpp	(revision 1158)
@@ -1,4 +1,5 @@
 #include "average.hpp"
 #include "array_new.hpp"
+#include "utils.hpp"
 
 namespace xios
@@ -42,5 +43,5 @@
             int* nc=nbcalls.dataFirst() ;
             for (i=0; i<n; ++i,++nc,++in) 
-              if (*in!=missingValue) (*nc) ++;
+              if (!NumTraits<double>::isnan(*in)) (*nc) ++;
           }
         }
@@ -54,5 +55,5 @@
             int* nc=nbcalls.dataFirst() ;
             for (i=0; i<n; ++i,++in,++out,++nc) 
-              if (*in!=missingValue) 
+              if (!NumTraits<double>::isnan(*in)) 
               {
                 if (*nc != 0) (*out)  += *in;
Index: /XIOS/dev/dev_olga/src/functor/maximum.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/functor/maximum.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/functor/maximum.cpp	(revision 1158)
@@ -1,6 +1,5 @@
 #include "maximum.hpp"
 #include "array_new.hpp"
-
-
+#include "utils.hpp"
 
 namespace xios
@@ -35,7 +34,7 @@
            { 
              for (; it1 != end1; it1++, it++) 
-               if (*it1 != missingValue)
+               if (!NumTraits<double>::isnan(*it1))
                {
-                 if ( *it != missingValue) *it = std::max(*it1, *it);
+                 if (!NumTraits<double>::isnan(*it)) *it = std::max(*it1, *it);
                  else *it=*it1 ;  
                }
Index: /XIOS/dev/dev_olga/src/functor/minimum.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/functor/minimum.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/functor/minimum.cpp	(revision 1158)
@@ -2,4 +2,5 @@
 #include "array_new.hpp"
 #include <algorithm>
+#include "utils.hpp"
 
 namespace xios
@@ -26,5 +27,5 @@
       {
         const double * it1  = _dinput.dataFirst(),
-                      * end1 = _dinput.dataFirst() + _dinput.numElements();
+                      *end1 = _dinput.dataFirst() + _dinput.numElements();
         double * it   = _doutput.dataFirst();
         
@@ -35,7 +36,7 @@
           { 
             for (; it1 != end1; it1++, it++) 
-              if (*it1!=missingValue)
+              if (!NumTraits<double>::isnan(*it1))
               {
-                if (*it != missingValue) *it = std::min(*it1, *it);
+                if (!NumTraits<double>::isnan(*it)) *it = std::min(*it1, *it);
                 else *it=*it1 ;
               }
Index: /XIOS/dev/dev_olga/src/generate_interface_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/generate_interface_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/generate_interface_impl.hpp	(revision 1158)
@@ -547,4 +547,36 @@
 #undef macro
 
+#define macro(N,EXTENT)\
+  template <>\
+  void CInterface::AttributeCInterface<CArray<StdString,N> >(ostream& oss, const string& className, const string& name)\
+  { \
+    oss << "void cxios_set_" << className << "_" << name << "(" << className << "_Ptr " << className << "_hdl, " << "char* " << name <<", int str_len, int* str_size, int* extent)" << iendl; \
+    oss << "{" << iendl; \
+    oss << "  CTimer::get(\"XIOS\").resume();" << iendl; \
+    oss << "  "<<className<<"_hdl->"<<name<<".resize(shape("<<EXTENT<<"));"<<iendl;\
+    oss << "  Array<StdString,"<<#N<<">::iterator it, itb="<<className<<"_hdl->"<<name<<".begin(), ite="<<className<<"_hdl->"<<name<<".end() ;"<<iendl ;\
+    oss << "  int i, n ;"<< iendl; \
+    oss << "  for(it=itb, i=0, n=0 ; it!=ite ; ++it,n+=str_len,++i) *it=StdString(&"<<name<<"[n],str_size[i]) ;"<<iendl ;\
+    oss << "  CTimer::get(\"XIOS\").suspend();" << iendl; \
+    oss << "}" << std::endl; \
+    oss << iendl; \
+    oss << "void cxios_get_" << className << "_" << name << "(" << className << "_Ptr " << className << "_hdl, " << "char* " << name << ", int str_size, int* extent)" << iendl; \
+    oss << "{" << iendl; \
+    oss << "  CTimer::get(\"XIOS\").resume();" << iendl; \
+    oss << "  Array<StdString,"<<#N<<">::const_iterator it, itb="<<className<<"_hdl->"<<name<<".getInheritedValue().begin(), ite="<<className<<"_hdl->"<<name<<".getInheritedValue().end() ;" << iendl; \
+    oss << "  int n ;"<< iendl; \
+    oss << "  for(it=itb, n=0 ; it!=ite ; ++it, n+=str_size) it->copy(&"<<name<<"[n],it->size()) ; "<< iendl; \
+    oss << "  CTimer::get(\"XIOS\").suspend();" << iendl; \
+    oss << "}" << std::endl; \
+  }
+
+macro(1,"extent[0]")
+macro(2,"extent[0],extent[1]")
+macro(3,"extent[0],extent[1],extent[2]")
+macro(4,"extent[0],extent[1],extent[2],extent[3]")
+macro(5,"extent[0],extent[1],extent[2],extent[3],extent[4]")
+macro(6,"extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]")
+macro(7,"extent[0],extent[1],extent[2],extent[3],extent[4],extent[5],extent[6]")
+#undef macro
 // /////////////////////////////////////////////////
 // //          Fortran 2003 Interface             //
@@ -705,4 +737,35 @@
   #undef macro
 
+#define macro(T)\
+  template <>\
+  void CInterface::AttributeFortran2003Interface<CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\
+  {\
+    oss << "SUBROUTINE cxios_set_" << className << "_" << name << "(" << className << "_hdl, " << name << ", str_len, str_size, extent) BIND(C)" << iendl; \
+    oss << "  USE ISO_C_BINDING" << iendl; \
+    oss << "  INTEGER (kind = C_INTPTR_T), VALUE       :: " << className << "_hdl" << iendl; \
+    oss << "  CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: " << name << iendl; \
+    oss << "  INTEGER (kind = C_INT), VALUE            :: str_len" << iendl; \
+    oss << "  INTEGER (kind = C_INT), DIMENSION(*)     :: str_size" << iendl; \
+    oss << "  INTEGER (kind = C_INT), DIMENSION(*)     :: extent" << iendl; \
+    oss << "END SUBROUTINE cxios_set_" << className << "_" << name << std::endl; \
+    oss << iendl; \
+    oss << "SUBROUTINE cxios_get_" << className << "_" << name << "(" << className << "_hdl, " << name << ", str_size, extent) BIND(C)" << iendl; \
+    oss << "  USE ISO_C_BINDING" << iendl; \
+    oss << "  INTEGER (kind = C_INTPTR_T), VALUE       :: " << className << "_hdl" << iendl; \
+    oss << "  CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: " << name << iendl; \
+    oss << "  INTEGER (kind = C_INT), VALUE            :: str_size" << iendl; \
+    oss << "  INTEGER (kind = C_INT), DIMENSION(*)     :: extent" << iendl; \
+    oss << "END SUBROUTINE cxios_get_" << className << "_" << name << std::endl; \
+  }
+  macro(1)
+  macro(2)
+  macro(3)
+  macro(4)
+  macro(5)
+  macro(6)
+  macro(7)
+
+#undef macro
+
 #define macro(T) \
   template <> \
@@ -808,4 +871,31 @@
 
 #undef macro
+
+#define macro(T,EXTENT)\
+  template <> \
+  void CInterface::AttributeFortranInterfaceDeclaration<CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\
+  {\
+    oss << "CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: " << name << "("<<EXTENT<<")"; \
+  }\
+\
+  template <>\ 
+  void CInterface::AttributeFortranInterfaceGetDeclaration<CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\
+  {\
+    oss << "CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: " << name << "("<<EXTENT<<")"; \
+  }
+  macro(1,":")
+  macro(2,":,:")
+  macro(3,":,:,:")
+  macro(4,":,:,:,:")
+  macro(5,":,:,:,:,:")
+  macro(6,":,:,:,:,:,:")
+  macro(7,":,:,:,:,:,:,:")
+
+#undef macro
+
+
+
+
+  
 
 #define macro(T) \
@@ -947,4 +1037,18 @@
 #undef macro
 
+#define macro(T)\
+  template <>\
+  void CInterface::AttributeFortranInterfaceBody< CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\
+  {\
+     oss << "IF (PRESENT(" << name << "_)) THEN" << iendl; \
+     oss << "  CALL cxios_set_" << className << "_" << name << " &" << iendl; \
+     oss << "(" << className << "_hdl%daddr, " << name <<"_, LEN("<<name<<"_), LEN_TRIM("<<name<< "_), SHAPE(" << name << "_))" << iendl; \
+     oss << "ENDIF"; \
+  }
+
+  macro(1)
+  macro(2)
+#undef macro
+
 #define macro(T) \
   template <>  \
@@ -1084,4 +1188,24 @@
 
 #undef macro
+
+#define macro(T)\
+  template <> \
+  void CInterface::AttributeFortranInterfaceGetBody< CArray<StdString,T> >(ostream& oss, const string& className, const string& name)\
+  {\
+    oss << "IF (PRESENT(" << name << "_)) THEN" << iendl; \
+    oss << "  CALL cxios_get_" << className << "_" << name << " &" << iendl; \
+    oss << "(" << className << "_hdl%daddr, " << name << "_, LEN("<<name<<"_), SHAPE(" << name << "_))" << iendl; \
+    oss << "ENDIF"; \
+  }
+  macro(1)
+  macro(2)
+  macro(3)
+  macro(4)
+  macro(5)
+  macro(6)
+  macro(7)
+
+#undef macro
+  
 }
 #endif
Index: /XIOS/dev/dev_olga/src/group_template_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/group_template_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/group_template_impl.hpp	(revision 1158)
@@ -8,4 +8,5 @@
 #include "context.hpp"
 #include "event_client.hpp"
+#include "context_client.hpp"
 #include "message.hpp"
 #include "type.hpp"
@@ -398,22 +399,4 @@
       }
     }
-
-    // if (! context->hasServer )
-    // {
-    //    CContextClient* client=context->client ;
-
-    //    CEventClient event(this->getType(),EVENT_ID_CREATE_CHILD) ;   
-    //    if (client->isServerLeader())
-    //    {
-    //      CMessage msg ;
-    //      msg<<this->getId() ;
-    //      msg<<id ;
-    //      const std::list<int>& ranks = client->getRanksServerLeader();
-    //      for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
-    //        event.push(*itRank,1,msg) ;
-    //      client->sendEvent(event) ;
-    //    }
-    //    else client->sendEvent(event) ;
-    // }
       
    }
@@ -464,23 +447,4 @@
       }
     }
-
-    // if (! context->hasServer )
-    // {
-    //    CContextClient* client=context->client ;
-
-    //    CEventClient event(this->getType(),EVENT_ID_CREATE_CHILD_GROUP) ;   
-    //    if (client->isServerLeader())
-    //    {
-    //      CMessage msg ;
-    //      msg<<this->getId() ;
-    //      msg<<id ;
-    //      const std::list<int>& ranks = client->getRanksServerLeader();
-    //      for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
-    //        event.push(*itRank,1,msg) ;
-    //      client->sendEvent(event) ;
-    //    }
-    //    else client->sendEvent(event) ;
-    // }
-      
    }
    
@@ -488,5 +452,4 @@
    void CGroupTemplate<U, V, W>::recvCreateChild(CEventServer& event)
    {
-      
       CBufferIn* buffer=event.subEvents.begin()->buffer;
       string id;
Index: /XIOS/dev/dev_olga/src/interface/c/icfield.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c/icfield.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c/icfield.cpp	(revision 1158)
@@ -76,8 +76,8 @@
 // -----------------------------------------------------------------------------------------------------   
 
-  void cxios_field_is_active (XFieldPtr field_hdl, bool* ret)
+  void cxios_field_is_active (XFieldPtr field_hdl, bool at_current_timestep, bool* ret)
   {
     CTimer::get("XIOS").resume() ;
-    *ret = field_hdl->isActive();
+    *ret = field_hdl->isActive(at_current_timestep);
     CTimer::get("XIOS").suspend() ;
   }
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icaxis_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icaxis_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icaxis_attr.cpp	(revision 1158)
@@ -188,4 +188,32 @@
 
 
+  void cxios_set_axis_label(axis_Ptr axis_hdl, char* label, int str_len, int* str_size, int* extent)
+  {
+    CTimer::get("XIOS").resume();
+    axis_hdl->label.resize(shape(extent[0]));
+    Array<StdString,1>::iterator it, itb=axis_hdl->label.begin(), ite=axis_hdl->label.end() ;
+    int i, n ;
+    for(it=itb, i=0, n=0 ; it!=ite ; ++it,n+=str_len,++i) *it=StdString(&label[n],str_size[i]) ;
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_axis_label(axis_Ptr axis_hdl, char* label, int str_size, int* extent)
+  {
+    CTimer::get("XIOS").resume();
+    Array<StdString,1>::const_iterator it, itb=axis_hdl->label.getInheritedValue().begin(), ite=axis_hdl->label.getInheritedValue().end() ;
+    int n ;
+    for(it=itb, n=0 ; it!=ite ; ++it, n+=str_size) it->copy(&label[n],it->size()) ; 
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_axis_label(axis_Ptr axis_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = axis_hdl->label.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_axis_long_name(axis_Ptr axis_hdl, const char * long_name, int long_name_size)
   {
@@ -360,4 +388,27 @@
 
 
+  void cxios_set_axis_prec(axis_Ptr axis_hdl, int prec)
+  {
+    CTimer::get("XIOS").resume();
+    axis_hdl->prec.setValue(prec);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_axis_prec(axis_Ptr axis_hdl, int* prec)
+  {
+    CTimer::get("XIOS").resume();
+    *prec = axis_hdl->prec.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_axis_prec(axis_Ptr axis_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = axis_hdl->prec.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_axis_standard_name(axis_Ptr axis_hdl, const char * standard_name, int standard_name_size)
   {
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icaxisgroup_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icaxisgroup_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icaxisgroup_attr.cpp	(revision 1158)
@@ -214,4 +214,32 @@
 
 
+  void cxios_set_axisgroup_label(axisgroup_Ptr axisgroup_hdl, char* label, int str_len, int* str_size, int* extent)
+  {
+    CTimer::get("XIOS").resume();
+    axisgroup_hdl->label.resize(shape(extent[0]));
+    Array<StdString,1>::iterator it, itb=axisgroup_hdl->label.begin(), ite=axisgroup_hdl->label.end() ;
+    int i, n ;
+    for(it=itb, i=0, n=0 ; it!=ite ; ++it,n+=str_len,++i) *it=StdString(&label[n],str_size[i]) ;
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_axisgroup_label(axisgroup_Ptr axisgroup_hdl, char* label, int str_size, int* extent)
+  {
+    CTimer::get("XIOS").resume();
+    Array<StdString,1>::const_iterator it, itb=axisgroup_hdl->label.getInheritedValue().begin(), ite=axisgroup_hdl->label.getInheritedValue().end() ;
+    int n ;
+    for(it=itb, n=0 ; it!=ite ; ++it, n+=str_size) it->copy(&label[n],it->size()) ; 
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_axisgroup_label(axisgroup_Ptr axisgroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = axisgroup_hdl->label.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_axisgroup_long_name(axisgroup_Ptr axisgroup_hdl, const char * long_name, int long_name_size)
   {
@@ -386,4 +414,27 @@
 
 
+  void cxios_set_axisgroup_prec(axisgroup_Ptr axisgroup_hdl, int prec)
+  {
+    CTimer::get("XIOS").resume();
+    axisgroup_hdl->prec.setValue(prec);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_axisgroup_prec(axisgroup_Ptr axisgroup_hdl, int* prec)
+  {
+    CTimer::get("XIOS").resume();
+    *prec = axisgroup_hdl->prec.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_axisgroup_prec(axisgroup_Ptr axisgroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = axisgroup_hdl->prec.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_axisgroup_standard_name(axisgroup_Ptr axisgroup_hdl, const char * standard_name, int standard_name_size)
   {
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icdomain_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icdomain_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icdomain_attr.cpp	(revision 1158)
@@ -747,4 +747,27 @@
 
 
+  void cxios_set_domain_prec(domain_Ptr domain_hdl, int prec)
+  {
+    CTimer::get("XIOS").resume();
+    domain_hdl->prec.setValue(prec);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_domain_prec(domain_Ptr domain_hdl, int* prec)
+  {
+    CTimer::get("XIOS").resume();
+    *prec = domain_hdl->prec.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_domain_prec(domain_Ptr domain_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = domain_hdl->prec.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_domain_standard_name(domain_Ptr domain_hdl, const char * standard_name, int standard_name_size)
   {
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icdomaingroup_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icdomaingroup_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icdomaingroup_attr.cpp	(revision 1158)
@@ -773,4 +773,27 @@
 
 
+  void cxios_set_domaingroup_prec(domaingroup_Ptr domaingroup_hdl, int prec)
+  {
+    CTimer::get("XIOS").resume();
+    domaingroup_hdl->prec.setValue(prec);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_domaingroup_prec(domaingroup_Ptr domaingroup_hdl, int* prec)
+  {
+    CTimer::get("XIOS").resume();
+    *prec = domaingroup_hdl->prec.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_domaingroup_prec(domaingroup_Ptr domaingroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = domaingroup_hdl->prec.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_domaingroup_standard_name(domaingroup_Ptr domaingroup_hdl, const char * standard_name, int standard_name_size)
   {
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icexpand_domain_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icexpand_domain_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icexpand_domain_attr.cpp	(revision 1158)
@@ -17,4 +17,50 @@
 {
   typedef xios::CExpandDomain* expand_domain_Ptr;
+
+  void cxios_set_expand_domain_i_periodic(expand_domain_Ptr expand_domain_hdl, bool i_periodic)
+  {
+    CTimer::get("XIOS").resume();
+    expand_domain_hdl->i_periodic.setValue(i_periodic);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_expand_domain_i_periodic(expand_domain_Ptr expand_domain_hdl, bool* i_periodic)
+  {
+    CTimer::get("XIOS").resume();
+    *i_periodic = expand_domain_hdl->i_periodic.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_expand_domain_i_periodic(expand_domain_Ptr expand_domain_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = expand_domain_hdl->i_periodic.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_expand_domain_j_periodic(expand_domain_Ptr expand_domain_hdl, bool j_periodic)
+  {
+    CTimer::get("XIOS").resume();
+    expand_domain_hdl->j_periodic.setValue(j_periodic);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_expand_domain_j_periodic(expand_domain_Ptr expand_domain_hdl, bool* j_periodic)
+  {
+    CTimer::get("XIOS").resume();
+    *j_periodic = expand_domain_hdl->j_periodic.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_expand_domain_j_periodic(expand_domain_Ptr expand_domain_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = expand_domain_hdl->j_periodic.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
 
   void cxios_set_expand_domain_order(expand_domain_Ptr expand_domain_hdl, int order)
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icfile_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icfile_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icfile_attr.cpp	(revision 1158)
@@ -553,4 +553,82 @@
 
 
+  void cxios_set_file_time_stamp_format(file_Ptr file_hdl, const char * time_stamp_format, int time_stamp_format_size)
+  {
+    std::string time_stamp_format_str;
+    if (!cstr2string(time_stamp_format, time_stamp_format_size, time_stamp_format_str)) return;
+    CTimer::get("XIOS").resume();
+    file_hdl->time_stamp_format.setValue(time_stamp_format_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_file_time_stamp_format(file_Ptr file_hdl, char * time_stamp_format, int time_stamp_format_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(file_hdl->time_stamp_format.getInheritedValue(), time_stamp_format, time_stamp_format_size))
+      ERROR("void cxios_get_file_time_stamp_format(file_Ptr file_hdl, char * time_stamp_format, int time_stamp_format_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_file_time_stamp_format(file_Ptr file_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = file_hdl->time_stamp_format.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_file_time_stamp_name(file_Ptr file_hdl, const char * time_stamp_name, int time_stamp_name_size)
+  {
+    std::string time_stamp_name_str;
+    if (!cstr2string(time_stamp_name, time_stamp_name_size, time_stamp_name_str)) return;
+    CTimer::get("XIOS").resume();
+    file_hdl->time_stamp_name.setValue(time_stamp_name_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_file_time_stamp_name(file_Ptr file_hdl, char * time_stamp_name, int time_stamp_name_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(file_hdl->time_stamp_name.getInheritedValue(), time_stamp_name, time_stamp_name_size))
+      ERROR("void cxios_get_file_time_stamp_name(file_Ptr file_hdl, char * time_stamp_name, int time_stamp_name_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_file_time_stamp_name(file_Ptr file_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = file_hdl->time_stamp_name.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_file_time_units(file_Ptr file_hdl, const char * time_units, int time_units_size)
+  {
+    std::string time_units_str;
+    if (!cstr2string(time_units, time_units_size, time_units_str)) return;
+    CTimer::get("XIOS").resume();
+    file_hdl->time_units.fromString(time_units_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_file_time_units(file_Ptr file_hdl, char * time_units, int time_units_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(file_hdl->time_units.getInheritedStringValue(), time_units, time_units_size))
+      ERROR("void cxios_get_file_time_units(file_Ptr file_hdl, char * time_units, int time_units_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_file_time_units(file_Ptr file_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = file_hdl->time_units.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_file_timeseries(file_Ptr file_hdl, const char * timeseries, int timeseries_size)
   {
@@ -629,3 +707,55 @@
      return isDefined;
   }
+
+
+  void cxios_set_file_uuid_format(file_Ptr file_hdl, const char * uuid_format, int uuid_format_size)
+  {
+    std::string uuid_format_str;
+    if (!cstr2string(uuid_format, uuid_format_size, uuid_format_str)) return;
+    CTimer::get("XIOS").resume();
+    file_hdl->uuid_format.setValue(uuid_format_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_file_uuid_format(file_Ptr file_hdl, char * uuid_format, int uuid_format_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(file_hdl->uuid_format.getInheritedValue(), uuid_format, uuid_format_size))
+      ERROR("void cxios_get_file_uuid_format(file_Ptr file_hdl, char * uuid_format, int uuid_format_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_file_uuid_format(file_Ptr file_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = file_hdl->uuid_format.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_file_uuid_name(file_Ptr file_hdl, const char * uuid_name, int uuid_name_size)
+  {
+    std::string uuid_name_str;
+    if (!cstr2string(uuid_name, uuid_name_size, uuid_name_str)) return;
+    CTimer::get("XIOS").resume();
+    file_hdl->uuid_name.setValue(uuid_name_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_file_uuid_name(file_Ptr file_hdl, char * uuid_name, int uuid_name_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(file_hdl->uuid_name.getInheritedValue(), uuid_name, uuid_name_size))
+      ERROR("void cxios_get_file_uuid_name(file_Ptr file_hdl, char * uuid_name, int uuid_name_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_file_uuid_name(file_Ptr file_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = file_hdl->uuid_name.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
 }
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icfilegroup_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icfilegroup_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icfilegroup_attr.cpp	(revision 1158)
@@ -579,4 +579,82 @@
 
 
+  void cxios_set_filegroup_time_stamp_format(filegroup_Ptr filegroup_hdl, const char * time_stamp_format, int time_stamp_format_size)
+  {
+    std::string time_stamp_format_str;
+    if (!cstr2string(time_stamp_format, time_stamp_format_size, time_stamp_format_str)) return;
+    CTimer::get("XIOS").resume();
+    filegroup_hdl->time_stamp_format.setValue(time_stamp_format_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_filegroup_time_stamp_format(filegroup_Ptr filegroup_hdl, char * time_stamp_format, int time_stamp_format_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(filegroup_hdl->time_stamp_format.getInheritedValue(), time_stamp_format, time_stamp_format_size))
+      ERROR("void cxios_get_filegroup_time_stamp_format(filegroup_Ptr filegroup_hdl, char * time_stamp_format, int time_stamp_format_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_filegroup_time_stamp_format(filegroup_Ptr filegroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = filegroup_hdl->time_stamp_format.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_filegroup_time_stamp_name(filegroup_Ptr filegroup_hdl, const char * time_stamp_name, int time_stamp_name_size)
+  {
+    std::string time_stamp_name_str;
+    if (!cstr2string(time_stamp_name, time_stamp_name_size, time_stamp_name_str)) return;
+    CTimer::get("XIOS").resume();
+    filegroup_hdl->time_stamp_name.setValue(time_stamp_name_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_filegroup_time_stamp_name(filegroup_Ptr filegroup_hdl, char * time_stamp_name, int time_stamp_name_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(filegroup_hdl->time_stamp_name.getInheritedValue(), time_stamp_name, time_stamp_name_size))
+      ERROR("void cxios_get_filegroup_time_stamp_name(filegroup_Ptr filegroup_hdl, char * time_stamp_name, int time_stamp_name_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_filegroup_time_stamp_name(filegroup_Ptr filegroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = filegroup_hdl->time_stamp_name.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_filegroup_time_units(filegroup_Ptr filegroup_hdl, const char * time_units, int time_units_size)
+  {
+    std::string time_units_str;
+    if (!cstr2string(time_units, time_units_size, time_units_str)) return;
+    CTimer::get("XIOS").resume();
+    filegroup_hdl->time_units.fromString(time_units_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_filegroup_time_units(filegroup_Ptr filegroup_hdl, char * time_units, int time_units_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(filegroup_hdl->time_units.getInheritedStringValue(), time_units, time_units_size))
+      ERROR("void cxios_get_filegroup_time_units(filegroup_Ptr filegroup_hdl, char * time_units, int time_units_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_filegroup_time_units(filegroup_Ptr filegroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = filegroup_hdl->time_units.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_filegroup_timeseries(filegroup_Ptr filegroup_hdl, const char * timeseries, int timeseries_size)
   {
@@ -655,3 +733,55 @@
      return isDefined;
   }
+
+
+  void cxios_set_filegroup_uuid_format(filegroup_Ptr filegroup_hdl, const char * uuid_format, int uuid_format_size)
+  {
+    std::string uuid_format_str;
+    if (!cstr2string(uuid_format, uuid_format_size, uuid_format_str)) return;
+    CTimer::get("XIOS").resume();
+    filegroup_hdl->uuid_format.setValue(uuid_format_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_filegroup_uuid_format(filegroup_Ptr filegroup_hdl, char * uuid_format, int uuid_format_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(filegroup_hdl->uuid_format.getInheritedValue(), uuid_format, uuid_format_size))
+      ERROR("void cxios_get_filegroup_uuid_format(filegroup_Ptr filegroup_hdl, char * uuid_format, int uuid_format_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_filegroup_uuid_format(filegroup_Ptr filegroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = filegroup_hdl->uuid_format.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_filegroup_uuid_name(filegroup_Ptr filegroup_hdl, const char * uuid_name, int uuid_name_size)
+  {
+    std::string uuid_name_str;
+    if (!cstr2string(uuid_name, uuid_name_size, uuid_name_str)) return;
+    CTimer::get("XIOS").resume();
+    filegroup_hdl->uuid_name.setValue(uuid_name_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_filegroup_uuid_name(filegroup_Ptr filegroup_hdl, char * uuid_name, int uuid_name_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(filegroup_hdl->uuid_name.getInheritedValue(), uuid_name, uuid_name_size))
+      ERROR("void cxios_get_filegroup_uuid_name(filegroup_Ptr filegroup_hdl, char * uuid_name, int uuid_name_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_filegroup_uuid_name(filegroup_Ptr filegroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = filegroup_hdl->uuid_name.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
 }
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icinterpolate_domain_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icinterpolate_domain_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icinterpolate_domain_attr.cpp	(revision 1158)
@@ -17,30 +17,4 @@
 {
   typedef xios::CInterpolateDomain* interpolate_domain_Ptr;
-
-  void cxios_set_interpolate_domain_file(interpolate_domain_Ptr interpolate_domain_hdl, const char * file, int file_size)
-  {
-    std::string file_str;
-    if (!cstr2string(file, file_size, file_str)) return;
-    CTimer::get("XIOS").resume();
-    interpolate_domain_hdl->file.setValue(file_str);
-    CTimer::get("XIOS").suspend();
-  }
-
-  void cxios_get_interpolate_domain_file(interpolate_domain_Ptr interpolate_domain_hdl, char * file, int file_size)
-  {
-    CTimer::get("XIOS").resume();
-    if (!string_copy(interpolate_domain_hdl->file.getInheritedValue(), file, file_size))
-      ERROR("void cxios_get_interpolate_domain_file(interpolate_domain_Ptr interpolate_domain_hdl, char * file, int file_size)", << "Input string is too short");
-    CTimer::get("XIOS").suspend();
-  }
-
-  bool cxios_is_defined_interpolate_domain_file(interpolate_domain_Ptr interpolate_domain_hdl)
-  {
-     CTimer::get("XIOS").resume();
-     bool isDefined = interpolate_domain_hdl->file.hasInheritedValue();
-     CTimer::get("XIOS").suspend();
-     return isDefined;
-  }
-
 
   void cxios_set_interpolate_domain_mode(interpolate_domain_Ptr interpolate_domain_hdl, const char * mode, int mode_size)
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icscalar_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icscalar_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icscalar_attr.cpp	(revision 1158)
@@ -65,4 +65,27 @@
      CTimer::get("XIOS").resume();
      bool isDefined = scalar_hdl->name.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
+  void cxios_set_scalar_prec(scalar_Ptr scalar_hdl, int prec)
+  {
+    CTimer::get("XIOS").resume();
+    scalar_hdl->prec.setValue(prec);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_scalar_prec(scalar_Ptr scalar_hdl, int* prec)
+  {
+    CTimer::get("XIOS").resume();
+    *prec = scalar_hdl->prec.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_scalar_prec(scalar_Ptr scalar_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = scalar_hdl->prec.hasInheritedValue();
      CTimer::get("XIOS").suspend();
      return isDefined;
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icscalargroup_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icscalargroup_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icscalargroup_attr.cpp	(revision 1158)
@@ -96,4 +96,27 @@
 
 
+  void cxios_set_scalargroup_prec(scalargroup_Ptr scalargroup_hdl, int prec)
+  {
+    CTimer::get("XIOS").resume();
+    scalargroup_hdl->prec.setValue(prec);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_scalargroup_prec(scalargroup_Ptr scalargroup_hdl, int* prec)
+  {
+    CTimer::get("XIOS").resume();
+    *prec = scalargroup_hdl->prec.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_scalargroup_prec(scalargroup_Ptr scalargroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = scalargroup_hdl->prec.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_scalargroup_scalar_ref(scalargroup_Ptr scalargroup_hdl, const char * scalar_ref, int scalar_ref_size)
   {
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icvariable_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icvariable_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icvariable_attr.cpp	(revision 1158)
@@ -44,4 +44,30 @@
 
 
+  void cxios_set_variable_ts_target(variable_Ptr variable_hdl, const char * ts_target, int ts_target_size)
+  {
+    std::string ts_target_str;
+    if (!cstr2string(ts_target, ts_target_size, ts_target_str)) return;
+    CTimer::get("XIOS").resume();
+    variable_hdl->ts_target.fromString(ts_target_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_variable_ts_target(variable_Ptr variable_hdl, char * ts_target, int ts_target_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(variable_hdl->ts_target.getInheritedStringValue(), ts_target, ts_target_size))
+      ERROR("void cxios_get_variable_ts_target(variable_Ptr variable_hdl, char * ts_target, int ts_target_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_variable_ts_target(variable_Ptr variable_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = variable_hdl->ts_target.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_variable_type(variable_Ptr variable_hdl, const char * type, int type_size)
   {
Index: /XIOS/dev/dev_olga/src/interface/c_attr/icvariablegroup_attr.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/interface/c_attr/icvariablegroup_attr.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/c_attr/icvariablegroup_attr.cpp	(revision 1158)
@@ -70,4 +70,30 @@
 
 
+  void cxios_set_variablegroup_ts_target(variablegroup_Ptr variablegroup_hdl, const char * ts_target, int ts_target_size)
+  {
+    std::string ts_target_str;
+    if (!cstr2string(ts_target, ts_target_size, ts_target_str)) return;
+    CTimer::get("XIOS").resume();
+    variablegroup_hdl->ts_target.fromString(ts_target_str);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_variablegroup_ts_target(variablegroup_Ptr variablegroup_hdl, char * ts_target, int ts_target_size)
+  {
+    CTimer::get("XIOS").resume();
+    if (!string_copy(variablegroup_hdl->ts_target.getInheritedStringValue(), ts_target, ts_target_size))
+      ERROR("void cxios_get_variablegroup_ts_target(variablegroup_Ptr variablegroup_hdl, char * ts_target, int ts_target_size)", << "Input string is too short");
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_variablegroup_ts_target(variablegroup_Ptr variablegroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = variablegroup_hdl->ts_target.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_variablegroup_type(variablegroup_Ptr variablegroup_hdl, const char * type, int type_size)
   {
Index: /XIOS/dev/dev_olga/src/interface/fortran/field_interface.f90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran/field_interface.f90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran/field_interface.f90	(revision 1158)
@@ -18,7 +18,8 @@
       END SUBROUTINE cxios_field_valid_id
 
-      SUBROUTINE cxios_field_is_active(field_hdl, ret) BIND(C)
+      SUBROUTINE cxios_field_is_active(field_hdl, at_current_timestep, ret) BIND(C)
          USE ISO_C_BINDING
          INTEGER  (kind = C_INTPTR_T), VALUE        :: field_hdl
+         LOGICAL  (kind = C_BOOL), VALUE            :: at_current_timestep
          LOGICAL  (kind = C_BOOL)                   :: ret
       END SUBROUTINE cxios_field_is_active
Index: /XIOS/dev/dev_olga/src/interface/fortran/idata.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran/idata.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran/idata.F90	(revision 1158)
@@ -8,5 +8,4 @@
 
       SUBROUTINE  cxios_init_server() BIND(C)
-         USE ISO_C_BINDING
       END SUBROUTINE cxios_init_server
 
@@ -454,5 +453,5 @@
    SUBROUTINE  xios(init_server)()
    IMPLICIT NONE
-       CALL cxios_init_server()
+     CALL cxios_init_server()
    END SUBROUTINE xios(init_server)
 
Index: /XIOS/dev/dev_olga/src/interface/fortran/ifield.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran/ifield.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran/ifield.F90	(revision 1158)
@@ -142,26 +142,32 @@
    END FUNCTION  xios(is_valid_fieldgroup)
    
-  LOGICAL FUNCTION xios(field_is_active_id(field_id))
+  LOGICAL FUNCTION xios(field_is_active_id)(field_id, at_current_timestep_arg)
       IMPLICIT NONE
-      CHARACTER(len  = *)    , INTENT(IN) :: field_id
-      LOGICAL  (kind = 1)                 :: val
-      TYPE(txios(field))                 :: field_hdl
-      
+      CHARACTER(len  = *) , INTENT(IN) :: field_id
+      LOGICAL, OPTIONAL   , INTENT(IN) :: at_current_timestep_arg
+      TYPE(txios(field))               :: field_hdl
+
       CALL xios(get_field_handle)(field_id,field_hdl)
-      xios(field_is_active_id)=xios(field_is_active_hdl(field_hdl))
+      xios(field_is_active_id) = xios(field_is_active_hdl)(field_hdl, at_current_timestep_arg)
 
-   END FUNCTION  xios(field_is_active_id)
-   
-   
-   LOGICAL FUNCTION xios(field_is_active_hdl(field_hdl))
+   END FUNCTION xios(field_is_active_id)
+
+   LOGICAL FUNCTION xios(field_is_active_hdl)(field_hdl, at_current_timestep_arg)
       IMPLICIT NONE
-      TYPE(txios(field)),INTENT(IN)       :: field_hdl
-      LOGICAL  (kind = 1)                 :: ret
-      
-      CALL cxios_field_is_active(field_hdl%daddr, ret);
+      TYPE(txios(field)) , INTENT(IN) :: field_hdl
+      LOGICAL, OPTIONAL  , INTENT(IN) :: at_current_timestep_arg
+      LOGICAL(kind = C_BOOL)          :: at_current_timestep
+      LOGICAL(kind = C_BOOL)          :: ret
+
+      IF (PRESENT(at_current_timestep_arg)) THEN
+         at_current_timestep = at_current_timestep_arg
+      ELSE
+         at_current_timestep = .FALSE.
+      ENDIF
+
+      CALL cxios_field_is_active(field_hdl%daddr, at_current_timestep, ret);
       xios(field_is_active_hdl) = ret
       
-   END FUNCTION  xios(field_is_active_hdl) 
+   END FUNCTION xios(field_is_active_hdl)
  
-
 END MODULE IFIELD
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/axis_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/axis_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/axis_interface_attr.F90	(revision 1158)
@@ -151,4 +151,28 @@
 
 
+    SUBROUTINE cxios_set_axis_label(axis_hdl, label, str_len, str_size, extent) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE       :: axis_hdl
+      CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: label
+      INTEGER (kind = C_INT), VALUE            :: str_len
+      INTEGER (kind = C_INT), DIMENSION(*)     :: str_size
+      INTEGER (kind = C_INT), DIMENSION(*)     :: extent
+    END SUBROUTINE cxios_set_axis_label
+
+    SUBROUTINE cxios_get_axis_label(axis_hdl, label, str_size, extent) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE       :: axis_hdl
+      CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: label
+      INTEGER (kind = C_INT), VALUE            :: str_size
+      INTEGER (kind = C_INT), DIMENSION(*)     :: extent
+    END SUBROUTINE cxios_get_axis_label
+
+    FUNCTION cxios_is_defined_axis_label(axis_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_label
+      INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl
+    END FUNCTION cxios_is_defined_axis_label
+
+
     SUBROUTINE cxios_set_axis_long_name(axis_hdl, long_name, long_name_size) BIND(C)
       USE ISO_C_BINDING
@@ -292,4 +316,23 @@
 
 
+    SUBROUTINE cxios_set_axis_prec(axis_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl
+      INTEGER (KIND=C_INT)      , VALUE :: prec
+    END SUBROUTINE cxios_set_axis_prec
+
+    SUBROUTINE cxios_get_axis_prec(axis_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl
+      INTEGER (KIND=C_INT)             :: prec
+    END SUBROUTINE cxios_get_axis_prec
+
+    FUNCTION cxios_is_defined_axis_prec(axis_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_axis_prec
+      INTEGER (kind = C_INTPTR_T), VALUE :: axis_hdl
+    END FUNCTION cxios_is_defined_axis_prec
+
+
     SUBROUTINE cxios_set_axis_standard_name(axis_hdl, standard_name, standard_name_size) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/axisgroup_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/axisgroup_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/axisgroup_interface_attr.F90	(revision 1158)
@@ -172,4 +172,28 @@
 
 
+    SUBROUTINE cxios_set_axisgroup_label(axisgroup_hdl, label, str_len, str_size, extent) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE       :: axisgroup_hdl
+      CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: label
+      INTEGER (kind = C_INT), VALUE            :: str_len
+      INTEGER (kind = C_INT), DIMENSION(*)     :: str_size
+      INTEGER (kind = C_INT), DIMENSION(*)     :: extent
+    END SUBROUTINE cxios_set_axisgroup_label
+
+    SUBROUTINE cxios_get_axisgroup_label(axisgroup_hdl, label, str_size, extent) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE       :: axisgroup_hdl
+      CHARACTER (KIND=C_CHAR), DIMENSION(*)    :: label
+      INTEGER (kind = C_INT), VALUE            :: str_size
+      INTEGER (kind = C_INT), DIMENSION(*)     :: extent
+    END SUBROUTINE cxios_get_axisgroup_label
+
+    FUNCTION cxios_is_defined_axisgroup_label(axisgroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_label
+      INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl
+    END FUNCTION cxios_is_defined_axisgroup_label
+
+
     SUBROUTINE cxios_set_axisgroup_long_name(axisgroup_hdl, long_name, long_name_size) BIND(C)
       USE ISO_C_BINDING
@@ -313,4 +337,23 @@
 
 
+    SUBROUTINE cxios_set_axisgroup_prec(axisgroup_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl
+      INTEGER (KIND=C_INT)      , VALUE :: prec
+    END SUBROUTINE cxios_set_axisgroup_prec
+
+    SUBROUTINE cxios_get_axisgroup_prec(axisgroup_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl
+      INTEGER (KIND=C_INT)             :: prec
+    END SUBROUTINE cxios_get_axisgroup_prec
+
+    FUNCTION cxios_is_defined_axisgroup_prec(axisgroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_axisgroup_prec
+      INTEGER (kind = C_INTPTR_T), VALUE :: axisgroup_hdl
+    END FUNCTION cxios_is_defined_axisgroup_prec
+
+
     SUBROUTINE cxios_set_axisgroup_standard_name(axisgroup_hdl, standard_name, standard_name_size) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/domain_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/domain_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/domain_interface_attr.F90	(revision 1158)
@@ -616,4 +616,23 @@
 
 
+    SUBROUTINE cxios_set_domain_prec(domain_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl
+      INTEGER (KIND=C_INT)      , VALUE :: prec
+    END SUBROUTINE cxios_set_domain_prec
+
+    SUBROUTINE cxios_get_domain_prec(domain_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl
+      INTEGER (KIND=C_INT)             :: prec
+    END SUBROUTINE cxios_get_domain_prec
+
+    FUNCTION cxios_is_defined_domain_prec(domain_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_domain_prec
+      INTEGER (kind = C_INTPTR_T), VALUE :: domain_hdl
+    END FUNCTION cxios_is_defined_domain_prec
+
+
     SUBROUTINE cxios_set_domain_standard_name(domain_hdl, standard_name, standard_name_size) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/domaingroup_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/domaingroup_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/domaingroup_interface_attr.F90	(revision 1158)
@@ -637,4 +637,23 @@
 
 
+    SUBROUTINE cxios_set_domaingroup_prec(domaingroup_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl
+      INTEGER (KIND=C_INT)      , VALUE :: prec
+    END SUBROUTINE cxios_set_domaingroup_prec
+
+    SUBROUTINE cxios_get_domaingroup_prec(domaingroup_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl
+      INTEGER (KIND=C_INT)             :: prec
+    END SUBROUTINE cxios_get_domaingroup_prec
+
+    FUNCTION cxios_is_defined_domaingroup_prec(domaingroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_domaingroup_prec
+      INTEGER (kind = C_INTPTR_T), VALUE :: domaingroup_hdl
+    END FUNCTION cxios_is_defined_domaingroup_prec
+
+
     SUBROUTINE cxios_set_domaingroup_standard_name(domaingroup_hdl, standard_name, standard_name_size) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/expand_domain_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/expand_domain_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/expand_domain_interface_attr.F90	(revision 1158)
@@ -9,4 +9,42 @@
   INTERFACE
     ! Do not call directly / interface FORTRAN 2003 <-> C99
+
+    SUBROUTINE cxios_set_expand_domain_i_periodic(expand_domain_hdl, i_periodic) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: expand_domain_hdl
+      LOGICAL (KIND=C_BOOL)      , VALUE :: i_periodic
+    END SUBROUTINE cxios_set_expand_domain_i_periodic
+
+    SUBROUTINE cxios_get_expand_domain_i_periodic(expand_domain_hdl, i_periodic) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: expand_domain_hdl
+      LOGICAL (KIND=C_BOOL)             :: i_periodic
+    END SUBROUTINE cxios_get_expand_domain_i_periodic
+
+    FUNCTION cxios_is_defined_expand_domain_i_periodic(expand_domain_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_expand_domain_i_periodic
+      INTEGER (kind = C_INTPTR_T), VALUE :: expand_domain_hdl
+    END FUNCTION cxios_is_defined_expand_domain_i_periodic
+
+
+    SUBROUTINE cxios_set_expand_domain_j_periodic(expand_domain_hdl, j_periodic) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: expand_domain_hdl
+      LOGICAL (KIND=C_BOOL)      , VALUE :: j_periodic
+    END SUBROUTINE cxios_set_expand_domain_j_periodic
+
+    SUBROUTINE cxios_get_expand_domain_j_periodic(expand_domain_hdl, j_periodic) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: expand_domain_hdl
+      LOGICAL (KIND=C_BOOL)             :: j_periodic
+    END SUBROUTINE cxios_get_expand_domain_j_periodic
+
+    FUNCTION cxios_is_defined_expand_domain_j_periodic(expand_domain_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_expand_domain_j_periodic
+      INTEGER (kind = C_INTPTR_T), VALUE :: expand_domain_hdl
+    END FUNCTION cxios_is_defined_expand_domain_j_periodic
+
 
     SUBROUTINE cxios_set_expand_domain_order(expand_domain_hdl, order) BIND(C)
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/file_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/file_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/file_interface_attr.F90	(revision 1158)
@@ -416,4 +416,67 @@
 
 
+    SUBROUTINE cxios_set_file_time_stamp_format(file_hdl, time_stamp_format, time_stamp_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_format
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_format_size
+    END SUBROUTINE cxios_set_file_time_stamp_format
+
+    SUBROUTINE cxios_get_file_time_stamp_format(file_hdl, time_stamp_format, time_stamp_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_format
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_format_size
+    END SUBROUTINE cxios_get_file_time_stamp_format
+
+    FUNCTION cxios_is_defined_file_time_stamp_format(file_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_time_stamp_format
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+    END FUNCTION cxios_is_defined_file_time_stamp_format
+
+
+    SUBROUTINE cxios_set_file_time_stamp_name(file_hdl, time_stamp_name, time_stamp_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_name
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_name_size
+    END SUBROUTINE cxios_set_file_time_stamp_name
+
+    SUBROUTINE cxios_get_file_time_stamp_name(file_hdl, time_stamp_name, time_stamp_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_name
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_name_size
+    END SUBROUTINE cxios_get_file_time_stamp_name
+
+    FUNCTION cxios_is_defined_file_time_stamp_name(file_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_time_stamp_name
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+    END FUNCTION cxios_is_defined_file_time_stamp_name
+
+
+    SUBROUTINE cxios_set_file_time_units(file_hdl, time_units, time_units_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_units
+      INTEGER  (kind = C_INT)     , VALUE        :: time_units_size
+    END SUBROUTINE cxios_set_file_time_units
+
+    SUBROUTINE cxios_get_file_time_units(file_hdl, time_units, time_units_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_units
+      INTEGER  (kind = C_INT)     , VALUE        :: time_units_size
+    END SUBROUTINE cxios_get_file_time_units
+
+    FUNCTION cxios_is_defined_file_time_units(file_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_time_units
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+    END FUNCTION cxios_is_defined_file_time_units
+
+
     SUBROUTINE cxios_set_file_timeseries(file_hdl, timeseries, timeseries_size) BIND(C)
       USE ISO_C_BINDING
@@ -478,4 +541,46 @@
     END FUNCTION cxios_is_defined_file_type
 
+
+    SUBROUTINE cxios_set_file_uuid_format(file_hdl, uuid_format, uuid_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_format
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_format_size
+    END SUBROUTINE cxios_set_file_uuid_format
+
+    SUBROUTINE cxios_get_file_uuid_format(file_hdl, uuid_format, uuid_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_format
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_format_size
+    END SUBROUTINE cxios_get_file_uuid_format
+
+    FUNCTION cxios_is_defined_file_uuid_format(file_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_uuid_format
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+    END FUNCTION cxios_is_defined_file_uuid_format
+
+
+    SUBROUTINE cxios_set_file_uuid_name(file_hdl, uuid_name, uuid_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_name
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_name_size
+    END SUBROUTINE cxios_set_file_uuid_name
+
+    SUBROUTINE cxios_get_file_uuid_name(file_hdl, uuid_name, uuid_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_name
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_name_size
+    END SUBROUTINE cxios_get_file_uuid_name
+
+    FUNCTION cxios_is_defined_file_uuid_name(file_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_file_uuid_name
+      INTEGER (kind = C_INTPTR_T), VALUE :: file_hdl
+    END FUNCTION cxios_is_defined_file_uuid_name
+
   END INTERFACE
 
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/filegroup_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/filegroup_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/filegroup_interface_attr.F90	(revision 1158)
@@ -437,4 +437,67 @@
 
 
+    SUBROUTINE cxios_set_filegroup_time_stamp_format(filegroup_hdl, time_stamp_format, time_stamp_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_format
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_format_size
+    END SUBROUTINE cxios_set_filegroup_time_stamp_format
+
+    SUBROUTINE cxios_get_filegroup_time_stamp_format(filegroup_hdl, time_stamp_format, time_stamp_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_format
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_format_size
+    END SUBROUTINE cxios_get_filegroup_time_stamp_format
+
+    FUNCTION cxios_is_defined_filegroup_time_stamp_format(filegroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_time_stamp_format
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+    END FUNCTION cxios_is_defined_filegroup_time_stamp_format
+
+
+    SUBROUTINE cxios_set_filegroup_time_stamp_name(filegroup_hdl, time_stamp_name, time_stamp_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_name
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_name_size
+    END SUBROUTINE cxios_set_filegroup_time_stamp_name
+
+    SUBROUTINE cxios_get_filegroup_time_stamp_name(filegroup_hdl, time_stamp_name, time_stamp_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_stamp_name
+      INTEGER  (kind = C_INT)     , VALUE        :: time_stamp_name_size
+    END SUBROUTINE cxios_get_filegroup_time_stamp_name
+
+    FUNCTION cxios_is_defined_filegroup_time_stamp_name(filegroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_time_stamp_name
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+    END FUNCTION cxios_is_defined_filegroup_time_stamp_name
+
+
+    SUBROUTINE cxios_set_filegroup_time_units(filegroup_hdl, time_units, time_units_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_units
+      INTEGER  (kind = C_INT)     , VALUE        :: time_units_size
+    END SUBROUTINE cxios_set_filegroup_time_units
+
+    SUBROUTINE cxios_get_filegroup_time_units(filegroup_hdl, time_units, time_units_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: time_units
+      INTEGER  (kind = C_INT)     , VALUE        :: time_units_size
+    END SUBROUTINE cxios_get_filegroup_time_units
+
+    FUNCTION cxios_is_defined_filegroup_time_units(filegroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_time_units
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+    END FUNCTION cxios_is_defined_filegroup_time_units
+
+
     SUBROUTINE cxios_set_filegroup_timeseries(filegroup_hdl, timeseries, timeseries_size) BIND(C)
       USE ISO_C_BINDING
@@ -499,4 +562,46 @@
     END FUNCTION cxios_is_defined_filegroup_type
 
+
+    SUBROUTINE cxios_set_filegroup_uuid_format(filegroup_hdl, uuid_format, uuid_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_format
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_format_size
+    END SUBROUTINE cxios_set_filegroup_uuid_format
+
+    SUBROUTINE cxios_get_filegroup_uuid_format(filegroup_hdl, uuid_format, uuid_format_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_format
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_format_size
+    END SUBROUTINE cxios_get_filegroup_uuid_format
+
+    FUNCTION cxios_is_defined_filegroup_uuid_format(filegroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_uuid_format
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+    END FUNCTION cxios_is_defined_filegroup_uuid_format
+
+
+    SUBROUTINE cxios_set_filegroup_uuid_name(filegroup_hdl, uuid_name, uuid_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_name
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_name_size
+    END SUBROUTINE cxios_set_filegroup_uuid_name
+
+    SUBROUTINE cxios_get_filegroup_uuid_name(filegroup_hdl, uuid_name, uuid_name_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: uuid_name
+      INTEGER  (kind = C_INT)     , VALUE        :: uuid_name_size
+    END SUBROUTINE cxios_get_filegroup_uuid_name
+
+    FUNCTION cxios_is_defined_filegroup_uuid_name(filegroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_filegroup_uuid_name
+      INTEGER (kind = C_INTPTR_T), VALUE :: filegroup_hdl
+    END FUNCTION cxios_is_defined_filegroup_uuid_name
+
   END INTERFACE
 
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/iaxis_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/iaxis_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/iaxis_attr.F90	(revision 1158)
@@ -12,6 +12,7 @@
 
   SUBROUTINE xios(set_axis_attr)  &
-    ( axis_id, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask, n  &
-    , n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axis_id, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+    , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -25,4 +26,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: data_n
       INTEGER  , OPTIONAL, INTENT(IN) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       LOGICAL  , OPTIONAL, INTENT(IN) :: mask(:)
@@ -33,4 +35,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit
@@ -40,12 +43,14 @@
       (axis_id,axis_hdl)
       CALL xios(set_axis_attr_hdl_)   &
-      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-      , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+      , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(set_axis_attr)
 
   SUBROUTINE xios(set_axis_attr_hdl)  &
-    ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-    , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+    , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -58,4 +63,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: data_n
       INTEGER  , OPTIONAL, INTENT(IN) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       LOGICAL  , OPTIONAL, INTENT(IN) :: mask(:)
@@ -66,4 +72,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit
@@ -71,13 +78,14 @@
 
       CALL xios(set_axis_attr_hdl_)  &
-      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-      , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+      , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(set_axis_attr_hdl)
 
   SUBROUTINE xios(set_axis_attr_hdl_)   &
-    ( axis_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, index_, long_name_  &
-    , mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, standard_name_, unit_, value_  &
-     )
+    ( axis_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, index_, label_, long_name_  &
+    , mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, prec_, standard_name_, unit_  &
+    , value_ )
 
     IMPLICIT NONE
@@ -90,4 +98,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: data_n_
       INTEGER  , OPTIONAL, INTENT(IN) :: index_(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: label_(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_
       LOGICAL  , OPTIONAL, INTENT(IN) :: mask_(:)
@@ -98,4 +107,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive_
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit_
@@ -135,4 +145,9 @@
         CALL cxios_set_axis_index &
       (axis_hdl%daddr, index_, SHAPE(index_))
+      ENDIF
+
+      IF (PRESENT(label_)) THEN
+        CALL cxios_set_axis_label &
+      (axis_hdl%daddr, label_, LEN(label_), LEN_TRIM(label_), SHAPE(label_))
       ENDIF
 
@@ -174,4 +189,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_set_axis_prec &
+      (axis_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_set_axis_standard_name &
@@ -192,6 +212,7 @@
 
   SUBROUTINE xios(get_axis_attr)  &
-    ( axis_id, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask, n  &
-    , n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axis_id, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+    , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -205,4 +226,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: data_n
       INTEGER  , OPTIONAL, INTENT(OUT) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL  , OPTIONAL, INTENT(OUT) :: mask(:)
@@ -213,4 +235,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit
@@ -220,12 +243,14 @@
       (axis_id,axis_hdl)
       CALL xios(get_axis_attr_hdl_)   &
-      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-      , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+      , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(get_axis_attr)
 
   SUBROUTINE xios(get_axis_attr_hdl)  &
-    ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-    , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+    , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -238,4 +263,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: data_n
       INTEGER  , OPTIONAL, INTENT(OUT) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL  , OPTIONAL, INTENT(OUT) :: mask(:)
@@ -246,4 +272,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit
@@ -251,13 +278,14 @@
 
       CALL xios(get_axis_attr_hdl_)  &
-      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-      , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+      , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(get_axis_attr_hdl)
 
   SUBROUTINE xios(get_axis_attr_hdl_)   &
-    ( axis_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, index_, long_name_  &
-    , mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, standard_name_, unit_, value_  &
-     )
+    ( axis_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, index_, label_, long_name_  &
+    , mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, prec_, standard_name_, unit_  &
+    , value_ )
 
     IMPLICIT NONE
@@ -270,4 +298,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: data_n_
       INTEGER  , OPTIONAL, INTENT(OUT) :: index_(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: label_(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_
       LOGICAL  , OPTIONAL, INTENT(OUT) :: mask_(:)
@@ -278,4 +307,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive_
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit_
@@ -315,4 +345,9 @@
         CALL cxios_get_axis_index &
       (axis_hdl%daddr, index_, SHAPE(index_))
+      ENDIF
+
+      IF (PRESENT(label_)) THEN
+        CALL cxios_get_axis_label &
+      (axis_hdl%daddr, label_, LEN(label_), SHAPE(label_))
       ENDIF
 
@@ -354,4 +389,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_get_axis_prec &
+      (axis_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_get_axis_standard_name &
@@ -372,6 +412,7 @@
 
   SUBROUTINE xios(is_defined_axis_attr)  &
-    ( axis_id, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask, n  &
-    , n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axis_id, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+    , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -392,4 +433,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: index
       LOGICAL(KIND=C_BOOL) :: index_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: label
+      LOGICAL(KIND=C_BOOL) :: label_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL(KIND=C_BOOL) :: long_name_tmp
@@ -406,4 +449,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: positive
       LOGICAL(KIND=C_BOOL) :: positive_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -416,12 +461,14 @@
       (axis_id,axis_hdl)
       CALL xios(is_defined_axis_attr_hdl_)   &
-      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-      , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+      , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(is_defined_axis_attr)
 
   SUBROUTINE xios(is_defined_axis_attr_hdl)  &
-    ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-    , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+    , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -441,4 +488,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: index
       LOGICAL(KIND=C_BOOL) :: index_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: label
+      LOGICAL(KIND=C_BOOL) :: label_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL(KIND=C_BOOL) :: long_name_tmp
@@ -455,4 +504,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: positive
       LOGICAL(KIND=C_BOOL) :: positive_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -463,13 +514,14 @@
 
       CALL xios(is_defined_axis_attr_hdl_)  &
-      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, long_name, mask  &
-      , n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axis_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, index, label, long_name  &
+      , mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(is_defined_axis_attr_hdl)
 
   SUBROUTINE xios(is_defined_axis_attr_hdl_)   &
-    ( axis_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, index_, long_name_  &
-    , mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, standard_name_, unit_, value_  &
-     )
+    ( axis_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, index_, label_, long_name_  &
+    , mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, prec_, standard_name_, unit_  &
+    , value_ )
 
     IMPLICIT NONE
@@ -489,4 +541,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: index_
       LOGICAL(KIND=C_BOOL) :: index__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: label_
+      LOGICAL(KIND=C_BOOL) :: label__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_
       LOGICAL(KIND=C_BOOL) :: long_name__tmp
@@ -503,4 +557,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: positive_
       LOGICAL(KIND=C_BOOL) :: positive__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL(KIND=C_BOOL) :: prec__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_
       LOGICAL(KIND=C_BOOL) :: standard_name__tmp
@@ -552,4 +608,10 @@
       ENDIF
 
+      IF (PRESENT(label_)) THEN
+        label__tmp = cxios_is_defined_axis_label &
+      (axis_hdl%daddr)
+        label_ = label__tmp
+      ENDIF
+
       IF (PRESENT(long_name_)) THEN
         long_name__tmp = cxios_is_defined_axis_long_name &
@@ -594,4 +656,10 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        prec__tmp = cxios_is_defined_axis_prec &
+      (axis_hdl%daddr)
+        prec_ = prec__tmp
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         standard_name__tmp = cxios_is_defined_axis_standard_name &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/iaxisgroup_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/iaxisgroup_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/iaxisgroup_attr.F90	(revision 1158)
@@ -12,6 +12,7 @@
 
   SUBROUTINE xios(set_axisgroup_attr)  &
-    ( axisgroup_id, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-    , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axisgroup_id, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+    , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+    , value )
 
     IMPLICIT NONE
@@ -26,4 +27,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref
       INTEGER  , OPTIONAL, INTENT(IN) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       LOGICAL  , OPTIONAL, INTENT(IN) :: mask(:)
@@ -34,4 +36,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit
@@ -41,12 +44,14 @@
       (axisgroup_id,axisgroup_hdl)
       CALL xios(set_axisgroup_attr_hdl_)   &
-      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-      , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+      , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+      , value )
 
   END SUBROUTINE xios(set_axisgroup_attr)
 
   SUBROUTINE xios(set_axisgroup_attr_hdl)  &
-    ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-    , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+    , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+    , value )
 
     IMPLICIT NONE
@@ -60,4 +65,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref
       INTEGER  , OPTIONAL, INTENT(IN) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       LOGICAL  , OPTIONAL, INTENT(IN) :: mask(:)
@@ -68,4 +74,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit
@@ -73,6 +80,7 @@
 
       CALL xios(set_axisgroup_attr_hdl_)  &
-      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-      , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+      , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+      , value )
 
   END SUBROUTINE xios(set_axisgroup_attr_hdl)
@@ -80,5 +88,5 @@
   SUBROUTINE xios(set_axisgroup_attr_hdl_)   &
     ( axisgroup_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, group_ref_, index_  &
-    , long_name_, mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, standard_name_  &
+    , label_, long_name_, mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, prec_, standard_name_  &
     , unit_, value_ )
 
@@ -93,4 +101,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_
       INTEGER  , OPTIONAL, INTENT(IN) :: index_(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(IN) :: label_(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_
       LOGICAL  , OPTIONAL, INTENT(IN) :: mask_(:)
@@ -101,4 +110,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: positive_
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: unit_
@@ -143,4 +153,9 @@
         CALL cxios_set_axisgroup_index &
       (axisgroup_hdl%daddr, index_, SHAPE(index_))
+      ENDIF
+
+      IF (PRESENT(label_)) THEN
+        CALL cxios_set_axisgroup_label &
+      (axisgroup_hdl%daddr, label_, LEN(label_), LEN_TRIM(label_), SHAPE(label_))
       ENDIF
 
@@ -182,4 +197,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_set_axisgroup_prec &
+      (axisgroup_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_set_axisgroup_standard_name &
@@ -200,6 +220,7 @@
 
   SUBROUTINE xios(get_axisgroup_attr)  &
-    ( axisgroup_id, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-    , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axisgroup_id, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+    , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+    , value )
 
     IMPLICIT NONE
@@ -214,4 +235,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref
       INTEGER  , OPTIONAL, INTENT(OUT) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL  , OPTIONAL, INTENT(OUT) :: mask(:)
@@ -222,4 +244,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit
@@ -229,12 +252,14 @@
       (axisgroup_id,axisgroup_hdl)
       CALL xios(get_axisgroup_attr_hdl_)   &
-      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-      , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+      , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+      , value )
 
   END SUBROUTINE xios(get_axisgroup_attr)
 
   SUBROUTINE xios(get_axisgroup_attr_hdl)  &
-    ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-    , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+    , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+    , value )
 
     IMPLICIT NONE
@@ -248,4 +273,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref
       INTEGER  , OPTIONAL, INTENT(OUT) :: index(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: label(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL  , OPTIONAL, INTENT(OUT) :: mask(:)
@@ -256,4 +282,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit
@@ -261,6 +288,7 @@
 
       CALL xios(get_axisgroup_attr_hdl_)  &
-      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-      , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+      , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+      , value )
 
   END SUBROUTINE xios(get_axisgroup_attr_hdl)
@@ -268,5 +296,5 @@
   SUBROUTINE xios(get_axisgroup_attr_hdl_)   &
     ( axisgroup_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, group_ref_, index_  &
-    , long_name_, mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, standard_name_  &
+    , label_, long_name_, mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, prec_, standard_name_  &
     , unit_, value_ )
 
@@ -281,4 +309,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_
       INTEGER  , OPTIONAL, INTENT(OUT) :: index_(:)
+      CHARACTER(len=*) , OPTIONAL, INTENT(OUT) :: label_(:)
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_
       LOGICAL  , OPTIONAL, INTENT(OUT) :: mask_(:)
@@ -289,4 +318,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: positive_
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: unit_
@@ -331,4 +361,9 @@
         CALL cxios_get_axisgroup_index &
       (axisgroup_hdl%daddr, index_, SHAPE(index_))
+      ENDIF
+
+      IF (PRESENT(label_)) THEN
+        CALL cxios_get_axisgroup_label &
+      (axisgroup_hdl%daddr, label_, LEN(label_), SHAPE(label_))
       ENDIF
 
@@ -370,4 +405,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_get_axisgroup_prec &
+      (axisgroup_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_get_axisgroup_standard_name &
@@ -388,6 +428,7 @@
 
   SUBROUTINE xios(is_defined_axisgroup_attr)  &
-    ( axisgroup_id, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-    , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axisgroup_id, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+    , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+    , value )
 
     IMPLICIT NONE
@@ -410,4 +451,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: index
       LOGICAL(KIND=C_BOOL) :: index_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: label
+      LOGICAL(KIND=C_BOOL) :: label_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL(KIND=C_BOOL) :: long_name_tmp
@@ -424,4 +467,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: positive
       LOGICAL(KIND=C_BOOL) :: positive_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -434,12 +479,14 @@
       (axisgroup_id,axisgroup_hdl)
       CALL xios(is_defined_axisgroup_attr_hdl_)   &
-      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-      , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+      , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+      , value )
 
   END SUBROUTINE xios(is_defined_axisgroup_attr)
 
   SUBROUTINE xios(is_defined_axisgroup_attr_hdl)  &
-    ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-    , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+    ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+    , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+    , value )
 
     IMPLICIT NONE
@@ -461,4 +508,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: index
       LOGICAL(KIND=C_BOOL) :: index_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: label
+      LOGICAL(KIND=C_BOOL) :: label_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: long_name
       LOGICAL(KIND=C_BOOL) :: long_name_tmp
@@ -475,4 +524,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: positive
       LOGICAL(KIND=C_BOOL) :: positive_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -483,6 +534,7 @@
 
       CALL xios(is_defined_axisgroup_attr_hdl_)  &
-      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, long_name  &
-      , mask, n, n_distributed_partition, n_glo, name, positive, standard_name, unit, value )
+      ( axisgroup_hdl, axis_ref, begin, bounds, data_begin, data_index, data_n, group_ref, index, label  &
+      , long_name, mask, n, n_distributed_partition, n_glo, name, positive, prec, standard_name, unit  &
+      , value )
 
   END SUBROUTINE xios(is_defined_axisgroup_attr_hdl)
@@ -490,5 +542,5 @@
   SUBROUTINE xios(is_defined_axisgroup_attr_hdl_)   &
     ( axisgroup_hdl, axis_ref_, begin_, bounds_, data_begin_, data_index_, data_n_, group_ref_, index_  &
-    , long_name_, mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, standard_name_  &
+    , label_, long_name_, mask_, n_, n_distributed_partition_, n_glo_, name_, positive_, prec_, standard_name_  &
     , unit_, value_ )
 
@@ -511,4 +563,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: index_
       LOGICAL(KIND=C_BOOL) :: index__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: label_
+      LOGICAL(KIND=C_BOOL) :: label__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: long_name_
       LOGICAL(KIND=C_BOOL) :: long_name__tmp
@@ -525,4 +579,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: positive_
       LOGICAL(KIND=C_BOOL) :: positive__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL(KIND=C_BOOL) :: prec__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_
       LOGICAL(KIND=C_BOOL) :: standard_name__tmp
@@ -580,4 +636,10 @@
       ENDIF
 
+      IF (PRESENT(label_)) THEN
+        label__tmp = cxios_is_defined_axisgroup_label &
+      (axisgroup_hdl%daddr)
+        label_ = label__tmp
+      ENDIF
+
       IF (PRESENT(long_name_)) THEN
         long_name__tmp = cxios_is_defined_axisgroup_long_name &
@@ -622,4 +684,10 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        prec__tmp = cxios_is_defined_axisgroup_prec &
+      (axisgroup_hdl%daddr)
+        prec_ = prec__tmp
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         standard_name__tmp = cxios_is_defined_axisgroup_standard_name &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/idomain_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/idomain_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/idomain_attr.F90	(revision 1158)
@@ -15,5 +15,5 @@
     , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
     , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-    , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -52,4 +52,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(IN) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
@@ -61,5 +62,5 @@
       , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
       , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-      , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(set_domain_attr)
@@ -69,5 +70,5 @@
     , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
     , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-    , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -105,4 +106,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(IN) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
@@ -112,5 +114,5 @@
       , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
       , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-      , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(set_domain_attr_hdl)
@@ -120,5 +122,5 @@
     , data_i_index_, data_ibegin_, data_j_index_, data_jbegin_, data_ni_, data_nj_, domain_ref_  &
     , i_index_, ibegin_, j_index_, jbegin_, latvalue_1d_, latvalue_2d_, long_name_, lonvalue_1d_  &
-    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, standard_name_  &
+    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, prec_, standard_name_  &
     , type_ )
 
@@ -157,4 +159,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: nj_glo_
       INTEGER  , OPTIONAL, INTENT(IN) :: nvertex_
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_
@@ -314,4 +317,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_set_domain_prec &
+      (domain_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_set_domain_standard_name &
@@ -330,5 +338,5 @@
     , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
     , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-    , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -367,4 +375,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(OUT) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
@@ -376,5 +385,5 @@
       , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
       , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-      , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(get_domain_attr)
@@ -384,5 +393,5 @@
     , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
     , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-    , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -420,4 +429,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(OUT) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
@@ -427,5 +437,5 @@
       , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
       , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-      , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(get_domain_attr_hdl)
@@ -435,5 +445,5 @@
     , data_i_index_, data_ibegin_, data_j_index_, data_jbegin_, data_ni_, data_nj_, domain_ref_  &
     , i_index_, ibegin_, j_index_, jbegin_, latvalue_1d_, latvalue_2d_, long_name_, lonvalue_1d_  &
-    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, standard_name_  &
+    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, prec_, standard_name_  &
     , type_ )
 
@@ -472,4 +482,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: nj_glo_
       INTEGER  , OPTIONAL, INTENT(OUT) :: nvertex_
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_
@@ -629,4 +640,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_get_domain_prec &
+      (domain_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_get_domain_standard_name &
@@ -645,5 +661,5 @@
     , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
     , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-    , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -710,4 +726,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex
       LOGICAL(KIND=C_BOOL) :: nvertex_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -721,5 +739,5 @@
       , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
       , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-      , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(is_defined_domain_attr)
@@ -729,5 +747,5 @@
     , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
     , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-    , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -793,4 +811,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex
       LOGICAL(KIND=C_BOOL) :: nvertex_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -802,5 +822,5 @@
       , data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, i_index, ibegin, j_index  &
       , jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d, mask_1d, mask_2d, name  &
-      , ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(is_defined_domain_attr_hdl)
@@ -810,5 +830,5 @@
     , data_i_index_, data_ibegin_, data_j_index_, data_jbegin_, data_ni_, data_nj_, domain_ref_  &
     , i_index_, ibegin_, j_index_, jbegin_, latvalue_1d_, latvalue_2d_, long_name_, lonvalue_1d_  &
-    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, standard_name_  &
+    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, prec_, standard_name_  &
     , type_ )
 
@@ -875,4 +895,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex_
       LOGICAL(KIND=C_BOOL) :: nvertex__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL(KIND=C_BOOL) :: prec__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_
       LOGICAL(KIND=C_BOOL) :: standard_name__tmp
@@ -1060,4 +1082,10 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        prec__tmp = cxios_is_defined_domain_prec &
+      (domain_hdl%daddr)
+        prec_ = prec__tmp
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         standard_name__tmp = cxios_is_defined_domain_standard_name &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/idomaingroup_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/idomaingroup_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/idomaingroup_attr.F90	(revision 1158)
@@ -15,5 +15,5 @@
     , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
     , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -53,4 +53,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(IN) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
@@ -62,5 +63,5 @@
       , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
       , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(set_domaingroup_attr)
@@ -70,5 +71,5 @@
     , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
     , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -107,4 +108,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(IN) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
@@ -114,5 +116,5 @@
       , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
       , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(set_domaingroup_attr_hdl)
@@ -122,5 +124,5 @@
     , data_i_index_, data_ibegin_, data_j_index_, data_jbegin_, data_ni_, data_nj_, domain_ref_  &
     , group_ref_, i_index_, ibegin_, j_index_, jbegin_, latvalue_1d_, latvalue_2d_, long_name_, lonvalue_1d_  &
-    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, standard_name_  &
+    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, prec_, standard_name_  &
     , type_ )
 
@@ -160,4 +162,5 @@
       INTEGER  , OPTIONAL, INTENT(IN) :: nj_glo_
       INTEGER  , OPTIONAL, INTENT(IN) :: nvertex_
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_
@@ -322,4 +325,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_set_domaingroup_prec &
+      (domaingroup_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_set_domaingroup_standard_name &
@@ -338,5 +346,5 @@
     , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
     , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -376,4 +384,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(OUT) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
@@ -385,5 +394,5 @@
       , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
       , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(get_domaingroup_attr)
@@ -393,5 +402,5 @@
     , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
     , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -430,4 +439,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: nj_glo
       INTEGER  , OPTIONAL, INTENT(OUT) :: nvertex
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
@@ -437,5 +447,5 @@
       , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
       , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(get_domaingroup_attr_hdl)
@@ -445,5 +455,5 @@
     , data_i_index_, data_ibegin_, data_j_index_, data_jbegin_, data_ni_, data_nj_, domain_ref_  &
     , group_ref_, i_index_, ibegin_, j_index_, jbegin_, latvalue_1d_, latvalue_2d_, long_name_, lonvalue_1d_  &
-    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, standard_name_  &
+    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, prec_, standard_name_  &
     , type_ )
 
@@ -483,4 +493,5 @@
       INTEGER  , OPTIONAL, INTENT(OUT) :: nj_glo_
       INTEGER  , OPTIONAL, INTENT(OUT) :: nvertex_
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_
@@ -645,4 +656,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_get_domaingroup_prec &
+      (domaingroup_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         CALL cxios_get_domaingroup_standard_name &
@@ -661,5 +677,5 @@
     , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
     , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -728,4 +744,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex
       LOGICAL(KIND=C_BOOL) :: nvertex_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -739,5 +757,5 @@
       , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
       , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(is_defined_domaingroup_attr)
@@ -747,5 +765,5 @@
     , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
     , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+    , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
     IMPLICIT NONE
@@ -813,4 +831,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex
       LOGICAL(KIND=C_BOOL) :: nvertex_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name
       LOGICAL(KIND=C_BOOL) :: standard_name_tmp
@@ -822,5 +842,5 @@
       , data_i_index, data_ibegin, data_j_index, data_jbegin, data_ni, data_nj, domain_ref, group_ref  &
       , i_index, ibegin, j_index, jbegin, latvalue_1d, latvalue_2d, long_name, lonvalue_1d, lonvalue_2d  &
-      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, standard_name, type )
+      , mask_1d, mask_2d, name, ni, ni_glo, nj, nj_glo, nvertex, prec, standard_name, type )
 
   END SUBROUTINE xios(is_defined_domaingroup_attr_hdl)
@@ -830,5 +850,5 @@
     , data_i_index_, data_ibegin_, data_j_index_, data_jbegin_, data_ni_, data_nj_, domain_ref_  &
     , group_ref_, i_index_, ibegin_, j_index_, jbegin_, latvalue_1d_, latvalue_2d_, long_name_, lonvalue_1d_  &
-    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, standard_name_  &
+    , lonvalue_2d_, mask_1d_, mask_2d_, name_, ni_, ni_glo_, nj_, nj_glo_, nvertex_, prec_, standard_name_  &
     , type_ )
 
@@ -897,4 +917,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: nvertex_
       LOGICAL(KIND=C_BOOL) :: nvertex__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL(KIND=C_BOOL) :: prec__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: standard_name_
       LOGICAL(KIND=C_BOOL) :: standard_name__tmp
@@ -1088,4 +1110,10 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        prec__tmp = cxios_is_defined_domaingroup_prec &
+      (domaingroup_hdl%daddr)
+        prec_ = prec__tmp
+      ENDIF
+
       IF (PRESENT(standard_name_)) THEN
         standard_name__tmp = cxios_is_defined_domaingroup_standard_name &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/iexpand_domain_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/iexpand_domain_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/iexpand_domain_attr.F90	(revision 1158)
@@ -12,9 +12,13 @@
 
   SUBROUTINE xios(set_expand_domain_attr)  &
-    ( expand_domain_id, order, type )
+    ( expand_domain_id, i_periodic, j_periodic, order, type )
 
     IMPLICIT NONE
       TYPE(txios(expand_domain))  :: expand_domain_hdl
       CHARACTER(LEN=*), INTENT(IN) ::expand_domain_id
+      LOGICAL  , OPTIONAL, INTENT(IN) :: i_periodic
+      LOGICAL (KIND=C_BOOL) :: i_periodic_tmp
+      LOGICAL  , OPTIONAL, INTENT(IN) :: j_periodic
+      LOGICAL (KIND=C_BOOL) :: j_periodic_tmp
       INTEGER  , OPTIONAL, INTENT(IN) :: order
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
@@ -23,28 +27,48 @@
       (expand_domain_id,expand_domain_hdl)
       CALL xios(set_expand_domain_attr_hdl_)   &
-      ( expand_domain_hdl, order, type )
+      ( expand_domain_hdl, i_periodic, j_periodic, order, type )
 
   END SUBROUTINE xios(set_expand_domain_attr)
 
   SUBROUTINE xios(set_expand_domain_attr_hdl)  &
-    ( expand_domain_hdl, order, type )
-
-    IMPLICIT NONE
-      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+    ( expand_domain_hdl, i_periodic, j_periodic, order, type )
+
+    IMPLICIT NONE
+      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+      LOGICAL  , OPTIONAL, INTENT(IN) :: i_periodic
+      LOGICAL (KIND=C_BOOL) :: i_periodic_tmp
+      LOGICAL  , OPTIONAL, INTENT(IN) :: j_periodic
+      LOGICAL (KIND=C_BOOL) :: j_periodic_tmp
       INTEGER  , OPTIONAL, INTENT(IN) :: order
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
 
       CALL xios(set_expand_domain_attr_hdl_)  &
-      ( expand_domain_hdl, order, type )
+      ( expand_domain_hdl, i_periodic, j_periodic, order, type )
 
   END SUBROUTINE xios(set_expand_domain_attr_hdl)
 
   SUBROUTINE xios(set_expand_domain_attr_hdl_)   &
-    ( expand_domain_hdl, order_, type_ )
-
-    IMPLICIT NONE
-      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+    ( expand_domain_hdl, i_periodic_, j_periodic_, order_, type_ )
+
+    IMPLICIT NONE
+      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+      LOGICAL  , OPTIONAL, INTENT(IN) :: i_periodic_
+      LOGICAL (KIND=C_BOOL) :: i_periodic__tmp
+      LOGICAL  , OPTIONAL, INTENT(IN) :: j_periodic_
+      LOGICAL (KIND=C_BOOL) :: j_periodic__tmp
       INTEGER  , OPTIONAL, INTENT(IN) :: order_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_
+
+      IF (PRESENT(i_periodic_)) THEN
+        i_periodic__tmp = i_periodic_
+        CALL cxios_set_expand_domain_i_periodic &
+      (expand_domain_hdl%daddr, i_periodic__tmp)
+      ENDIF
+
+      IF (PRESENT(j_periodic_)) THEN
+        j_periodic__tmp = j_periodic_
+        CALL cxios_set_expand_domain_j_periodic &
+      (expand_domain_hdl%daddr, j_periodic__tmp)
+      ENDIF
 
       IF (PRESENT(order_)) THEN
@@ -61,9 +85,13 @@
 
   SUBROUTINE xios(get_expand_domain_attr)  &
-    ( expand_domain_id, order, type )
+    ( expand_domain_id, i_periodic, j_periodic, order, type )
 
     IMPLICIT NONE
       TYPE(txios(expand_domain))  :: expand_domain_hdl
       CHARACTER(LEN=*), INTENT(IN) ::expand_domain_id
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: i_periodic
+      LOGICAL (KIND=C_BOOL) :: i_periodic_tmp
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: j_periodic
+      LOGICAL (KIND=C_BOOL) :: j_periodic_tmp
       INTEGER  , OPTIONAL, INTENT(OUT) :: order
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
@@ -72,28 +100,48 @@
       (expand_domain_id,expand_domain_hdl)
       CALL xios(get_expand_domain_attr_hdl_)   &
-      ( expand_domain_hdl, order, type )
+      ( expand_domain_hdl, i_periodic, j_periodic, order, type )
 
   END SUBROUTINE xios(get_expand_domain_attr)
 
   SUBROUTINE xios(get_expand_domain_attr_hdl)  &
-    ( expand_domain_hdl, order, type )
-
-    IMPLICIT NONE
-      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+    ( expand_domain_hdl, i_periodic, j_periodic, order, type )
+
+    IMPLICIT NONE
+      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: i_periodic
+      LOGICAL (KIND=C_BOOL) :: i_periodic_tmp
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: j_periodic
+      LOGICAL (KIND=C_BOOL) :: j_periodic_tmp
       INTEGER  , OPTIONAL, INTENT(OUT) :: order
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
 
       CALL xios(get_expand_domain_attr_hdl_)  &
-      ( expand_domain_hdl, order, type )
+      ( expand_domain_hdl, i_periodic, j_periodic, order, type )
 
   END SUBROUTINE xios(get_expand_domain_attr_hdl)
 
   SUBROUTINE xios(get_expand_domain_attr_hdl_)   &
-    ( expand_domain_hdl, order_, type_ )
-
-    IMPLICIT NONE
-      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+    ( expand_domain_hdl, i_periodic_, j_periodic_, order_, type_ )
+
+    IMPLICIT NONE
+      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: i_periodic_
+      LOGICAL (KIND=C_BOOL) :: i_periodic__tmp
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: j_periodic_
+      LOGICAL (KIND=C_BOOL) :: j_periodic__tmp
       INTEGER  , OPTIONAL, INTENT(OUT) :: order_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_
+
+      IF (PRESENT(i_periodic_)) THEN
+        CALL cxios_get_expand_domain_i_periodic &
+      (expand_domain_hdl%daddr, i_periodic__tmp)
+        i_periodic_ = i_periodic__tmp
+      ENDIF
+
+      IF (PRESENT(j_periodic_)) THEN
+        CALL cxios_get_expand_domain_j_periodic &
+      (expand_domain_hdl%daddr, j_periodic__tmp)
+        j_periodic_ = j_periodic__tmp
+      ENDIF
 
       IF (PRESENT(order_)) THEN
@@ -110,9 +158,13 @@
 
   SUBROUTINE xios(is_defined_expand_domain_attr)  &
-    ( expand_domain_id, order, type )
+    ( expand_domain_id, i_periodic, j_periodic, order, type )
 
     IMPLICIT NONE
       TYPE(txios(expand_domain))  :: expand_domain_hdl
       CHARACTER(LEN=*), INTENT(IN) ::expand_domain_id
+      LOGICAL, OPTIONAL, INTENT(OUT) :: i_periodic
+      LOGICAL(KIND=C_BOOL) :: i_periodic_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: j_periodic
+      LOGICAL(KIND=C_BOOL) :: j_periodic_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: order
       LOGICAL(KIND=C_BOOL) :: order_tmp
@@ -123,13 +175,17 @@
       (expand_domain_id,expand_domain_hdl)
       CALL xios(is_defined_expand_domain_attr_hdl_)   &
-      ( expand_domain_hdl, order, type )
+      ( expand_domain_hdl, i_periodic, j_periodic, order, type )
 
   END SUBROUTINE xios(is_defined_expand_domain_attr)
 
   SUBROUTINE xios(is_defined_expand_domain_attr_hdl)  &
-    ( expand_domain_hdl, order, type )
-
-    IMPLICIT NONE
-      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+    ( expand_domain_hdl, i_periodic, j_periodic, order, type )
+
+    IMPLICIT NONE
+      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+      LOGICAL, OPTIONAL, INTENT(OUT) :: i_periodic
+      LOGICAL(KIND=C_BOOL) :: i_periodic_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: j_periodic
+      LOGICAL(KIND=C_BOOL) :: j_periodic_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: order
       LOGICAL(KIND=C_BOOL) :: order_tmp
@@ -138,13 +194,17 @@
 
       CALL xios(is_defined_expand_domain_attr_hdl_)  &
-      ( expand_domain_hdl, order, type )
+      ( expand_domain_hdl, i_periodic, j_periodic, order, type )
 
   END SUBROUTINE xios(is_defined_expand_domain_attr_hdl)
 
   SUBROUTINE xios(is_defined_expand_domain_attr_hdl_)   &
-    ( expand_domain_hdl, order_, type_ )
-
-    IMPLICIT NONE
-      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+    ( expand_domain_hdl, i_periodic_, j_periodic_, order_, type_ )
+
+    IMPLICIT NONE
+      TYPE(txios(expand_domain)) , INTENT(IN) :: expand_domain_hdl
+      LOGICAL, OPTIONAL, INTENT(OUT) :: i_periodic_
+      LOGICAL(KIND=C_BOOL) :: i_periodic__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: j_periodic_
+      LOGICAL(KIND=C_BOOL) :: j_periodic__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: order_
       LOGICAL(KIND=C_BOOL) :: order__tmp
@@ -152,4 +212,16 @@
       LOGICAL(KIND=C_BOOL) :: type__tmp
 
+      IF (PRESENT(i_periodic_)) THEN
+        i_periodic__tmp = cxios_is_defined_expand_domain_i_periodic &
+      (expand_domain_hdl%daddr)
+        i_periodic_ = i_periodic__tmp
+      ENDIF
+
+      IF (PRESENT(j_periodic_)) THEN
+        j_periodic__tmp = cxios_is_defined_expand_domain_j_periodic &
+      (expand_domain_hdl%daddr)
+        j_periodic_ = j_periodic__tmp
+      ENDIF
+
       IF (PRESENT(order_)) THEN
         order__tmp = cxios_is_defined_expand_domain_order &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/ifile_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/ifile_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/ifile_attr.F90	(revision 1158)
@@ -14,6 +14,6 @@
     ( file_id, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
     , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-    , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-     )
+    , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+    , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -43,7 +43,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_name
 
       CALL xios(get_file_handle) &
@@ -52,6 +57,6 @@
       ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
       , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-      , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-       )
+      , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+      , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(set_file_attr)
@@ -60,6 +65,6 @@
     ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
     , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-    , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-     )
+    , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+    , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -88,13 +93,18 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_name
 
       CALL xios(set_file_attr_hdl_)  &
       ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
       , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-      , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-       )
+      , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+      , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(set_file_attr_hdl)
@@ -103,6 +113,6 @@
     ( file_hdl, append_, compression_level_, convention_, cyclic_, description_, enabled_, format_  &
     , min_digits_, mode_, name_, name_suffix_, output_freq_, output_level_, par_access_, record_offset_  &
-    , split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_, timeseries_  &
-    , ts_prefix_, type_ )
+    , split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_, time_stamp_format_  &
+    , time_stamp_name_, time_units_, timeseries_, ts_prefix_, type_, uuid_format_, uuid_name_ )
 
     IMPLICIT NONE
@@ -131,7 +141,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_units_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timeseries_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_prefix_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_name_
 
       IF (PRESENT(append_)) THEN
@@ -238,4 +253,19 @@
       ENDIF
 
+      IF (PRESENT(time_stamp_format_)) THEN
+        CALL cxios_set_file_time_stamp_format &
+      (file_hdl%daddr, time_stamp_format_, len(time_stamp_format_))
+      ENDIF
+
+      IF (PRESENT(time_stamp_name_)) THEN
+        CALL cxios_set_file_time_stamp_name &
+      (file_hdl%daddr, time_stamp_name_, len(time_stamp_name_))
+      ENDIF
+
+      IF (PRESENT(time_units_)) THEN
+        CALL cxios_set_file_time_units &
+      (file_hdl%daddr, time_units_, len(time_units_))
+      ENDIF
+
       IF (PRESENT(timeseries_)) THEN
         CALL cxios_set_file_timeseries &
@@ -253,4 +283,14 @@
       ENDIF
 
+      IF (PRESENT(uuid_format_)) THEN
+        CALL cxios_set_file_uuid_format &
+      (file_hdl%daddr, uuid_format_, len(uuid_format_))
+      ENDIF
+
+      IF (PRESENT(uuid_name_)) THEN
+        CALL cxios_set_file_uuid_name &
+      (file_hdl%daddr, uuid_name_, len(uuid_name_))
+      ENDIF
+
   END SUBROUTINE xios(set_file_attr_hdl_)
 
@@ -258,6 +298,6 @@
     ( file_id, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
     , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-    , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-     )
+    , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+    , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -287,7 +327,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_name
 
       CALL xios(get_file_handle) &
@@ -296,6 +341,6 @@
       ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
       , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-      , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-       )
+      , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+      , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(get_file_attr)
@@ -304,6 +349,6 @@
     ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
     , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-    , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-     )
+    , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+    , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -332,13 +377,18 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_name
 
       CALL xios(get_file_attr_hdl_)  &
       ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
       , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-      , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-       )
+      , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+      , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(get_file_attr_hdl)
@@ -347,6 +397,6 @@
     ( file_hdl, append_, compression_level_, convention_, cyclic_, description_, enabled_, format_  &
     , min_digits_, mode_, name_, name_suffix_, output_freq_, output_level_, par_access_, record_offset_  &
-    , split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_, timeseries_  &
-    , ts_prefix_, type_ )
+    , split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_, time_stamp_format_  &
+    , time_stamp_name_, time_units_, timeseries_, ts_prefix_, type_, uuid_format_, uuid_name_ )
 
     IMPLICIT NONE
@@ -375,7 +425,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_units_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timeseries_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_prefix_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_name_
 
       IF (PRESENT(append_)) THEN
@@ -482,4 +537,19 @@
       ENDIF
 
+      IF (PRESENT(time_stamp_format_)) THEN
+        CALL cxios_get_file_time_stamp_format &
+      (file_hdl%daddr, time_stamp_format_, len(time_stamp_format_))
+      ENDIF
+
+      IF (PRESENT(time_stamp_name_)) THEN
+        CALL cxios_get_file_time_stamp_name &
+      (file_hdl%daddr, time_stamp_name_, len(time_stamp_name_))
+      ENDIF
+
+      IF (PRESENT(time_units_)) THEN
+        CALL cxios_get_file_time_units &
+      (file_hdl%daddr, time_units_, len(time_units_))
+      ENDIF
+
       IF (PRESENT(timeseries_)) THEN
         CALL cxios_get_file_timeseries &
@@ -497,4 +567,14 @@
       ENDIF
 
+      IF (PRESENT(uuid_format_)) THEN
+        CALL cxios_get_file_uuid_format &
+      (file_hdl%daddr, uuid_format_, len(uuid_format_))
+      ENDIF
+
+      IF (PRESENT(uuid_name_)) THEN
+        CALL cxios_get_file_uuid_name &
+      (file_hdl%daddr, uuid_name_, len(uuid_name_))
+      ENDIF
+
   END SUBROUTINE xios(get_file_attr_hdl_)
 
@@ -502,6 +582,6 @@
     ( file_id, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
     , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-    , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-     )
+    , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+    , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -548,4 +628,10 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: time_counter_name
       LOGICAL(KIND=C_BOOL) :: time_counter_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_format
+      LOGICAL(KIND=C_BOOL) :: time_stamp_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_name
+      LOGICAL(KIND=C_BOOL) :: time_stamp_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_units
+      LOGICAL(KIND=C_BOOL) :: time_units_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: timeseries
       LOGICAL(KIND=C_BOOL) :: timeseries_tmp
@@ -554,4 +640,8 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_format
+      LOGICAL(KIND=C_BOOL) :: uuid_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_name
+      LOGICAL(KIND=C_BOOL) :: uuid_name_tmp
 
       CALL xios(get_file_handle) &
@@ -560,6 +650,6 @@
       ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
       , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-      , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-       )
+      , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+      , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(is_defined_file_attr)
@@ -568,6 +658,6 @@
     ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
     , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-    , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-     )
+    , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+    , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -613,4 +703,10 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: time_counter_name
       LOGICAL(KIND=C_BOOL) :: time_counter_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_format
+      LOGICAL(KIND=C_BOOL) :: time_stamp_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_name
+      LOGICAL(KIND=C_BOOL) :: time_stamp_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_units
+      LOGICAL(KIND=C_BOOL) :: time_units_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: timeseries
       LOGICAL(KIND=C_BOOL) :: timeseries_tmp
@@ -619,10 +715,14 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_format
+      LOGICAL(KIND=C_BOOL) :: uuid_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_name
+      LOGICAL(KIND=C_BOOL) :: uuid_name_tmp
 
       CALL xios(is_defined_file_attr_hdl_)  &
       ( file_hdl, append, compression_level, convention, cyclic, description, enabled, format, min_digits  &
       , mode, name, name_suffix, output_freq, output_level, par_access, record_offset, split_freq  &
-      , split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix, type  &
-       )
+      , split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format, time_stamp_name  &
+      , time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(is_defined_file_attr_hdl)
@@ -631,6 +731,6 @@
     ( file_hdl, append_, compression_level_, convention_, cyclic_, description_, enabled_, format_  &
     , min_digits_, mode_, name_, name_suffix_, output_freq_, output_level_, par_access_, record_offset_  &
-    , split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_, timeseries_  &
-    , ts_prefix_, type_ )
+    , split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_, time_stamp_format_  &
+    , time_stamp_name_, time_units_, timeseries_, ts_prefix_, type_, uuid_format_, uuid_name_ )
 
     IMPLICIT NONE
@@ -676,4 +776,10 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: time_counter_name_
       LOGICAL(KIND=C_BOOL) :: time_counter_name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_format_
+      LOGICAL(KIND=C_BOOL) :: time_stamp_format__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_name_
+      LOGICAL(KIND=C_BOOL) :: time_stamp_name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_units_
+      LOGICAL(KIND=C_BOOL) :: time_units__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: timeseries_
       LOGICAL(KIND=C_BOOL) :: timeseries__tmp
@@ -682,4 +788,8 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: type_
       LOGICAL(KIND=C_BOOL) :: type__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_format_
+      LOGICAL(KIND=C_BOOL) :: uuid_format__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_name_
+      LOGICAL(KIND=C_BOOL) :: uuid_name__tmp
 
       IF (PRESENT(append_)) THEN
@@ -803,4 +913,22 @@
       ENDIF
 
+      IF (PRESENT(time_stamp_format_)) THEN
+        time_stamp_format__tmp = cxios_is_defined_file_time_stamp_format &
+      (file_hdl%daddr)
+        time_stamp_format_ = time_stamp_format__tmp
+      ENDIF
+
+      IF (PRESENT(time_stamp_name_)) THEN
+        time_stamp_name__tmp = cxios_is_defined_file_time_stamp_name &
+      (file_hdl%daddr)
+        time_stamp_name_ = time_stamp_name__tmp
+      ENDIF
+
+      IF (PRESENT(time_units_)) THEN
+        time_units__tmp = cxios_is_defined_file_time_units &
+      (file_hdl%daddr)
+        time_units_ = time_units__tmp
+      ENDIF
+
       IF (PRESENT(timeseries_)) THEN
         timeseries__tmp = cxios_is_defined_file_timeseries &
@@ -821,4 +949,16 @@
       ENDIF
 
+      IF (PRESENT(uuid_format_)) THEN
+        uuid_format__tmp = cxios_is_defined_file_uuid_format &
+      (file_hdl%daddr)
+        uuid_format_ = uuid_format__tmp
+      ENDIF
+
+      IF (PRESENT(uuid_name_)) THEN
+        uuid_name__tmp = cxios_is_defined_file_uuid_name &
+      (file_hdl%daddr)
+        uuid_name_ = uuid_name__tmp
+      ENDIF
+
   END SUBROUTINE xios(is_defined_file_attr_hdl_)
 
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/ifilegroup_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/ifilegroup_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/ifilegroup_attr.F90	(revision 1158)
@@ -14,6 +14,6 @@
     ( filegroup_id, append, compression_level, convention, cyclic, description, enabled, format  &
     , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-    , type )
+    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+    , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -44,7 +44,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_name
 
       CALL xios(get_filegroup_handle) &
@@ -53,6 +58,6 @@
       ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
       , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-      , type )
+      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+      , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(set_filegroup_attr)
@@ -61,6 +66,6 @@
     ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
     , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-    , type )
+    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+    , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -90,13 +95,18 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_name
 
       CALL xios(set_filegroup_attr_hdl_)  &
       ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
       , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-      , type )
+      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+      , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(set_filegroup_attr_hdl)
@@ -106,5 +116,6 @@
     , group_ref_, min_digits_, mode_, name_, name_suffix_, output_freq_, output_level_, par_access_  &
     , record_offset_, split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_  &
-    , timeseries_, ts_prefix_, type_ )
+    , time_stamp_format_, time_stamp_name_, time_units_, timeseries_, ts_prefix_, type_, uuid_format_  &
+    , uuid_name_ )
 
     IMPLICIT NONE
@@ -134,7 +145,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_counter_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_stamp_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: time_units_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: timeseries_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_prefix_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: uuid_name_
 
       IF (PRESENT(append_)) THEN
@@ -246,4 +262,19 @@
       ENDIF
 
+      IF (PRESENT(time_stamp_format_)) THEN
+        CALL cxios_set_filegroup_time_stamp_format &
+      (filegroup_hdl%daddr, time_stamp_format_, len(time_stamp_format_))
+      ENDIF
+
+      IF (PRESENT(time_stamp_name_)) THEN
+        CALL cxios_set_filegroup_time_stamp_name &
+      (filegroup_hdl%daddr, time_stamp_name_, len(time_stamp_name_))
+      ENDIF
+
+      IF (PRESENT(time_units_)) THEN
+        CALL cxios_set_filegroup_time_units &
+      (filegroup_hdl%daddr, time_units_, len(time_units_))
+      ENDIF
+
       IF (PRESENT(timeseries_)) THEN
         CALL cxios_set_filegroup_timeseries &
@@ -261,4 +292,14 @@
       ENDIF
 
+      IF (PRESENT(uuid_format_)) THEN
+        CALL cxios_set_filegroup_uuid_format &
+      (filegroup_hdl%daddr, uuid_format_, len(uuid_format_))
+      ENDIF
+
+      IF (PRESENT(uuid_name_)) THEN
+        CALL cxios_set_filegroup_uuid_name &
+      (filegroup_hdl%daddr, uuid_name_, len(uuid_name_))
+      ENDIF
+
   END SUBROUTINE xios(set_filegroup_attr_hdl_)
 
@@ -266,6 +307,6 @@
     ( filegroup_id, append, compression_level, convention, cyclic, description, enabled, format  &
     , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-    , type )
+    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+    , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -296,7 +337,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_name
 
       CALL xios(get_filegroup_handle) &
@@ -305,6 +351,6 @@
       ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
       , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-      , type )
+      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+      , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(get_filegroup_attr)
@@ -313,6 +359,6 @@
     ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
     , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-    , type )
+    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+    , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -342,13 +388,18 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_units
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timeseries
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_prefix
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_format
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_name
 
       CALL xios(get_filegroup_attr_hdl_)  &
       ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
       , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-      , type )
+      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+      , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(get_filegroup_attr_hdl)
@@ -358,5 +409,6 @@
     , group_ref_, min_digits_, mode_, name_, name_suffix_, output_freq_, output_level_, par_access_  &
     , record_offset_, split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_  &
-    , timeseries_, ts_prefix_, type_ )
+    , time_stamp_format_, time_stamp_name_, time_units_, timeseries_, ts_prefix_, type_, uuid_format_  &
+    , uuid_name_ )
 
     IMPLICIT NONE
@@ -386,7 +438,12 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_counter_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_stamp_name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: time_units_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: timeseries_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_prefix_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_format_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: uuid_name_
 
       IF (PRESENT(append_)) THEN
@@ -498,4 +555,19 @@
       ENDIF
 
+      IF (PRESENT(time_stamp_format_)) THEN
+        CALL cxios_get_filegroup_time_stamp_format &
+      (filegroup_hdl%daddr, time_stamp_format_, len(time_stamp_format_))
+      ENDIF
+
+      IF (PRESENT(time_stamp_name_)) THEN
+        CALL cxios_get_filegroup_time_stamp_name &
+      (filegroup_hdl%daddr, time_stamp_name_, len(time_stamp_name_))
+      ENDIF
+
+      IF (PRESENT(time_units_)) THEN
+        CALL cxios_get_filegroup_time_units &
+      (filegroup_hdl%daddr, time_units_, len(time_units_))
+      ENDIF
+
       IF (PRESENT(timeseries_)) THEN
         CALL cxios_get_filegroup_timeseries &
@@ -513,4 +585,14 @@
       ENDIF
 
+      IF (PRESENT(uuid_format_)) THEN
+        CALL cxios_get_filegroup_uuid_format &
+      (filegroup_hdl%daddr, uuid_format_, len(uuid_format_))
+      ENDIF
+
+      IF (PRESENT(uuid_name_)) THEN
+        CALL cxios_get_filegroup_uuid_name &
+      (filegroup_hdl%daddr, uuid_name_, len(uuid_name_))
+      ENDIF
+
   END SUBROUTINE xios(get_filegroup_attr_hdl_)
 
@@ -518,6 +600,6 @@
     ( filegroup_id, append, compression_level, convention, cyclic, description, enabled, format  &
     , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-    , type )
+    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+    , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -566,4 +648,10 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: time_counter_name
       LOGICAL(KIND=C_BOOL) :: time_counter_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_format
+      LOGICAL(KIND=C_BOOL) :: time_stamp_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_name
+      LOGICAL(KIND=C_BOOL) :: time_stamp_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_units
+      LOGICAL(KIND=C_BOOL) :: time_units_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: timeseries
       LOGICAL(KIND=C_BOOL) :: timeseries_tmp
@@ -572,4 +660,8 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_format
+      LOGICAL(KIND=C_BOOL) :: uuid_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_name
+      LOGICAL(KIND=C_BOOL) :: uuid_name_tmp
 
       CALL xios(get_filegroup_handle) &
@@ -578,6 +670,6 @@
       ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
       , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-      , type )
+      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+      , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(is_defined_filegroup_attr)
@@ -586,6 +678,6 @@
     ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
     , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-    , type )
+    , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+    , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
     IMPLICIT NONE
@@ -633,4 +725,10 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: time_counter_name
       LOGICAL(KIND=C_BOOL) :: time_counter_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_format
+      LOGICAL(KIND=C_BOOL) :: time_stamp_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_name
+      LOGICAL(KIND=C_BOOL) :: time_stamp_name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_units
+      LOGICAL(KIND=C_BOOL) :: time_units_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: timeseries
       LOGICAL(KIND=C_BOOL) :: timeseries_tmp
@@ -639,10 +737,14 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_format
+      LOGICAL(KIND=C_BOOL) :: uuid_format_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_name
+      LOGICAL(KIND=C_BOOL) :: uuid_name_tmp
 
       CALL xios(is_defined_filegroup_attr_hdl_)  &
       ( filegroup_hdl, append, compression_level, convention, cyclic, description, enabled, format  &
       , group_ref, min_digits, mode, name, name_suffix, output_freq, output_level, par_access, record_offset  &
-      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, timeseries, ts_prefix  &
-      , type )
+      , split_freq, split_freq_format, sync_freq, time_counter, time_counter_name, time_stamp_format  &
+      , time_stamp_name, time_units, timeseries, ts_prefix, type, uuid_format, uuid_name )
 
   END SUBROUTINE xios(is_defined_filegroup_attr_hdl)
@@ -652,5 +754,6 @@
     , group_ref_, min_digits_, mode_, name_, name_suffix_, output_freq_, output_level_, par_access_  &
     , record_offset_, split_freq_, split_freq_format_, sync_freq_, time_counter_, time_counter_name_  &
-    , timeseries_, ts_prefix_, type_ )
+    , time_stamp_format_, time_stamp_name_, time_units_, timeseries_, ts_prefix_, type_, uuid_format_  &
+    , uuid_name_ )
 
     IMPLICIT NONE
@@ -698,4 +801,10 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: time_counter_name_
       LOGICAL(KIND=C_BOOL) :: time_counter_name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_format_
+      LOGICAL(KIND=C_BOOL) :: time_stamp_format__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_stamp_name_
+      LOGICAL(KIND=C_BOOL) :: time_stamp_name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: time_units_
+      LOGICAL(KIND=C_BOOL) :: time_units__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: timeseries_
       LOGICAL(KIND=C_BOOL) :: timeseries__tmp
@@ -704,4 +813,8 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: type_
       LOGICAL(KIND=C_BOOL) :: type__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_format_
+      LOGICAL(KIND=C_BOOL) :: uuid_format__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: uuid_name_
+      LOGICAL(KIND=C_BOOL) :: uuid_name__tmp
 
       IF (PRESENT(append_)) THEN
@@ -831,4 +944,22 @@
       ENDIF
 
+      IF (PRESENT(time_stamp_format_)) THEN
+        time_stamp_format__tmp = cxios_is_defined_filegroup_time_stamp_format &
+      (filegroup_hdl%daddr)
+        time_stamp_format_ = time_stamp_format__tmp
+      ENDIF
+
+      IF (PRESENT(time_stamp_name_)) THEN
+        time_stamp_name__tmp = cxios_is_defined_filegroup_time_stamp_name &
+      (filegroup_hdl%daddr)
+        time_stamp_name_ = time_stamp_name__tmp
+      ENDIF
+
+      IF (PRESENT(time_units_)) THEN
+        time_units__tmp = cxios_is_defined_filegroup_time_units &
+      (filegroup_hdl%daddr)
+        time_units_ = time_units__tmp
+      ENDIF
+
       IF (PRESENT(timeseries_)) THEN
         timeseries__tmp = cxios_is_defined_filegroup_timeseries &
@@ -849,4 +980,16 @@
       ENDIF
 
+      IF (PRESENT(uuid_format_)) THEN
+        uuid_format__tmp = cxios_is_defined_filegroup_uuid_format &
+      (filegroup_hdl%daddr)
+        uuid_format_ = uuid_format__tmp
+      ENDIF
+
+      IF (PRESENT(uuid_name_)) THEN
+        uuid_name__tmp = cxios_is_defined_filegroup_uuid_name &
+      (filegroup_hdl%daddr)
+        uuid_name_ = uuid_name__tmp
+      ENDIF
+
   END SUBROUTINE xios(is_defined_filegroup_attr_hdl_)
 
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/iinterpolate_domain_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/iinterpolate_domain_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/iinterpolate_domain_attr.F90	(revision 1158)
@@ -12,10 +12,9 @@
 
   SUBROUTINE xios(set_interpolate_domain_attr)  &
-    ( interpolate_domain_id, file, mode, order, renormalize, weight_filename, write_weight )
+    ( interpolate_domain_id, mode, order, renormalize, weight_filename, write_weight )
 
     IMPLICIT NONE
       TYPE(txios(interpolate_domain))  :: interpolate_domain_hdl
       CHARACTER(LEN=*), INTENT(IN) ::interpolate_domain_id
-      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: file
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: mode
       INTEGER  , OPTIONAL, INTENT(IN) :: order
@@ -29,14 +28,13 @@
       (interpolate_domain_id,interpolate_domain_hdl)
       CALL xios(set_interpolate_domain_attr_hdl_)   &
-      ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
+      ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
 
   END SUBROUTINE xios(set_interpolate_domain_attr)
 
   SUBROUTINE xios(set_interpolate_domain_attr_hdl)  &
-    ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
-
-    IMPLICIT NONE
-      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
-      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: file
+    ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
+
+    IMPLICIT NONE
+      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: mode
       INTEGER  , OPTIONAL, INTENT(IN) :: order
@@ -48,15 +46,13 @@
 
       CALL xios(set_interpolate_domain_attr_hdl_)  &
-      ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
+      ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
 
   END SUBROUTINE xios(set_interpolate_domain_attr_hdl)
 
   SUBROUTINE xios(set_interpolate_domain_attr_hdl_)   &
-    ( interpolate_domain_hdl, file_, mode_, order_, renormalize_, weight_filename_, write_weight_  &
-     )
-
-    IMPLICIT NONE
-      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
-      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: file_
+    ( interpolate_domain_hdl, mode_, order_, renormalize_, weight_filename_, write_weight_ )
+
+    IMPLICIT NONE
+      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: mode_
       INTEGER  , OPTIONAL, INTENT(IN) :: order_
@@ -67,9 +63,4 @@
       LOGICAL (KIND=C_BOOL) :: write_weight__tmp
 
-      IF (PRESENT(file_)) THEN
-        CALL cxios_set_interpolate_domain_file &
-      (interpolate_domain_hdl%daddr, file_, len(file_))
-      ENDIF
-
       IF (PRESENT(mode_)) THEN
         CALL cxios_set_interpolate_domain_mode &
@@ -102,10 +93,9 @@
 
   SUBROUTINE xios(get_interpolate_domain_attr)  &
-    ( interpolate_domain_id, file, mode, order, renormalize, weight_filename, write_weight )
+    ( interpolate_domain_id, mode, order, renormalize, weight_filename, write_weight )
 
     IMPLICIT NONE
       TYPE(txios(interpolate_domain))  :: interpolate_domain_hdl
       CHARACTER(LEN=*), INTENT(IN) ::interpolate_domain_id
-      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: file
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: mode
       INTEGER  , OPTIONAL, INTENT(OUT) :: order
@@ -119,14 +109,13 @@
       (interpolate_domain_id,interpolate_domain_hdl)
       CALL xios(get_interpolate_domain_attr_hdl_)   &
-      ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
+      ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
 
   END SUBROUTINE xios(get_interpolate_domain_attr)
 
   SUBROUTINE xios(get_interpolate_domain_attr_hdl)  &
-    ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
-
-    IMPLICIT NONE
-      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
-      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: file
+    ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
+
+    IMPLICIT NONE
+      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: mode
       INTEGER  , OPTIONAL, INTENT(OUT) :: order
@@ -138,15 +127,13 @@
 
       CALL xios(get_interpolate_domain_attr_hdl_)  &
-      ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
+      ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
 
   END SUBROUTINE xios(get_interpolate_domain_attr_hdl)
 
   SUBROUTINE xios(get_interpolate_domain_attr_hdl_)   &
-    ( interpolate_domain_hdl, file_, mode_, order_, renormalize_, weight_filename_, write_weight_  &
-     )
-
-    IMPLICIT NONE
-      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
-      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: file_
+    ( interpolate_domain_hdl, mode_, order_, renormalize_, weight_filename_, write_weight_ )
+
+    IMPLICIT NONE
+      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: mode_
       INTEGER  , OPTIONAL, INTENT(OUT) :: order_
@@ -157,9 +144,4 @@
       LOGICAL (KIND=C_BOOL) :: write_weight__tmp
 
-      IF (PRESENT(file_)) THEN
-        CALL cxios_get_interpolate_domain_file &
-      (interpolate_domain_hdl%daddr, file_, len(file_))
-      ENDIF
-
       IF (PRESENT(mode_)) THEN
         CALL cxios_get_interpolate_domain_mode &
@@ -192,11 +174,9 @@
 
   SUBROUTINE xios(is_defined_interpolate_domain_attr)  &
-    ( interpolate_domain_id, file, mode, order, renormalize, weight_filename, write_weight )
+    ( interpolate_domain_id, mode, order, renormalize, weight_filename, write_weight )
 
     IMPLICIT NONE
       TYPE(txios(interpolate_domain))  :: interpolate_domain_hdl
       CHARACTER(LEN=*), INTENT(IN) ::interpolate_domain_id
-      LOGICAL, OPTIONAL, INTENT(OUT) :: file
-      LOGICAL(KIND=C_BOOL) :: file_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: mode
       LOGICAL(KIND=C_BOOL) :: mode_tmp
@@ -213,15 +193,13 @@
       (interpolate_domain_id,interpolate_domain_hdl)
       CALL xios(is_defined_interpolate_domain_attr_hdl_)   &
-      ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
+      ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
 
   END SUBROUTINE xios(is_defined_interpolate_domain_attr)
 
   SUBROUTINE xios(is_defined_interpolate_domain_attr_hdl)  &
-    ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
-
-    IMPLICIT NONE
-      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
-      LOGICAL, OPTIONAL, INTENT(OUT) :: file
-      LOGICAL(KIND=C_BOOL) :: file_tmp
+    ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
+
+    IMPLICIT NONE
+      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
       LOGICAL, OPTIONAL, INTENT(OUT) :: mode
       LOGICAL(KIND=C_BOOL) :: mode_tmp
@@ -236,16 +214,13 @@
 
       CALL xios(is_defined_interpolate_domain_attr_hdl_)  &
-      ( interpolate_domain_hdl, file, mode, order, renormalize, weight_filename, write_weight )
+      ( interpolate_domain_hdl, mode, order, renormalize, weight_filename, write_weight )
 
   END SUBROUTINE xios(is_defined_interpolate_domain_attr_hdl)
 
   SUBROUTINE xios(is_defined_interpolate_domain_attr_hdl_)   &
-    ( interpolate_domain_hdl, file_, mode_, order_, renormalize_, weight_filename_, write_weight_  &
-     )
-
-    IMPLICIT NONE
-      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
-      LOGICAL, OPTIONAL, INTENT(OUT) :: file_
-      LOGICAL(KIND=C_BOOL) :: file__tmp
+    ( interpolate_domain_hdl, mode_, order_, renormalize_, weight_filename_, write_weight_ )
+
+    IMPLICIT NONE
+      TYPE(txios(interpolate_domain)) , INTENT(IN) :: interpolate_domain_hdl
       LOGICAL, OPTIONAL, INTENT(OUT) :: mode_
       LOGICAL(KIND=C_BOOL) :: mode__tmp
@@ -259,10 +234,4 @@
       LOGICAL(KIND=C_BOOL) :: write_weight__tmp
 
-      IF (PRESENT(file_)) THEN
-        file__tmp = cxios_is_defined_interpolate_domain_file &
-      (interpolate_domain_hdl%daddr)
-        file_ = file__tmp
-      ENDIF
-
       IF (PRESENT(mode_)) THEN
         mode__tmp = cxios_is_defined_interpolate_domain_mode &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/interpolate_domain_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/interpolate_domain_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/interpolate_domain_interface_attr.F90	(revision 1158)
@@ -9,25 +9,4 @@
   INTERFACE
     ! Do not call directly / interface FORTRAN 2003 <-> C99
-
-    SUBROUTINE cxios_set_interpolate_domain_file(interpolate_domain_hdl, file, file_size) BIND(C)
-      USE ISO_C_BINDING
-      INTEGER (kind = C_INTPTR_T), VALUE :: interpolate_domain_hdl
-      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: file
-      INTEGER  (kind = C_INT)     , VALUE        :: file_size
-    END SUBROUTINE cxios_set_interpolate_domain_file
-
-    SUBROUTINE cxios_get_interpolate_domain_file(interpolate_domain_hdl, file, file_size) BIND(C)
-      USE ISO_C_BINDING
-      INTEGER (kind = C_INTPTR_T), VALUE :: interpolate_domain_hdl
-      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: file
-      INTEGER  (kind = C_INT)     , VALUE        :: file_size
-    END SUBROUTINE cxios_get_interpolate_domain_file
-
-    FUNCTION cxios_is_defined_interpolate_domain_file(interpolate_domain_hdl) BIND(C)
-      USE ISO_C_BINDING
-      LOGICAL(kind=C_BOOL) :: cxios_is_defined_interpolate_domain_file
-      INTEGER (kind = C_INTPTR_T), VALUE :: interpolate_domain_hdl
-    END FUNCTION cxios_is_defined_interpolate_domain_file
-
 
     SUBROUTINE cxios_set_interpolate_domain_mode(interpolate_domain_hdl, mode, mode_size) BIND(C)
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/iscalar_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/iscalar_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/iscalar_attr.F90	(revision 1158)
@@ -12,5 +12,5 @@
 
   SUBROUTINE xios(set_scalar_attr)  &
-    ( scalar_id, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalar_id, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -19,4 +19,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -27,10 +28,10 @@
       (scalar_id,scalar_hdl)
       CALL xios(set_scalar_attr_hdl_)   &
-      ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
   END SUBROUTINE xios(set_scalar_attr)
 
   SUBROUTINE xios(set_scalar_attr_hdl)  &
-    ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -38,4 +39,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -44,10 +46,10 @@
 
       CALL xios(set_scalar_attr_hdl_)  &
-      ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
   END SUBROUTINE xios(set_scalar_attr_hdl)
 
   SUBROUTINE xios(set_scalar_attr_hdl_)   &
-    ( scalar_hdl, long_name_, name_, scalar_ref_, standard_name_, unit_, value_ )
+    ( scalar_hdl, long_name_, name_, prec_, scalar_ref_, standard_name_, unit_, value_ )
 
     IMPLICIT NONE
@@ -55,4 +57,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: scalar_ref_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
@@ -70,4 +73,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_set_scalar_prec &
+      (scalar_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(scalar_ref_)) THEN
         CALL cxios_set_scalar_scalar_ref &
@@ -93,5 +101,5 @@
 
   SUBROUTINE xios(get_scalar_attr)  &
-    ( scalar_id, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalar_id, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -100,4 +108,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -108,10 +117,10 @@
       (scalar_id,scalar_hdl)
       CALL xios(get_scalar_attr_hdl_)   &
-      ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
   END SUBROUTINE xios(get_scalar_attr)
 
   SUBROUTINE xios(get_scalar_attr_hdl)  &
-    ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -119,4 +128,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -125,10 +135,10 @@
 
       CALL xios(get_scalar_attr_hdl_)  &
-      ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
   END SUBROUTINE xios(get_scalar_attr_hdl)
 
   SUBROUTINE xios(get_scalar_attr_hdl_)   &
-    ( scalar_hdl, long_name_, name_, scalar_ref_, standard_name_, unit_, value_ )
+    ( scalar_hdl, long_name_, name_, prec_, scalar_ref_, standard_name_, unit_, value_ )
 
     IMPLICIT NONE
@@ -136,4 +146,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: scalar_ref_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
@@ -151,4 +162,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_get_scalar_prec &
+      (scalar_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(scalar_ref_)) THEN
         CALL cxios_get_scalar_scalar_ref &
@@ -174,5 +190,5 @@
 
   SUBROUTINE xios(is_defined_scalar_attr)  &
-    ( scalar_id, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalar_id, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -183,4 +199,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scalar_ref
       LOGICAL(KIND=C_BOOL) :: scalar_ref_tmp
@@ -195,10 +213,10 @@
       (scalar_id,scalar_hdl)
       CALL xios(is_defined_scalar_attr_hdl_)   &
-      ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
   END SUBROUTINE xios(is_defined_scalar_attr)
 
   SUBROUTINE xios(is_defined_scalar_attr_hdl)  &
-    ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -208,4 +226,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scalar_ref
       LOGICAL(KIND=C_BOOL) :: scalar_ref_tmp
@@ -218,10 +238,10 @@
 
       CALL xios(is_defined_scalar_attr_hdl_)  &
-      ( scalar_hdl, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalar_hdl, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
   END SUBROUTINE xios(is_defined_scalar_attr_hdl)
 
   SUBROUTINE xios(is_defined_scalar_attr_hdl_)   &
-    ( scalar_hdl, long_name_, name_, scalar_ref_, standard_name_, unit_, value_ )
+    ( scalar_hdl, long_name_, name_, prec_, scalar_ref_, standard_name_, unit_, value_ )
 
     IMPLICIT NONE
@@ -231,4 +251,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name_
       LOGICAL(KIND=C_BOOL) :: name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL(KIND=C_BOOL) :: prec__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scalar_ref_
       LOGICAL(KIND=C_BOOL) :: scalar_ref__tmp
@@ -252,4 +274,10 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        prec__tmp = cxios_is_defined_scalar_prec &
+      (scalar_hdl%daddr)
+        prec_ = prec__tmp
+      ENDIF
+
       IF (PRESENT(scalar_ref_)) THEN
         scalar_ref__tmp = cxios_is_defined_scalar_scalar_ref &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/iscalargroup_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/iscalargroup_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/iscalargroup_attr.F90	(revision 1158)
@@ -12,5 +12,5 @@
 
   SUBROUTINE xios(set_scalargroup_attr)  &
-    ( scalargroup_id, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalargroup_id, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -20,4 +20,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -28,10 +29,12 @@
       (scalargroup_id,scalargroup_hdl)
       CALL xios(set_scalargroup_attr_hdl_)   &
-      ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(set_scalargroup_attr)
 
   SUBROUTINE xios(set_scalargroup_attr_hdl)  &
-    ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -40,4 +43,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -46,11 +50,12 @@
 
       CALL xios(set_scalargroup_attr_hdl_)  &
-      ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(set_scalargroup_attr_hdl)
 
   SUBROUTINE xios(set_scalargroup_attr_hdl_)   &
-    ( scalargroup_hdl, group_ref_, long_name_, name_, scalar_ref_, standard_name_, unit_, value_  &
-     )
+    ( scalargroup_hdl, group_ref_, long_name_, name_, prec_, scalar_ref_, standard_name_, unit_  &
+    , value_ )
 
     IMPLICIT NONE
@@ -59,4 +64,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: long_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_
+      INTEGER  , OPTIONAL, INTENT(IN) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: scalar_ref_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
@@ -79,4 +85,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_set_scalargroup_prec &
+      (scalargroup_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(scalar_ref_)) THEN
         CALL cxios_set_scalargroup_scalar_ref &
@@ -102,5 +113,5 @@
 
   SUBROUTINE xios(get_scalargroup_attr)  &
-    ( scalargroup_id, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalargroup_id, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -110,4 +121,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -118,10 +130,12 @@
       (scalargroup_id,scalargroup_hdl)
       CALL xios(get_scalargroup_attr_hdl_)   &
-      ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(get_scalargroup_attr)
 
   SUBROUTINE xios(get_scalargroup_attr_hdl)  &
-    ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -130,4 +144,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: scalar_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -136,11 +151,12 @@
 
       CALL xios(get_scalargroup_attr_hdl_)  &
-      ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(get_scalargroup_attr_hdl)
 
   SUBROUTINE xios(get_scalargroup_attr_hdl_)   &
-    ( scalargroup_hdl, group_ref_, long_name_, name_, scalar_ref_, standard_name_, unit_, value_  &
-     )
+    ( scalargroup_hdl, group_ref_, long_name_, name_, prec_, scalar_ref_, standard_name_, unit_  &
+    , value_ )
 
     IMPLICIT NONE
@@ -149,4 +165,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: long_name_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_
+      INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: scalar_ref_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
@@ -169,4 +186,9 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        CALL cxios_get_scalargroup_prec &
+      (scalargroup_hdl%daddr, prec_)
+      ENDIF
+
       IF (PRESENT(scalar_ref_)) THEN
         CALL cxios_get_scalargroup_scalar_ref &
@@ -192,5 +214,5 @@
 
   SUBROUTINE xios(is_defined_scalargroup_attr)  &
-    ( scalargroup_id, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalargroup_id, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value )
 
     IMPLICIT NONE
@@ -203,4 +225,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scalar_ref
       LOGICAL(KIND=C_BOOL) :: scalar_ref_tmp
@@ -215,10 +239,12 @@
       (scalargroup_id,scalargroup_hdl)
       CALL xios(is_defined_scalargroup_attr_hdl_)   &
-      ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(is_defined_scalargroup_attr)
 
   SUBROUTINE xios(is_defined_scalargroup_attr_hdl)  &
-    ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+    ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+     )
 
     IMPLICIT NONE
@@ -230,4 +256,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL(KIND=C_BOOL) :: prec_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scalar_ref
       LOGICAL(KIND=C_BOOL) :: scalar_ref_tmp
@@ -240,11 +268,12 @@
 
       CALL xios(is_defined_scalargroup_attr_hdl_)  &
-      ( scalargroup_hdl, group_ref, long_name, name, scalar_ref, standard_name, unit, value )
+      ( scalargroup_hdl, group_ref, long_name, name, prec, scalar_ref, standard_name, unit, value  &
+       )
 
   END SUBROUTINE xios(is_defined_scalargroup_attr_hdl)
 
   SUBROUTINE xios(is_defined_scalargroup_attr_hdl_)   &
-    ( scalargroup_hdl, group_ref_, long_name_, name_, scalar_ref_, standard_name_, unit_, value_  &
-     )
+    ( scalargroup_hdl, group_ref_, long_name_, name_, prec_, scalar_ref_, standard_name_, unit_  &
+    , value_ )
 
     IMPLICIT NONE
@@ -256,4 +285,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name_
       LOGICAL(KIND=C_BOOL) :: name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL(KIND=C_BOOL) :: prec__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scalar_ref_
       LOGICAL(KIND=C_BOOL) :: scalar_ref__tmp
@@ -283,4 +314,10 @@
       ENDIF
 
+      IF (PRESENT(prec_)) THEN
+        prec__tmp = cxios_is_defined_scalargroup_prec &
+      (scalargroup_hdl%daddr)
+        prec_ = prec__tmp
+      ENDIF
+
       IF (PRESENT(scalar_ref_)) THEN
         scalar_ref__tmp = cxios_is_defined_scalargroup_scalar_ref &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/ivariable_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/ivariable_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/ivariable_attr.F90	(revision 1158)
@@ -12,5 +12,5 @@
 
   SUBROUTINE xios(set_variable_attr)  &
-    ( variable_id, name, type )
+    ( variable_id, name, ts_target, type )
 
     IMPLICIT NONE
@@ -18,4 +18,5 @@
       CHARACTER(LEN=*), INTENT(IN) ::variable_id
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
 
@@ -23,27 +24,29 @@
       (variable_id,variable_hdl)
       CALL xios(set_variable_attr_hdl_)   &
-      ( variable_hdl, name, type )
+      ( variable_hdl, name, ts_target, type )
 
   END SUBROUTINE xios(set_variable_attr)
 
   SUBROUTINE xios(set_variable_attr_hdl)  &
-    ( variable_hdl, name, type )
+    ( variable_hdl, name, ts_target, type )
 
     IMPLICIT NONE
       TYPE(txios(variable)) , INTENT(IN) :: variable_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
 
       CALL xios(set_variable_attr_hdl_)  &
-      ( variable_hdl, name, type )
+      ( variable_hdl, name, ts_target, type )
 
   END SUBROUTINE xios(set_variable_attr_hdl)
 
   SUBROUTINE xios(set_variable_attr_hdl_)   &
-    ( variable_hdl, name_, type_ )
+    ( variable_hdl, name_, ts_target_, type_ )
 
     IMPLICIT NONE
       TYPE(txios(variable)) , INTENT(IN) :: variable_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_target_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_
 
@@ -51,4 +54,9 @@
         CALL cxios_set_variable_name &
       (variable_hdl%daddr, name_, len(name_))
+      ENDIF
+
+      IF (PRESENT(ts_target_)) THEN
+        CALL cxios_set_variable_ts_target &
+      (variable_hdl%daddr, ts_target_, len(ts_target_))
       ENDIF
 
@@ -61,5 +69,5 @@
 
   SUBROUTINE xios(get_variable_attr)  &
-    ( variable_id, name, type )
+    ( variable_id, name, ts_target, type )
 
     IMPLICIT NONE
@@ -67,4 +75,5 @@
       CHARACTER(LEN=*), INTENT(IN) ::variable_id
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
 
@@ -72,27 +81,29 @@
       (variable_id,variable_hdl)
       CALL xios(get_variable_attr_hdl_)   &
-      ( variable_hdl, name, type )
+      ( variable_hdl, name, ts_target, type )
 
   END SUBROUTINE xios(get_variable_attr)
 
   SUBROUTINE xios(get_variable_attr_hdl)  &
-    ( variable_hdl, name, type )
+    ( variable_hdl, name, ts_target, type )
 
     IMPLICIT NONE
       TYPE(txios(variable)) , INTENT(IN) :: variable_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
 
       CALL xios(get_variable_attr_hdl_)  &
-      ( variable_hdl, name, type )
+      ( variable_hdl, name, ts_target, type )
 
   END SUBROUTINE xios(get_variable_attr_hdl)
 
   SUBROUTINE xios(get_variable_attr_hdl_)   &
-    ( variable_hdl, name_, type_ )
+    ( variable_hdl, name_, ts_target_, type_ )
 
     IMPLICIT NONE
       TYPE(txios(variable)) , INTENT(IN) :: variable_hdl
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_target_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_
 
@@ -100,4 +111,9 @@
         CALL cxios_get_variable_name &
       (variable_hdl%daddr, name_, len(name_))
+      ENDIF
+
+      IF (PRESENT(ts_target_)) THEN
+        CALL cxios_get_variable_ts_target &
+      (variable_hdl%daddr, ts_target_, len(ts_target_))
       ENDIF
 
@@ -110,5 +126,5 @@
 
   SUBROUTINE xios(is_defined_variable_attr)  &
-    ( variable_id, name, type )
+    ( variable_id, name, ts_target, type )
 
     IMPLICIT NONE
@@ -117,4 +133,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: ts_target
+      LOGICAL(KIND=C_BOOL) :: ts_target_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
@@ -123,10 +141,10 @@
       (variable_id,variable_hdl)
       CALL xios(is_defined_variable_attr_hdl_)   &
-      ( variable_hdl, name, type )
+      ( variable_hdl, name, ts_target, type )
 
   END SUBROUTINE xios(is_defined_variable_attr)
 
   SUBROUTINE xios(is_defined_variable_attr_hdl)  &
-    ( variable_hdl, name, type )
+    ( variable_hdl, name, ts_target, type )
 
     IMPLICIT NONE
@@ -134,14 +152,16 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: ts_target
+      LOGICAL(KIND=C_BOOL) :: ts_target_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
 
       CALL xios(is_defined_variable_attr_hdl_)  &
-      ( variable_hdl, name, type )
+      ( variable_hdl, name, ts_target, type )
 
   END SUBROUTINE xios(is_defined_variable_attr_hdl)
 
   SUBROUTINE xios(is_defined_variable_attr_hdl_)   &
-    ( variable_hdl, name_, type_ )
+    ( variable_hdl, name_, ts_target_, type_ )
 
     IMPLICIT NONE
@@ -149,4 +169,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name_
       LOGICAL(KIND=C_BOOL) :: name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: ts_target_
+      LOGICAL(KIND=C_BOOL) :: ts_target__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: type_
       LOGICAL(KIND=C_BOOL) :: type__tmp
@@ -156,4 +178,10 @@
       (variable_hdl%daddr)
         name_ = name__tmp
+      ENDIF
+
+      IF (PRESENT(ts_target_)) THEN
+        ts_target__tmp = cxios_is_defined_variable_ts_target &
+      (variable_hdl%daddr)
+        ts_target_ = ts_target__tmp
       ENDIF
 
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/ivariablegroup_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/ivariablegroup_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/ivariablegroup_attr.F90	(revision 1158)
@@ -12,5 +12,5 @@
 
   SUBROUTINE xios(set_variablegroup_attr)  &
-    ( variablegroup_id, group_ref, name, type )
+    ( variablegroup_id, group_ref, name, ts_target, type )
 
     IMPLICIT NONE
@@ -19,4 +19,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
 
@@ -24,10 +25,10 @@
       (variablegroup_id,variablegroup_hdl)
       CALL xios(set_variablegroup_attr_hdl_)   &
-      ( variablegroup_hdl, group_ref, name, type )
+      ( variablegroup_hdl, group_ref, name, ts_target, type )
 
   END SUBROUTINE xios(set_variablegroup_attr)
 
   SUBROUTINE xios(set_variablegroup_attr_hdl)  &
-    ( variablegroup_hdl, group_ref, name, type )
+    ( variablegroup_hdl, group_ref, name, ts_target, type )
 
     IMPLICIT NONE
@@ -35,13 +36,14 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type
 
       CALL xios(set_variablegroup_attr_hdl_)  &
-      ( variablegroup_hdl, group_ref, name, type )
+      ( variablegroup_hdl, group_ref, name, ts_target, type )
 
   END SUBROUTINE xios(set_variablegroup_attr_hdl)
 
   SUBROUTINE xios(set_variablegroup_attr_hdl_)   &
-    ( variablegroup_hdl, group_ref_, name_, type_ )
+    ( variablegroup_hdl, group_ref_, name_, ts_target_, type_ )
 
     IMPLICIT NONE
@@ -49,4 +51,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: group_ref_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: ts_target_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: type_
 
@@ -61,4 +64,9 @@
       ENDIF
 
+      IF (PRESENT(ts_target_)) THEN
+        CALL cxios_set_variablegroup_ts_target &
+      (variablegroup_hdl%daddr, ts_target_, len(ts_target_))
+      ENDIF
+
       IF (PRESENT(type_)) THEN
         CALL cxios_set_variablegroup_type &
@@ -69,5 +77,5 @@
 
   SUBROUTINE xios(get_variablegroup_attr)  &
-    ( variablegroup_id, group_ref, name, type )
+    ( variablegroup_id, group_ref, name, ts_target, type )
 
     IMPLICIT NONE
@@ -76,4 +84,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
 
@@ -81,10 +90,10 @@
       (variablegroup_id,variablegroup_hdl)
       CALL xios(get_variablegroup_attr_hdl_)   &
-      ( variablegroup_hdl, group_ref, name, type )
+      ( variablegroup_hdl, group_ref, name, ts_target, type )
 
   END SUBROUTINE xios(get_variablegroup_attr)
 
   SUBROUTINE xios(get_variablegroup_attr_hdl)  &
-    ( variablegroup_hdl, group_ref, name, type )
+    ( variablegroup_hdl, group_ref, name, ts_target, type )
 
     IMPLICIT NONE
@@ -92,13 +101,14 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_target
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type
 
       CALL xios(get_variablegroup_attr_hdl_)  &
-      ( variablegroup_hdl, group_ref, name, type )
+      ( variablegroup_hdl, group_ref, name, ts_target, type )
 
   END SUBROUTINE xios(get_variablegroup_attr_hdl)
 
   SUBROUTINE xios(get_variablegroup_attr_hdl_)   &
-    ( variablegroup_hdl, group_ref_, name_, type_ )
+    ( variablegroup_hdl, group_ref_, name_, ts_target_, type_ )
 
     IMPLICIT NONE
@@ -106,4 +116,5 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: group_ref_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: name_
+      CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: ts_target_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: type_
 
@@ -118,4 +129,9 @@
       ENDIF
 
+      IF (PRESENT(ts_target_)) THEN
+        CALL cxios_get_variablegroup_ts_target &
+      (variablegroup_hdl%daddr, ts_target_, len(ts_target_))
+      ENDIF
+
       IF (PRESENT(type_)) THEN
         CALL cxios_get_variablegroup_type &
@@ -126,5 +142,5 @@
 
   SUBROUTINE xios(is_defined_variablegroup_attr)  &
-    ( variablegroup_id, group_ref, name, type )
+    ( variablegroup_id, group_ref, name, ts_target, type )
 
     IMPLICIT NONE
@@ -135,4 +151,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: ts_target
+      LOGICAL(KIND=C_BOOL) :: ts_target_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
@@ -141,10 +159,10 @@
       (variablegroup_id,variablegroup_hdl)
       CALL xios(is_defined_variablegroup_attr_hdl_)   &
-      ( variablegroup_hdl, group_ref, name, type )
+      ( variablegroup_hdl, group_ref, name, ts_target, type )
 
   END SUBROUTINE xios(is_defined_variablegroup_attr)
 
   SUBROUTINE xios(is_defined_variablegroup_attr_hdl)  &
-    ( variablegroup_hdl, group_ref, name, type )
+    ( variablegroup_hdl, group_ref, name, ts_target, type )
 
     IMPLICIT NONE
@@ -154,14 +172,16 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name
       LOGICAL(KIND=C_BOOL) :: name_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: ts_target
+      LOGICAL(KIND=C_BOOL) :: ts_target_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: type
       LOGICAL(KIND=C_BOOL) :: type_tmp
 
       CALL xios(is_defined_variablegroup_attr_hdl_)  &
-      ( variablegroup_hdl, group_ref, name, type )
+      ( variablegroup_hdl, group_ref, name, ts_target, type )
 
   END SUBROUTINE xios(is_defined_variablegroup_attr_hdl)
 
   SUBROUTINE xios(is_defined_variablegroup_attr_hdl_)   &
-    ( variablegroup_hdl, group_ref_, name_, type_ )
+    ( variablegroup_hdl, group_ref_, name_, ts_target_, type_ )
 
     IMPLICIT NONE
@@ -171,4 +191,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: name_
       LOGICAL(KIND=C_BOOL) :: name__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: ts_target_
+      LOGICAL(KIND=C_BOOL) :: ts_target__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: type_
       LOGICAL(KIND=C_BOOL) :: type__tmp
@@ -186,4 +208,10 @@
       ENDIF
 
+      IF (PRESENT(ts_target_)) THEN
+        ts_target__tmp = cxios_is_defined_variablegroup_ts_target &
+      (variablegroup_hdl%daddr)
+        ts_target_ = ts_target__tmp
+      ENDIF
+
       IF (PRESENT(type_)) THEN
         type__tmp = cxios_is_defined_variablegroup_type &
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/scalar_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/scalar_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/scalar_interface_attr.F90	(revision 1158)
@@ -50,4 +50,23 @@
       INTEGER (kind = C_INTPTR_T), VALUE :: scalar_hdl
     END FUNCTION cxios_is_defined_scalar_name
+
+
+    SUBROUTINE cxios_set_scalar_prec(scalar_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: scalar_hdl
+      INTEGER (KIND=C_INT)      , VALUE :: prec
+    END SUBROUTINE cxios_set_scalar_prec
+
+    SUBROUTINE cxios_get_scalar_prec(scalar_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: scalar_hdl
+      INTEGER (KIND=C_INT)             :: prec
+    END SUBROUTINE cxios_get_scalar_prec
+
+    FUNCTION cxios_is_defined_scalar_prec(scalar_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_scalar_prec
+      INTEGER (kind = C_INTPTR_T), VALUE :: scalar_hdl
+    END FUNCTION cxios_is_defined_scalar_prec
 
 
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/scalargroup_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/scalargroup_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/scalargroup_interface_attr.F90	(revision 1158)
@@ -71,4 +71,23 @@
       INTEGER (kind = C_INTPTR_T), VALUE :: scalargroup_hdl
     END FUNCTION cxios_is_defined_scalargroup_name
+
+
+    SUBROUTINE cxios_set_scalargroup_prec(scalargroup_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: scalargroup_hdl
+      INTEGER (KIND=C_INT)      , VALUE :: prec
+    END SUBROUTINE cxios_set_scalargroup_prec
+
+    SUBROUTINE cxios_get_scalargroup_prec(scalargroup_hdl, prec) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: scalargroup_hdl
+      INTEGER (KIND=C_INT)             :: prec
+    END SUBROUTINE cxios_get_scalargroup_prec
+
+    FUNCTION cxios_is_defined_scalargroup_prec(scalargroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_scalargroup_prec
+      INTEGER (kind = C_INTPTR_T), VALUE :: scalargroup_hdl
+    END FUNCTION cxios_is_defined_scalargroup_prec
 
 
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/variable_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/variable_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/variable_interface_attr.F90	(revision 1158)
@@ -31,4 +31,25 @@
 
 
+    SUBROUTINE cxios_set_variable_ts_target(variable_hdl, ts_target, ts_target_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: ts_target
+      INTEGER  (kind = C_INT)     , VALUE        :: ts_target_size
+    END SUBROUTINE cxios_set_variable_ts_target
+
+    SUBROUTINE cxios_get_variable_ts_target(variable_hdl, ts_target, ts_target_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: ts_target
+      INTEGER  (kind = C_INT)     , VALUE        :: ts_target_size
+    END SUBROUTINE cxios_get_variable_ts_target
+
+    FUNCTION cxios_is_defined_variable_ts_target(variable_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_variable_ts_target
+      INTEGER (kind = C_INTPTR_T), VALUE :: variable_hdl
+    END FUNCTION cxios_is_defined_variable_ts_target
+
+
     SUBROUTINE cxios_set_variable_type(variable_hdl, type, type_size) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/dev/dev_olga/src/interface/fortran_attr/variablegroup_interface_attr.F90
===================================================================
--- /XIOS/dev/dev_olga/src/interface/fortran_attr/variablegroup_interface_attr.F90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/interface/fortran_attr/variablegroup_interface_attr.F90	(revision 1158)
@@ -52,4 +52,25 @@
 
 
+    SUBROUTINE cxios_set_variablegroup_ts_target(variablegroup_hdl, ts_target, ts_target_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: ts_target
+      INTEGER  (kind = C_INT)     , VALUE        :: ts_target_size
+    END SUBROUTINE cxios_set_variablegroup_ts_target
+
+    SUBROUTINE cxios_get_variablegroup_ts_target(variablegroup_hdl, ts_target, ts_target_size) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl
+      CHARACTER(kind = C_CHAR)    , DIMENSION(*) :: ts_target
+      INTEGER  (kind = C_INT)     , VALUE        :: ts_target_size
+    END SUBROUTINE cxios_get_variablegroup_ts_target
+
+    FUNCTION cxios_is_defined_variablegroup_ts_target(variablegroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_variablegroup_ts_target
+      INTEGER (kind = C_INTPTR_T), VALUE :: variablegroup_hdl
+    END FUNCTION cxios_is_defined_variablegroup_ts_target
+
+
     SUBROUTINE cxios_set_variablegroup_type(variablegroup_hdl, type, type_size) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/dev/dev_olga/src/io/nc4_data_input.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/nc4_data_input.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/nc4_data_input.cpp	(revision 1158)
@@ -262,5 +262,5 @@
     itMapNj = itMapNi; ++itMapNj;
 
-    if ((CDomain::type_attr::rectilinear == domain->type))// || this->isRectilinear(fieldId))
+    if ((CDomain::type_attr::rectilinear == domain->type))
     {
       // Ok, try to read some f.. attributes such as longitude and latitude
@@ -279,26 +279,25 @@
         std::vector<StdSize> nBeginLon(1, 0), nSizeLon(1, itMapNi->second);
         readFieldVariableValue(domain->lonvalue_rectilinear_read_from_file, itMapNi->first, nBeginLon, nSizeLon, true);
-      }
-      domain->fillInRectilinearLonLat();
-    }
-    else if ((CDomain::type_attr::curvilinear == domain->type))// || (this->isCurvilinear(fieldId)))
+      }      
+    }
+    else if ((CDomain::type_attr::curvilinear == domain->type))
     {
       int ni = domain->ni;
       int nj = domain->nj;
       std::vector<StdSize> nBeginLatLon(2), nSizeLatLon(2);
-      nBeginLatLon[0] = domain->jbegin.getValue(); nBeginLatLon[1] = domain->ibegin.getValue();
-      nSizeLatLon[0]  = nj; nSizeLatLon[1] = ni;
+      nBeginLatLon[0] = 0; nBeginLatLon[1] = 0;
+      nSizeLatLon[0]  = domain->nj_glo.getValue(); nSizeLatLon[1] = domain->ni_glo.getValue();
 
       StdString latName = this->getLatCoordName(fieldId);
-      if (SuperClassWriter::hasVariable(latName)) //(0 != latName.compare(""))
-      {
-        domain->latvalue_2d.resize(ni,nj);
-        readFieldVariableValue(domain->latvalue_2d, latName, nBeginLatLon, nSizeLatLon);
+      if (SuperClassWriter::hasVariable(latName))
+      {
+        domain->latvalue_curvilinear_read_from_file.resize(domain->ni_glo,domain->nj_glo);
+        readFieldVariableValue(domain->latvalue_curvilinear_read_from_file, latName, nBeginLatLon, nSizeLatLon);
       }
       StdString lonName = this->getLonCoordName(fieldId);
-      if (SuperClassWriter::hasVariable(lonName)) //(0 != lonName.compare(""))
-      {
-        domain->lonvalue_2d.resize(ni,nj);
-        readFieldVariableValue(domain->lonvalue_2d, lonName, nBeginLatLon, nSizeLatLon);
+      if (SuperClassWriter::hasVariable(lonName))
+      {
+        domain->lonvalue_curvilinear_read_from_file.resize(domain->ni_glo,domain->nj_glo);
+        readFieldVariableValue(domain->lonvalue_curvilinear_read_from_file, lonName, nBeginLatLon, nSizeLatLon);
       }
 
@@ -307,44 +306,35 @@
 
       int nbVertex = this->getNbVertex(fieldId);
-      if (SuperClassWriter::hasVariable(boundsLatName) || SuperClassWriter::hasVariable(boundsLonName)) //if ((0 != boundsLatName.compare("")) || (0 != boundsLonName.compare("")))
+      if (!domain->nvertex.isEmpty() && (domain->nvertex != nbVertex))
+      {
+        ERROR("void CNc4DataInput::readDomainAttributeValueFromFile(...)",
+          << "The domain " << domain->getDomainOutputName()
+          << " has nvertex read from file " << this->filename << " and nvertex provided from model"
+          << " are not coherent. They should be the same." << std::endl 
+          << " nvertex read from file: "<< nbVertex
+          << " nvertex from model: "<< domain->nvertex << std::endl);
+      } 
+
+      if (SuperClassWriter::hasVariable(boundsLatName) || SuperClassWriter::hasVariable(boundsLonName)) 
         domain->nvertex.setValue(nbVertex);
       std::vector<StdSize> nBeginBndsLatLon(3), nSizeBndsLatLon(3);
-      nBeginBndsLatLon[0] = domain->jbegin.getValue(); nSizeBndsLatLon[0] = nj;
-      nBeginBndsLatLon[1] = domain->ibegin.getValue(); nSizeBndsLatLon[1] = ni;
+      nBeginBndsLatLon[0] = 0; nSizeBndsLatLon[0] = domain->nj_glo.getValue();
+      nBeginBndsLatLon[1] = 0; nSizeBndsLatLon[1] = domain->nj_glo.getValue();
       nBeginBndsLatLon[2] = 0; nSizeBndsLatLon[2] = nbVertex;
 
-      if (SuperClassWriter::hasVariable(boundsLatName)) //(0 != boundsLatName.compare(""))
-      {
-        domain->bounds_lat_2d.resize(nbVertex,ni,nj);
-        readFieldVariableValue(domain->bounds_lat_2d, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon);
-
-      }
-      if (SuperClassWriter::hasVariable(boundsLonName)) //(0 != boundsLonName.compare(""))
-      {
-        domain->bounds_lon_2d.resize(nbVertex,ni,nj);
-        readFieldVariableValue(domain->bounds_lon_2d, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon);
-      }
+      if (SuperClassWriter::hasVariable(boundsLatName))
+      {
+        domain->bounds_latvalue_curvilinear_read_from_file.resize(nbVertex,domain->ni_glo,domain->nj_glo);
+        readFieldVariableValue(domain->bounds_latvalue_curvilinear_read_from_file, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon);
+
+      }
+      if (SuperClassWriter::hasVariable(boundsLonName)) 
+      {
+        domain->bounds_lonvalue_curvilinear_read_from_file.resize(nbVertex,domain->ni_glo,domain->nj_glo);
+        readFieldVariableValue(domain->bounds_lonvalue_curvilinear_read_from_file, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon);
+      }      
     }
     else if ((CDomain::type_attr::unstructured == domain->type))// || (this->isUnstructured(fieldId)))
     {
-      /*
-      if (domain->i_index.isEmpty())
-         ERROR("CNc4DataInput::readDomainAttributeValueFromFile(...)",
-              << "Field '" << fieldId << std::endl
-              << "Trying to read attributes from unstructured grid."
-              << "i_index of domain" << domain->getId() << " is mandatory");
-
-      int ni = domain->i_index.numElements();
-*/
-
-      int ni     = domain->ni.isEmpty() ? 0 : domain->ni;
-      int ibegin = domain->ibegin.isEmpty() ? 0 : domain->ibegin;
-
-      if (domain->i_index.isEmpty() && (!domain->ni.isEmpty()) )
-      {
-        domain->i_index.resize(ni) ;
-        for(int idx = 0; idx < ni; ++idx) domain->i_index(idx)=ibegin+idx ;
-      }
-
       std::vector<StdSize> nBeginLatLon(1,0), nSizeLatLon(1,0);
       nSizeLatLon[0]  = domain->ni_glo.getValue();
@@ -352,10 +342,8 @@
 
       StdString latName = this->getLatCoordName(fieldId);
-      if (SuperClassWriter::hasVariable(latName)) //(0 != latName.compare(""))
-      {
-        readFieldVariableValue(globalLonLat, latName, nBeginLatLon, nSizeLatLon);
-        domain->latvalue_1d.resize(ni);
-        for (int idx = 0; idx < ni; ++idx)
-          domain->latvalue_1d(idx) =  globalLonLat(domain->i_index(idx));
+      if (SuperClassWriter::hasVariable(latName))
+      {
+        domain->latvalue_unstructured_read_from_file.resize(domain->ni_glo);
+        readFieldVariableValue(domain->latvalue_unstructured_read_from_file, latName, nBeginLatLon, nSizeLatLon);  
       }
 
@@ -363,8 +351,7 @@
       if (SuperClassWriter::hasVariable(lonName)) //(0 != lonName.compare(""))
       {
-        readFieldVariableValue(globalLonLat, lonName, nBeginLatLon, nSizeLatLon);
-        domain->lonvalue_1d.resize(ni);
-        for (int idx = 0; idx < ni; ++idx)
-          domain->lonvalue_1d(idx) = globalLonLat(domain->i_index(idx));
+        // readFieldVariableValue(globalLonLat, lonName, nBeginLatLon, nSizeLatLon);
+        domain->lonvalue_unstructured_read_from_file.resize(domain->ni_glo);
+        readFieldVariableValue(domain->lonvalue_unstructured_read_from_file, lonName, nBeginLatLon, nSizeLatLon);
       }
 
@@ -373,5 +360,15 @@
 
       int nbVertex = this->getNbVertex(fieldId);
-      if (SuperClassWriter::hasVariable(boundsLatName) || SuperClassWriter::hasVariable(boundsLonName)) // (0 != boundsLatName.compare("")) || (0 != boundsLonName.compare("")))
+      if (!domain->nvertex.isEmpty() && (domain->nvertex != nbVertex))
+      {
+        ERROR("void CNc4DataInput::readDomainAttributeValueFromFile(...)",
+          << "The domain " << domain->getDomainOutputName()
+          << " has nvertex read from file " << this->filename << " and nvertex provided from model"
+          << " are not coherent. They should be the same." << std::endl 
+          << " nvertex read from file: "<< nbVertex
+          << " nvertex from model: "<< domain->nvertex << std::endl);
+      } 
+      
+      if (SuperClassWriter::hasVariable(boundsLatName) || SuperClassWriter::hasVariable(boundsLonName)) 
         domain->nvertex.setValue(nbVertex);
 
@@ -380,24 +377,17 @@
       nBeginBndsLatLon[1] = 0; nSizeBndsLatLon[1] = nbVertex;
 
-      if (SuperClassWriter::hasVariable(boundsLatName)) //(0 != boundsLatName.compare(""))
-      {
-        CArray<double,2> globalBndsLonLat(nSizeBndsLatLon[1], nSizeBndsLatLon[0]);
-        readFieldVariableValue(globalBndsLonLat, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon);
-        domain->bounds_lat_1d.resize(nbVertex,ni);
-        for (int idx = 0; idx < ni; ++idx)
-          for (int jdx = 0; jdx < nbVertex; ++jdx)
-            domain->bounds_lat_1d(jdx,idx) = globalBndsLonLat(jdx, domain->i_index(idx));
-      }
-
-      if (SuperClassWriter::hasVariable(boundsLonName)) //(0 != boundsLonName.compare(""))
-      {
-        CArray<double,2> globalBndsLonLat(nSizeBndsLatLon[1], nSizeBndsLatLon[0]);
-        readFieldVariableValue(globalBndsLonLat, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon);
-        domain->bounds_lon_1d.resize(nbVertex,ni);
-        for (int idx = 0; idx < ni; ++idx)
-          for (int jdx = 0; jdx < nbVertex; ++jdx)
-            domain->bounds_lon_1d(jdx,idx) = globalBndsLonLat(jdx, domain->i_index(idx));
-      }
-    }
+      if (SuperClassWriter::hasVariable(boundsLatName)) 
+      {
+        domain->bounds_latvalue_unstructured_read_from_file.resize(nSizeBndsLatLon[1], nSizeBndsLatLon[0]);
+        readFieldVariableValue(domain->bounds_latvalue_unstructured_read_from_file, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon);
+      }
+
+      if (SuperClassWriter::hasVariable(boundsLonName)) 
+      {
+        domain->bounds_lonvalue_unstructured_read_from_file.resize(nSizeBndsLatLon[1], nSizeBndsLatLon[0]);
+        readFieldVariableValue(domain->bounds_lonvalue_unstructured_read_from_file, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon);
+      }      
+    }
+    domain->fillInLonLat();
   }
 
@@ -421,5 +411,24 @@
     if (this->isRectilinear(fieldId) || this->isCurvilinear(fieldId))
     {
+      if (!domain->nj_glo.isEmpty() && (domain->nj_glo != itMapNj->second))
+      {
+        ERROR("void CNc4DataInput::readDomainAttributesFromFile(...)",
+          << "The domain " << domain->getDomainOutputName()
+          << " has nj_glo read from file " << this->filename << " and nj_glo provided from model"
+          << " are not coherent. They should be the same." << std::endl 
+          << " nj_glo read from file: "<< itMapNj->second
+          << " nj_glo from model: "<< domain->nj_glo << std::endl);
+      } 
       domain->nj_glo.setValue(itMapNj->second);
+
+      if (!domain->ni_glo.isEmpty() && (domain->ni_glo != itMapNi->second))
+      {
+        ERROR("void CNc4DataInput::readDomainAttributesFromFile(...)",
+          << "The domain " << domain->getDomainOutputName()
+          << " has ni_glo read from file " << this->filename << " and ni_glo provided from model"
+          << " are not coherent. They should be the same." << std::endl 
+          << " ni_glo read from file: "<< itMapNi->second
+          << " ni_glo from model: "<< domain->ni_glo << std::endl);
+      } 
       domain->ni_glo.setValue(itMapNi->second);
     }
@@ -427,4 +436,14 @@
     {
       domain->nj_glo.setValue(1);
+
+      if (!domain->ni_glo.isEmpty() && (domain->ni_glo != itMapNi->second))
+      {
+        ERROR("void CNc4DataInput::readDomainAttributesFromFile(...)",
+          << "The domain " << domain->getDomainOutputName()
+          << " has ni_glo read from file " << this->filename << " and ni_glo provided from model"
+          << " are not coherent. They should be the same." << std::endl 
+          << " ni_glo read from file: "<< itMapNi->second
+          << " ni_glo from model: "<< domain->ni_glo << std::endl);
+      }       
       domain->ni_glo.setValue(itMapNi->second);
     }
@@ -444,4 +463,14 @@
                                                               iteMap = dimSizeMap.end();
     for (int i = 0; i < elementPosition; ++i, ++itMapN) {}
+
+    if (!axis->n_glo.isEmpty() && (axis->n_glo != itMapN->second))
+    {
+      ERROR("void CNc4DataInput::readAxisAttributesFromFile(...)",
+        << "The axis " << axis->getAxisOutputName()
+        << " has n_glo read from file " << this->filename << " and n_glo provided from model"
+        << " are not coherent. They should be the same." << std::endl 
+        << " n_glo read from file: "<< itMapN->second
+        << " n_glo from model: "<< axis->n_glo << std::endl);
+    }    
     axis->n_glo.setValue(itMapN->second);
   }
@@ -483,8 +512,5 @@
                                                   int elementPosition, const StdString& fieldId)
   {
-//    std::list<std::pair<StdString, StdSize> >::const_iterator itMapN = dimSizeMap.begin(),
-//                                                              iteMap = dimSizeMap.end();
-//    for (int i = 0; i < elementPosition; ++i, ++itMapN) {}
-//    axis->n_glo.setValue(itMapN->second);
+    /*Nothing to do */
   }
 
@@ -499,18 +525,5 @@
                                                       int elementPosition, const StdString& fieldId)
   {
-//    std::list<std::pair<StdString, StdSize> >::const_iterator itMapN = dimSizeMap.begin(),
-//                                                              iteMap = dimSizeMap.end();
-//    for (int i = 0; i < elementPosition; ++i, ++itMapN) {}
-//
-//    { // Read axis value
-//      std::vector<StdSize> nBegin(1, 0), nSize(1, itMapN->second);
-//      CArray<double,1> readAxisValue(itMapN->second);
-//      readFieldVariableValue(readAxisValue, itMapN->first, nBegin, nSize, true);
-//      int begin = 0, n = itMapN->second;
-//      if (!axis->begin.isEmpty()) begin = axis->begin.getValue();
-//      if (!axis->n.isEmpty()) n = axis->n.getValue();
-//      axis->value.resize(n);
-//      for (int i = 0; i < n; ++i) axis->value(i) = readAxisValue(begin + i);
-//    }
+    /*Nothing to do */
   }
 
Index: /XIOS/dev/dev_olga/src/io/nc4_data_output.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/nc4_data_output.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/nc4_data_output.cpp	(revision 1158)
@@ -11,19 +11,21 @@
 #include "netCdfException.hpp"
 #include "exception.hpp"
-
+#include "timer.hpp"
+#include "uuid.hpp"
 namespace xios
 {
       /// ////////////////////// Dfinitions ////////////////////// ///
       CNc4DataOutput::CNc4DataOutput
-         (const StdString & filename, bool exist)
+         (CFile* file, const StdString & filename, bool exist)
             : SuperClass()
             , SuperClassWriter(filename, exist)
             , filename(filename)
-      {
-    SuperClass::type = MULTI_FILE;
+            , file(file),hasTimeInstant(false),hasTimeCentered(false), timeCounterType(none)
+      {
+        SuperClass::type = MULTI_FILE;
       }
 
       CNc4DataOutput::CNc4DataOutput
-         (const StdString & filename, bool exist, bool useClassicFormat, bool useCFConvention,
+         (CFile* file, const StdString & filename, bool exist, bool useClassicFormat, bool useCFConvention,
           MPI_Comm comm_file, bool multifile, bool isCollective, const StdString& timeCounterName)
             : SuperClass()
@@ -32,6 +34,7 @@
             , filename(filename)
             , isCollective(isCollective)
-      {
-    SuperClass::type = (multifile) ? MULTI_FILE : ONE_FILE;
+            , file(file),hasTimeInstant(false),hasTimeCentered(false), timeCounterType(none)
+      {
+        SuperClass::type = (multifile) ? MULTI_FILE : ONE_FILE;
       }
 
@@ -60,5 +63,4 @@
         }
 
-        
          CContext* context = CContext::getCurrent() ;
          CContextServer* server=context->server ;
@@ -78,6 +80,12 @@
          int nvertex = (domain->nvertex.isEmpty()) ? 0 : domain->nvertex;
 
-         StdString dimXid, dimYid ;
-
+
+        StdString dimXid, dimYid ;
+
+        nc_type typePrec ;
+        if (domain->prec.isEmpty()) typePrec =  NC_FLOAT ;
+        else if (domain->prec==4)  typePrec =  NC_FLOAT ;
+        else if (domain->prec==8)   typePrec =  NC_DOUBLE ;
+         
          bool isRegularDomain = (domain->type == CDomain::type_attr::rectilinear);
          switch (domain->type)
@@ -209,10 +217,10 @@
                    {
                      case CDomain::type_attr::curvilinear :
-                       SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
-                       SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0);
+                       SuperClassWriter::addVariable(latid, typePrec, dim0);
+                       SuperClassWriter::addVariable(lonid, typePrec, dim0);
                        break ;
                       case CDomain::type_attr::rectilinear :
-                        SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
-                        SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1);
+                        SuperClassWriter::addVariable(latid, typePrec, dim0);
+                        SuperClassWriter::addVariable(lonid, typePrec, dim1);
                         break ;
                    }
@@ -230,6 +238,6 @@
                      dim0.push_back(dimXid);
                      dim0.push_back(dimVertId);
-                     SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0);
-                     SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0);
+                     SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0);
+                     SuperClassWriter::addVariable(bounds_latid, typePrec, dim0);
                    }
                  }
@@ -256,5 +264,5 @@
                  if (domain->hasArea)
                  {
-                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(areaId, typePrec, dim0);
                    SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId);
                    SuperClassWriter::addAttribute("units", StdString("m2"), &areaId);
@@ -311,6 +319,6 @@
                        lonid = StdString("nav_lon").append(appendDomid);
                        latid = StdString("nav_lat").append(appendDomid);
-                       SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
-                       SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0);
+                       SuperClassWriter::addVariable(latid, typePrec, dim0);
+                       SuperClassWriter::addVariable(lonid, typePrec, dim0);
                        break;
 
@@ -320,6 +328,6 @@
                        lonid = StdString("lon").append(appendDomid);
                        latid = StdString("lat").append(appendDomid);
-                       SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
-                       SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1);
+                       SuperClassWriter::addVariable(latid, typePrec, dim0);
+                       SuperClassWriter::addVariable(lonid, typePrec, dim1);
                        break;
                    }
@@ -342,6 +350,6 @@
                      dim0.push_back(dimXid);
                      dim0.push_back(dimVertId);
-                     SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0);
-                     SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0);
+                     SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0);
+                     SuperClassWriter::addVariable(bounds_latid, typePrec, dim0);
                    }
                  }
@@ -351,5 +359,5 @@
                    dim0.clear();
                    dim0.push_back(dimYid); dim0.push_back(dimXid);
-                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(areaId, typePrec, dim0);
                    SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId);
                    SuperClassWriter::addAttribute("units", StdString("m2"), &areaId);
@@ -492,4 +500,9 @@
         if (SuperClass::type==MULTI_FILE) return ;
 
+     nc_type typePrec ;
+     if (domain->prec.isEmpty()) typePrec =  NC_FLOAT ;
+     else if (domain->prec==4)  typePrec =  NC_FLOAT ;
+     else if (domain->prec==8)   typePrec =  NC_DOUBLE ;
+
       std::vector<StdString> dim0;
       StdString domid = domain->getDomainOutputName();
@@ -543,9 +556,9 @@
                 dim0.clear();
                 dim0.push_back(dimNode);
-                SuperClassWriter::addVariable(node_x, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(node_x, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &node_x);
                 SuperClassWriter::addAttribute("long_name", StdString("Longitude of mesh nodes."), &node_x);
                 SuperClassWriter::addAttribute("units", StdString("degrees_east"), &node_x);
-                SuperClassWriter::addVariable(node_y, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(node_y, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &node_y);
                 SuperClassWriter::addAttribute("long_name", StdString("Latitude of mesh nodes."), &node_y);
@@ -562,9 +575,9 @@
                 dim0.clear();
                 dim0.push_back(dimNode);
-                SuperClassWriter::addVariable(node_x, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(node_x, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &node_x);
                 SuperClassWriter::addAttribute("long_name", StdString("Longitude of mesh nodes."), &node_x);
                 SuperClassWriter::addAttribute("units", StdString("degrees_east"), &node_x);
-                SuperClassWriter::addVariable(node_y, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(node_y, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &node_y);
                 SuperClassWriter::addAttribute("long_name", StdString("Latitude of mesh nodes."), &node_y);
@@ -576,9 +589,9 @@
               dim0.clear();
               dim0.push_back(dimEdge);
-              SuperClassWriter::addVariable(edge_x, NC_FLOAT, dim0);
+              SuperClassWriter::addVariable(edge_x, typePrec, dim0);
               SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &edge_x);
               SuperClassWriter::addAttribute("long_name", StdString("Characteristic longitude of mesh edges."), &edge_x);
               SuperClassWriter::addAttribute("units", StdString("degrees_east"), &edge_x);
-              SuperClassWriter::addVariable(edge_y, NC_FLOAT, dim0);
+              SuperClassWriter::addVariable(edge_y, typePrec, dim0);
               SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &edge_y);
               SuperClassWriter::addAttribute("long_name", StdString("Characteristic latitude of mesh edges."), &edge_y);
@@ -602,9 +615,9 @@
                 dim0.clear();
                 dim0.push_back(dimNode);
-                SuperClassWriter::addVariable(node_x, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(node_x, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &node_x);
                 SuperClassWriter::addAttribute("long_name", StdString("Longitude of mesh nodes."), &node_x);
                 SuperClassWriter::addAttribute("units", StdString("degrees_east"), &node_x);
-                SuperClassWriter::addVariable(node_y, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(node_y, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &node_y);
                 SuperClassWriter::addAttribute("long_name", StdString("Latitude of mesh nodes."), &node_y);
@@ -618,9 +631,9 @@
                 dim0.clear();
                 dim0.push_back(dimEdge);
-                SuperClassWriter::addVariable(edge_x, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(edge_x, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &edge_x);
                 SuperClassWriter::addAttribute("long_name", StdString("Characteristic longitude of mesh edges."), &edge_x);
                 SuperClassWriter::addAttribute("units", StdString("degrees_east"), &edge_x);
-                SuperClassWriter::addVariable(edge_y, NC_FLOAT, dim0);
+                SuperClassWriter::addVariable(edge_y, typePrec, dim0);
                 SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &edge_y);
                 SuperClassWriter::addAttribute("long_name", StdString("Characteristic latitude of mesh edges."), &edge_y);
@@ -640,9 +653,9 @@
               dim0.clear();
               dim0.push_back(dimFace);
-              SuperClassWriter::addVariable(face_x, NC_FLOAT, dim0);
+              SuperClassWriter::addVariable(face_x, typePrec, dim0);
               SuperClassWriter::addAttribute("standard_name", StdString("longitude"), &face_x);
               SuperClassWriter::addAttribute("long_name", StdString("Characteristic longitude of mesh faces."), &face_x);
               SuperClassWriter::addAttribute("units", StdString("degrees_east"), &face_x);
-              SuperClassWriter::addVariable(face_y, NC_FLOAT, dim0);
+              SuperClassWriter::addVariable(face_y, typePrec, dim0);
               SuperClassWriter::addAttribute("standard_name", StdString("latitude"), &face_y);
               SuperClassWriter::addAttribute("long_name", StdString("Characteristic latitude of mesh faces."), &face_y);
@@ -906,4 +919,9 @@
          string areaId = "area" + appendDomid;
 
+         nc_type typePrec ;
+         if (domain->prec.isEmpty()) typePrec =  NC_FLOAT ;
+         else if (domain->prec==4)  typePrec =  NC_FLOAT ;
+         else if (domain->prec==8)   typePrec =  NC_DOUBLE ;
+
          int nvertex = (domain->nvertex.isEmpty()) ? 0 : domain->nvertex;
 
@@ -965,6 +983,6 @@
                  if (domain->hasLonLat)
                  {
-                   SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
-                   SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(latid, typePrec, dim0);
+                   SuperClassWriter::addVariable(lonid, typePrec, dim0);
                    this->writeAxisAttributes(lonid, "", "longitude", "Longitude", "degrees_east", domid);
                    if (domain->hasBounds) SuperClassWriter::addAttribute("bounds",bounds_lonid, &lonid);
@@ -978,6 +996,6 @@
                    dim0.push_back(dimXid);
                    dim0.push_back(dimVertId);
-                   SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0);
-                   SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0);
+                   SuperClassWriter::addVariable(bounds_latid, typePrec, dim0);
                  }
 
@@ -986,5 +1004,5 @@
                  if (domain->hasArea)
                  {
-                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(areaId, typePrec, dim0);
                    SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId);
                    SuperClassWriter::addAttribute("units", StdString("m2"), &areaId);
@@ -1021,6 +1039,6 @@
                  if (domain->hasLonLat)
                  {
-                   SuperClassWriter::addVariable(latid, NC_FLOAT, dim0);
-                   SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(latid, typePrec, dim0);
+                   SuperClassWriter::addVariable(lonid, typePrec, dim0);
 
                    this->writeAxisAttributes(lonid, "", "longitude", "Longitude", "degrees_east", domid);
@@ -1036,6 +1054,6 @@
                    dim0.push_back(dimXid);
                    dim0.push_back(dimVertId);
-                   SuperClassWriter::addVariable(bounds_lonid, NC_FLOAT, dim0);
-                   SuperClassWriter::addVariable(bounds_latid, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(bounds_lonid, typePrec, dim0);
+                   SuperClassWriter::addVariable(bounds_latid, typePrec, dim0);
                  }
 
@@ -1044,5 +1062,5 @@
                    dim0.clear();
                    dim0.push_back(dimXid);
-                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0);
+                   SuperClassWriter::addVariable(areaId, typePrec, dim0);
                    SuperClassWriter::addAttribute("standard_name", StdString("cell_area"), &areaId);
                    SuperClassWriter::addAttribute("units", StdString("m2"), &areaId);
@@ -1111,6 +1129,4 @@
       void CNc4DataOutput::writeAxis_(CAxis* axis)
       {
-        CContext* context = CContext::getCurrent();
-
         if (axis->IsWritten(this->filename)) return;
         axis->checkAttributes();
@@ -1130,11 +1146,20 @@
         else setWrittenAxis(axisid);
 
+        nc_type typePrec ;
+        if (axis->prec.isEmpty()) typePrec =  NC_FLOAT ;
+        else if (axis->prec==4)  typePrec =  NC_FLOAT ;
+        else if (axis->prec==8)   typePrec =  NC_DOUBLE ;
+         
+        if (!axis->label.isEmpty()) typePrec = NC_CHAR ;
+        string strId="str_len" ;
         try
         {
           SuperClassWriter::addDimension(axisid, zoom_size);
+          if (!axis->label.isEmpty()) SuperClassWriter::addDimension(strId, stringArrayLen);
           if (axis->hasValue)
           {
             dims.push_back(axisid);
-            SuperClassWriter::addVariable(axisid, NC_FLOAT, dims);
+            if (!axis->label.isEmpty()) dims.push_back(strId);
+            SuperClassWriter::addVariable(axisid, typePrec, dims);
 
             if (!axis->name.isEmpty())
@@ -1162,5 +1187,5 @@
             {
               dims.push_back("axis_nbounds");
-              SuperClassWriter::addVariable(axisBoundsId, NC_FLOAT, dims);
+              SuperClassWriter::addVariable(axisBoundsId, typePrec, dims);
               SuperClassWriter::addAttribute("bounds", axisBoundsId, &axisid);
             }
@@ -1178,19 +1203,17 @@
               case MULTI_FILE:
               {
-                // CArray<double,1> axis_value(axis->zoom_n);
-                // for (int i = 0; i < axis->zoom_n; i++) axis_value(i) = axis->value(i);
                 SuperClassWriter::writeData(axis_value, axisid, isCollective, 0);
 
-                if (!axis->bounds.isEmpty())
+                if (!axis->bounds.isEmpty() && axis->label.isEmpty())
                   SuperClassWriter::writeData(axis->bounds, axisBoundsId, isCollective, 0);
 
+                // Need to check after
+                if (! axis->label.isEmpty())  SuperClassWriter::writeData(axis->label_srv, axisid, isCollective, 0);
+ 
                 SuperClassWriter::definition_start();
-
                 break;
               }
               case ONE_FILE:
               {
-                // CArray<double,1> axis_value(axis->zoom_n);
-                // axis_value = axis->value;
                 std::vector<StdSize> start(1), startBounds(2) ;
                 std::vector<StdSize> count(1), countBounds(2) ;
@@ -1201,5 +1224,5 @@
                 SuperClassWriter::writeData(axis_value, axisid, isCollective, 0, &start, &count);
 
-                if (!axis->bounds.isEmpty())
+                if (!axis->bounds.isEmpty()&& axis->label.isEmpty())
                 {
                   axis_bounds.resize(2, indexToWrite.numElements());
@@ -1211,4 +1234,7 @@
                   SuperClassWriter::writeData(axis->bounds, axisBoundsId, isCollective, 0, &startBounds, &countBounds);
                 }
+
+                // Need to check after
+                if (! axis->label.isEmpty())  SuperClassWriter::writeData(axis->label_srv, axisid, isCollective, 0);
 
                 SuperClassWriter::definition_start();
@@ -1233,6 +1259,5 @@
           ERROR("CNc4DataOutput::writeAxis_(CAxis* axis)", << msg);
         }
-      
-      axis->addRelFile(this->filename);
+        axis->addRelFile(this->filename);
      }
 
@@ -1247,4 +1272,10 @@
         else setWrittenAxis(scalaId);
 
+        nc_type typePrec ;
+        if (scalar->prec.isEmpty()) typePrec =  NC_FLOAT ;
+        else if (scalar->prec==4)  typePrec =  NC_FLOAT ;
+        else if (scalar->prec==8)   typePrec =  NC_DOUBLE ;
+
+        
         try
         {
@@ -1253,5 +1284,5 @@
 //            dims.push_back(scalaId);
             std::vector<StdString> dims;
-            SuperClassWriter::addVariable(scalaId, NC_FLOAT, dims);
+            SuperClassWriter::addVariable(scalaId, typePrec, dims);
 
             if (!scalar->name.isEmpty())
@@ -1550,182 +1581,169 @@
       void CNc4DataOutput::writeField_(CField* field)
       {
-         CContext* context = CContext::getCurrent() ;
-         CContextServer* server=context->server ;
-
-         std::vector<StdString> dims, coodinates;
-         CGrid* grid = field->grid;
-         if (!grid->doGridHaveDataToWrite())
+        CContext* context = CContext::getCurrent() ;
+        CContextServer* server=context->server ;
+
+        std::vector<StdString> dims, coodinates;
+        CGrid* grid = field->grid;
+        if (!grid->doGridHaveDataToWrite())
           if (SuperClass::type==MULTI_FILE) return ;
 
-         CArray<int,1> axisDomainOrder = grid->axis_domain_order;
-         int numElement = axisDomainOrder.numElements(), idxDomain = 0, idxAxis = 0, idxScalar = 0;
-         std::vector<StdString> domainList = grid->getDomainList();
-         std::vector<StdString> axisList   = grid->getAxisList();
-         std::vector<StdString> scalarList = grid->getScalarList();
-
-         StdString timeid  = getTimeCounterName();
-         StdString dimXid,dimYid;
-         std::deque<StdString> dimIdList, dimCoordList;
-         bool hasArea = false;
-         StdString cellMeasures = "area:";
-         bool compressedOutput = !field->indexed_output.isEmpty() && field->indexed_output;
-
-         for (int i = 0; i < numElement; ++i)
-         {
-           if (2 == axisDomainOrder(i))
-           {
-             CDomain* domain = CDomain::get(domainList[idxDomain]);
-             StdString domId = domain->getDomainOutputName();
-             StdString appendDomId  = singleDomain ? "" : "_" + domId ;
-
-             if (compressedOutput && domain->isCompressible() && domain->type != CDomain::type_attr::unstructured)
-             {
-               dimIdList.push_back(domId + "_points");
-               field->setUseCompressedOutput();
-             }
-
-             switch (domain->type)
-             {
-               case CDomain::type_attr::curvilinear:
-                 if (!compressedOutput || !domain->isCompressible())
-                 {
-                   dimXid     = StdString("x").append(appendDomId);
-                   dimIdList.push_back(dimXid);
-                   dimYid     = StdString("y").append(appendDomId);
-                   dimIdList.push_back(dimYid);
-                 }
-                 dimCoordList.push_back(StdString("nav_lon").append(appendDomId));
-                 dimCoordList.push_back(StdString("nav_lat").append(appendDomId));
-                 break ;
-               case CDomain::type_attr::rectilinear:
-                 if (!compressedOutput || !domain->isCompressible())
-                 {
-                   dimXid     = StdString("lon").append(appendDomId);
-                   dimIdList.push_back(dimXid);
-                   dimYid     = StdString("lat").append(appendDomId);
-                   dimIdList.push_back(dimYid);
-                 }
-                 break ;
-               case CDomain::type_attr::unstructured:
-               {
-           if (SuperClassWriter::useCFConvention)
-           {
-            dimXid     = StdString("cell").append(appendDomId);
-            dimIdList.push_back(dimXid);
-            dimCoordList.push_back(StdString("lon").append(appendDomId));
-            dimCoordList.push_back(StdString("lat").append(appendDomId));
+        CArray<int,1> axisDomainOrder = grid->axis_domain_order;
+        int numElement = axisDomainOrder.numElements(), idxDomain = 0, idxAxis = 0, idxScalar = 0;
+        std::vector<StdString> domainList = grid->getDomainList();
+        std::vector<StdString> axisList   = grid->getAxisList();
+        std::vector<StdString> scalarList = grid->getScalarList();        
+
+        StdString timeid  = getTimeCounterName();
+        StdString dimXid,dimYid;
+        std::deque<StdString> dimIdList, dimCoordList;
+        bool hasArea = false;
+        StdString cellMeasures = "area:";
+        bool compressedOutput = !field->indexed_output.isEmpty() && field->indexed_output;
+
+        for (int i = 0; i < numElement; ++i)
+        {
+          if (2 == axisDomainOrder(i))
+          {
+            CDomain* domain = CDomain::get(domainList[idxDomain]);
+            StdString domId = domain->getDomainOutputName();
+            StdString appendDomId  = singleDomain ? "" : "_" + domId ;
+
+            if (compressedOutput && domain->isCompressible() && domain->type != CDomain::type_attr::unstructured)
+            {
+              dimIdList.push_back(domId + "_points");
+              field->setUseCompressedOutput();
+            }
+
+            switch (domain->type)
+            {
+              case CDomain::type_attr::curvilinear:
+                if (!compressedOutput || !domain->isCompressible())
+                {
+                  dimXid     = StdString("x").append(appendDomId);
+                  dimIdList.push_back(dimXid);
+                  dimYid     = StdString("y").append(appendDomId);
+                  dimIdList.push_back(dimYid);
+                }
+                dimCoordList.push_back(StdString("nav_lon").append(appendDomId));
+                dimCoordList.push_back(StdString("nav_lat").append(appendDomId));
+              break ;
+              case CDomain::type_attr::rectilinear:
+                if (!compressedOutput || !domain->isCompressible())
+                {
+                  dimXid     = StdString("lon").append(appendDomId);
+                  dimIdList.push_back(dimXid);
+                  dimYid     = StdString("lat").append(appendDomId);
+                  dimIdList.push_back(dimYid);
+                }
+              break ;
+              case CDomain::type_attr::unstructured:
+              {
+                if (SuperClassWriter::useCFConvention)
+                {
+                  dimXid     = StdString("cell").append(appendDomId);
+                  dimIdList.push_back(dimXid);
+                  dimCoordList.push_back(StdString("lon").append(appendDomId));
+                  dimCoordList.push_back(StdString("lat").append(appendDomId));
+                }
+                else
+                {
+                  StdString domainName = domain->name;
+                  if (domain->nvertex == 1)
+                  {
+                    dimXid     = "n" + domainName + "_node";
+                    dimIdList.push_back(dimXid);
+                    dimCoordList.push_back(StdString(domainName + "_node_x"));
+                    dimCoordList.push_back(StdString(domainName + "_node_y"));
+                  }
+                  else if (domain->nvertex == 2)
+                  {
+                    dimXid     = "n" + domainName + "_edge";
+                    dimIdList.push_back(dimXid);
+                    dimCoordList.push_back(StdString(domainName + "_edge_x"));
+                    dimCoordList.push_back(StdString(domainName + "_edge_y"));
+                  }
+                  else
+                  {
+                    dimXid     = "n" + domainName + "_face";
+                    dimIdList.push_back(dimXid);
+                    dimCoordList.push_back(StdString(domainName + "_face_x"));
+                    dimCoordList.push_back(StdString(domainName + "_face_y"));
+                  }
+                }  // ugrid convention
+              }  // case unstructured domain
+            }
+
+            if (domain->hasArea)
+            {
+              hasArea = true;
+              cellMeasures += " area" + appendDomId;
+            }
+            ++idxDomain;
           }
-           else
-           {
-            StdString domainName = domain->name;
-            if (domain->nvertex == 1)
+          else if (1 == axisDomainOrder(i))
+          {
+            CAxis* axis = CAxis::get(axisList[idxAxis]);
+            StdString axisId = axis->getAxisOutputName();
+
+            if (compressedOutput && axis->isCompressible())
             {
-              dimXid     = "n" + domainName + "_node";
-              dimIdList.push_back(dimXid);
-              dimCoordList.push_back(StdString(domainName + "_node_x"));
-              dimCoordList.push_back(StdString(domainName + "_node_y"));
-            }
-            else if (domain->nvertex == 2)
-            {
-              dimXid     = "n" + domainName + "_edge";
-              dimIdList.push_back(dimXid);
-              dimCoordList.push_back(StdString(domainName + "_edge_x"));
-              dimCoordList.push_back(StdString(domainName + "_edge_y"));
+              dimIdList.push_back(axisId + "_points");
+              field->setUseCompressedOutput();
             }
             else
-            {
-              dimXid     = "n" + domainName + "_face";
-              dimIdList.push_back(dimXid);
-              dimCoordList.push_back(StdString(domainName + "_face_x"));
-              dimCoordList.push_back(StdString(domainName + "_face_y"));
-            }
-          }  // ugrid convention
-        }  // case unstructured domain
-             }
-
-             if (domain->hasArea)
-             {
-               hasArea = true;
-               cellMeasures += " area" + appendDomId;
-             }
-             ++idxDomain;
-           }
-           else if (1 == axisDomainOrder(i))
-           {
-             CAxis* axis = CAxis::get(axisList[idxAxis]);
-             StdString axisId = axis->getAxisOutputName();
-
-             if (compressedOutput && axis->isCompressible())
-             {
-               dimIdList.push_back(axisId + "_points");
-               field->setUseCompressedOutput();
-             }
-             else
-               dimIdList.push_back(axisId);
-
-             dimCoordList.push_back(axisId);
-             ++idxAxis;
-           }
-           else // scalar
-           {
+              dimIdList.push_back(axisId);
+
+            dimCoordList.push_back(axisId);
+            ++idxAxis;
+          }
+          else // scalar
+          {
              /* Do nothing here */
-           }
-         }
-
-/*
-         StdString lonid_loc = (server->intraCommSize > 1)
-                             ? StdString("lon").append(appendDomid).append("_local")
-                             : lonid;
-         StdString latid_loc = (server->intraCommSize > 1)
-                             ? StdString("lat").append(appendDomid).append("_local")
-                             : latid;
-*/
-         StdString fieldid = field->getFieldOutputName();
-
-         nc_type type ;
-         if (field->prec.isEmpty()) type =  NC_FLOAT ;
-         else
-         {
-           if (field->prec==2) type = NC_SHORT ;
-           else if (field->prec==4)  type =  NC_FLOAT ;
-           else if (field->prec==8)   type =  NC_DOUBLE ;
-         }
-
-         bool wtime   = !(!field->operation.isEmpty() && field->getOperationTimeType() == func::CFunctor::once);
-
-         if (wtime)
-         {
-
-            //StdOStringStream oss;
-           // oss << "time_" << field->operation.getValue()
-           //     << "_" << field->getRelFile()->output_freq.getValue();
-          //oss
-            if (field->getOperationTimeType() == func::CFunctor::instant) coodinates.push_back(string("time_instant"));
-            else if (field->getOperationTimeType() == func::CFunctor::centered) coodinates.push_back(string("time_centered"));
-            dims.push_back(timeid);
-         }
-
-         if (compressedOutput && grid->isCompressible())
-         {
-           dims.push_back(grid->getId() + "_points");
-           field->setUseCompressedOutput();
-         }
-         else
-         {
-           while (!dimIdList.empty())
-           {
-             dims.push_back(dimIdList.back());
-             dimIdList.pop_back();
-           }
-         }
-
-         while (!dimCoordList.empty())
-         {
-           coodinates.push_back(dimCoordList.back());
-           dimCoordList.pop_back();
-         }
-
-         try
-         {
+          }
+        }
+
+        StdString fieldid = field->getFieldOutputName();
+
+        nc_type type ;
+        if (field->prec.isEmpty()) type =  NC_FLOAT ;
+        else
+        {
+          if (field->prec==2) type = NC_SHORT ;
+          else if (field->prec==4)  type =  NC_FLOAT ;
+          else if (field->prec==8)   type =  NC_DOUBLE ;
+        }
+
+        bool wtime   = !(!field->operation.isEmpty() && field->getOperationTimeType() == func::CFunctor::once);
+
+        if (wtime)
+        {
+          if (field->hasTimeInstant && hasTimeInstant) coodinates.push_back(string("time_instant"));
+          else if (field->hasTimeCentered && hasTimeCentered)  coodinates.push_back(string("time_centered"));
+          dims.push_back(timeid);
+        }
+
+        if (compressedOutput && grid->isCompressible())
+        {
+          dims.push_back(grid->getId() + "_points");
+          field->setUseCompressedOutput();
+        }
+        else
+        {
+          while (!dimIdList.empty())
+          {
+            dims.push_back(dimIdList.back());
+            dimIdList.pop_back();
+          }
+        }
+
+        while (!dimCoordList.empty())
+        {
+          coodinates.push_back(dimCoordList.back());
+          dimCoordList.pop_back();
+        }
+
+        try
+        {
            SuperClassWriter::addVariable(fieldid, type, dims);
 
@@ -1742,5 +1760,25 @@
                  ("units", field->unit.getValue(), &fieldid);
 
-            if (!field->valid_min.isEmpty())
+           // Ugrid field attributes "mesh" and "location"
+           if (!SuperClassWriter::useCFConvention)
+           {
+            if (!domainList.empty())
+            {
+              CDomain* domain = CDomain::get(domainList[0]); // Suppose that we have only domain
+              StdString mesh = domain->name;
+              SuperClassWriter::addAttribute("mesh", mesh, &fieldid);
+              StdString location;
+              if (domain->nvertex == 1)
+                location = "node";
+              else if (domain->nvertex == 2)
+                location = "edge";
+              else if (domain->nvertex > 2)
+                location = "face";
+              SuperClassWriter::addAttribute("location", location, &fieldid);
+            }
+
+           }
+
+           if (!field->valid_min.isEmpty())
               SuperClassWriter::addAttribute
                  ("valid_min", field->valid_min.getValue(), &fieldid);
@@ -1771,29 +1809,29 @@
            if (!field->cell_methods.isEmpty())
            {
-             StdString cellMethodString = field->cell_methods;
-             if (field->cell_methods_mode.isEmpty() ||
+              StdString cellMethodString = field->cell_methods;
+              if (field->cell_methods_mode.isEmpty() ||
                  (CField::cell_methods_mode_attr::overwrite == field->cell_methods_mode))
-             {
-               SuperClassWriter::addAttribute("cell_methods", cellMethodString, &fieldid);
-               alreadyAddCellMethod = true;
-             }
-             else
-             {
-               switch (field->cell_methods_mode)
-               {
-               case (CField::cell_methods_mode_attr::prefix):
-                 cellMethodsPrefix = cellMethodString;
-                 cellMethodsPrefix += " ";
-                 break;
-               case (CField::cell_methods_mode_attr::suffix):
-                 cellMethodsSuffix = " ";
-                 cellMethodsSuffix += cellMethodString;
-                 break;
-               case (CField::cell_methods_mode_attr::none):
-                 break;
-               default:
-                 break;
-               }
-             }
+              {
+                SuperClassWriter::addAttribute("cell_methods", cellMethodString, &fieldid);
+                alreadyAddCellMethod = true;
+              }
+              else
+              {
+                switch (field->cell_methods_mode)
+                {
+                  case (CField::cell_methods_mode_attr::prefix):
+                    cellMethodsPrefix = cellMethodString;
+                    cellMethodsPrefix += " ";
+                    break;
+                  case (CField::cell_methods_mode_attr::suffix):
+                    cellMethodsSuffix = " ";
+                    cellMethodsSuffix += cellMethodString;
+                    break;
+                  case (CField::cell_methods_mode_attr::none):
+                    break;
+                  default:
+                    break;
+                }
+              }
            }
 
@@ -1881,17 +1919,18 @@
          singleDomain = (file->nbDomains == 1);
 
+         StdString conv_str ;
+         if (file->convention_str.isEmpty())
+         {
+            if (SuperClassWriter::useCFConvention) conv_str="CF-1.6" ;
+            else conv_str="UGRID" ;
+         }
+         else conv_str=file->convention_str ;
+           
          try
          {
-       if (SuperClassWriter::useCFConvention)
-             this->writeFileAttributes(filename, description,
-                                       StdString("CF-1.5"),
-                                       StdString("An IPSL model"),
-                                       this->getTimeStamp());
-           else
-             this->writeFileAttributes(filename, description,
-                                       StdString("UGRID"),
-                                       StdString("An IPSL model"),
-                                       this->getTimeStamp());
-
+           this->writeFileAttributes(filename, description,
+                                      conv_str,
+                                      StdString("An IPSL model"),
+                                      this->getTimeStamp());
 
            if (!appendMode)
@@ -2017,8 +2056,13 @@
          struct tm * timeinfo = NULL;
          char buffer [buffer_size];
-
+         StdString formatStr;
+         if (file->time_stamp_format.isEmpty()) formatStr="%Y-%b-%d %H:%M:%S %Z" ;
+         else formatStr=file->time_stamp_format;
+
+//         time ( &rawtime );
+//         timeinfo = localtime ( &rawtime );
          time ( &rawtime );
-         timeinfo = localtime ( &rawtime );
-         strftime (buffer, buffer_size, "%Y-%b-%d %H:%M:%S %Z", timeinfo);
+         timeinfo = gmtime ( &rawtime );
+         strftime (buffer, buffer_size, formatStr.c_str(), timeinfo);
 
          return (StdString(buffer));
@@ -2033,8 +2077,14 @@
         CGrid* grid = field->grid;
 
-        if (field->getNStep()<1) return ;
+        if (field->getNStep()<1) 
+        {
+          return;
+        }
         
         if (!grid->doGridHaveDataToWrite())
-          if (SuperClass::type == MULTI_FILE || !isCollective) return;
+          if (SuperClass::type == MULTI_FILE || !isCollective)
+          {
+            return;
+          }
 
         StdString fieldid = field->getFieldOutputName();
@@ -2042,19 +2092,23 @@
         StdOStringStream oss;
         string timeAxisId;
-        if (field->getOperationTimeType() == func::CFunctor::instant) timeAxisId = "time_instant";
-        else if (field->getOperationTimeType() == func::CFunctor::centered) timeAxisId = "time_centered";
+        if (field->hasTimeInstant) timeAxisId = "time_instant";
+        else if (field->hasTimeCentered) timeAxisId = "time_centered";
 
         StdString timeBoundId = getTimeCounterName() + "_bounds";
 
         StdString timeAxisBoundId;
-        if (field->getOperationTimeType() == func::CFunctor::instant) timeAxisBoundId = "time_instant_bounds";
-        else if (field->getOperationTimeType() == func::CFunctor::centered) timeAxisBoundId = "time_centered_bounds";
+        if (field->hasTimeInstant) timeAxisBoundId = "time_instant_bounds";
+        else if (field->hasTimeCentered) timeAxisBoundId = "time_centered_bounds";
 
         if (!field->wasWritten())
         {
-          if (appendMode && field->file->record_offset.isEmpty() &&
-               field->getOperationTimeType() != func::CFunctor::once)
+          if (appendMode && field->file->record_offset.isEmpty() && 
+              field->getOperationTimeType() != func::CFunctor::once)
           {
-            field->resetNStep(getRecordFromTime(field->last_Write_srv) + 1);
+            double factorUnit;
+            if (!field->file->time_units.isEmpty() && field->file->time_units==CFile::time_units_attr::days)
+            factorUnit=context->getCalendar()->getDayLengthInSeconds() ;
+            else factorUnit=1 ;
+            field->resetNStep(getRecordFromTime(field->last_Write_srv,factorUnit) + 1);
           }
 
@@ -2069,4 +2123,7 @@
 
         bool wtime = (field->getOperationTimeType() != func::CFunctor::once);
+        bool wtimeCounter =false ;
+        bool wtimeData =false ;
+        
 
         if (wtime)
@@ -2075,34 +2132,48 @@
           Time lastLastWrite = field->lastlast_Write_srv;
 
-          if (field->getOperationTimeType() == func::CFunctor::instant)
-            time_data(0) = lastWrite;
-          else if (field->getOperationTimeType() == func::CFunctor::centered)
+          
+          if (field->hasTimeInstant)
+          {
+            time_data(0) = time_data_bound(1) = lastWrite;
+            time_data_bound(0) = time_data_bound(1) = lastWrite;
+            if (timeCounterType==instant)
+            {
+              time_counter(0) = time_data(0);
+              time_counter_bound(0) = time_data_bound(0);
+              time_counter_bound(1) = time_data_bound(1);
+              wtimeCounter=true ;
+            }
+            if (hasTimeInstant) wtimeData=true ;
+          }
+          else if (field->hasTimeCentered)
+          {
             time_data(0) = (lastWrite + lastLastWrite) / 2;
-
-          if (field->getOperationTimeType() == func::CFunctor::instant)
-            time_data_bound(0) = time_data_bound(1) = lastWrite;
-          else if (field->getOperationTimeType() == func::CFunctor::centered)
-          {
             time_data_bound(0) = lastLastWrite;
             time_data_bound(1) = lastWrite;
+            if (timeCounterType==centered)
+            {
+              time_counter(0) = time_data(0) ;
+              time_counter_bound(0) = time_data_bound(0) ;
+              time_counter_bound(1) = time_data_bound(1) ;
+              wtimeCounter=true ;
+            }
+            if (hasTimeCentered) wtimeData=true ;
           }
 
-          if (field->file->time_counter == CFile::time_counter_attr::instant)
-            time_counter(0) = lastWrite;
-          else if (field->file->time_counter == CFile::time_counter_attr::centered)
-            time_counter(0) = (lastWrite + lastLastWrite) / 2;
-          else if (field->file->time_counter == CFile::time_counter_attr::record)
+          if (timeCounterType==record)
+          {
             time_counter(0) = field->getNStep() - 1;
-
-
-          if (field->file->time_counter == CFile::time_counter_attr::instant)
-            time_counter_bound(0) = time_counter_bound(1) = lastWrite;
-          else if (field->file->time_counter == CFile::time_counter_attr::centered)
+            time_counter_bound(0) = time_counter_bound(1) = field->getNStep() - 1;
+            wtimeCounter=true ;
+          }
+
+          if (!field->file->time_units.isEmpty() && field->file->time_units==CFile::time_units_attr::days)
           {
-            time_counter_bound(0) = lastLastWrite;
-            time_counter_bound(1) = lastWrite;
+            double secByDay=context->getCalendar()->getDayLengthInSeconds() ;
+            time_data/=secByDay;
+            time_data_bound/=secByDay;
+            time_counter/=secByDay;
+            time_counter_bound/=secByDay;
           }
-          else if (field->file->time_counter == CFile::time_counter_attr::record)
-            time_counter_bound(0) = time_counter_bound(1) = field->getNStep() - 1;
         }
 
@@ -2140,15 +2211,25 @@
               case (MULTI_FILE) :
               {
+                 CTimer::get("Files : writing data").resume();
                  SuperClassWriter::writeData(fieldData, fieldid, isCollective, field->getNStep() - 1);
+                 CTimer::get("Files : writing data").suspend();
                  if (wtime)
                  {
-                   SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep() - 1);
-                   SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1);
-                   if (field->file->time_counter != CFile::time_counter_attr::none)
+                   CTimer::get("Files : writing time axis").resume();
+                   if ( wtimeData)
                    {
-                     SuperClassWriter::writeData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1);
-                     if (field->file->time_counter != CFile::time_counter_attr::record)
-                       SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1);
+//                     SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep() - 1);
+//                     SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1);
+                       SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot);
+                       SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot);
+                  }
+                   if (wtimeCounter)
+                   {
+//                     SuperClassWriter::writeData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1);
+//                     if (timeCounterType!=record) SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1);
+                     SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1,isRoot);
+                     if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot);
                    }
+                   CTimer::get("Files : writing time axis").suspend();
                  }
                  break;
@@ -2227,5 +2308,5 @@
                       }
                     }
-                  }                
+                  }
                 }
                 else
@@ -2278,16 +2359,29 @@
                 }
 
+
+                CTimer::get("Files : writing data").resume();
                 SuperClassWriter::writeData(fieldData, fieldid, isCollective, field->getNStep() - 1, &start, &count);
-                if (wtime)
-                {
-                   SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot);
-                   SuperClassWriter::writeTimeAxisData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot);
-                   if (field->file->time_counter != CFile::time_counter_attr::none)
+                CTimer::get("Files : writing data").suspend();
+
+                 if (wtime)
+                 {
+                   CTimer::get("Files : writing time axis").resume();
+                   if ( wtimeData)
                    {
-                     SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1, isRoot);
-                     if (field->file->time_counter != CFile::time_counter_attr::record)
-                       SuperClassWriter::writeTimeAxisData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot);
+//                     SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep() - 1);
+//                     SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1);
+                     SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot);
+                     SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot);
                    }
-                }
+                   if (wtimeCounter)
+                   {
+//                     SuperClassWriter::writeData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1);
+//                     if (timeCounterType!=record) SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1);
+                     SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1,isRoot);
+                     if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot);
+
+                   }
+                   CTimer::get("Files : writing time axis").suspend();  
+                 }
 
                 break;
@@ -2313,74 +2407,199 @@
       {
          StdOStringStream oss;
-
+         bool createInstantAxis=false ;
+         bool createCenteredAxis=false ;
+         bool createTimeCounterAxis=false ;
+         
          if (field->getOperationTimeType() == func::CFunctor::once) return ;
 
-//         oss << "time_" << field->operation.getValue()
-//             << "_" << field->getRelFile()->output_freq.getValue();
-
-//         StdString axisid = oss.str();
-//         if (field->getOperationTimeType() == func::CFunctor::centered) axisid="time_centered" ;
-//         else if (field->getOperationTimeType() == func::CFunctor::instant) axisid="time_instant" ;
-
-         StdString axisid("time_centered") ;
-         StdString axisBoundId("time_centered_bounds");
+
+         StdString axisId ;
+         StdString axisBoundId;
          StdString timeid(getTimeCounterName());
          StdString timeBoundId("axis_nbounds");
 
-         if (field->getOperationTimeType() == func::CFunctor::instant)
-         {
-            axisid = "time_instant";
-            axisBoundId = "time_instant_bounds";
-         }
-
+         StdString strTimeUnits ;
+         if (!field->file->time_units.isEmpty() && field->file->time_units==CFile::time_units_attr::days) strTimeUnits="days since " ;
+         else  strTimeUnits="seconds since " ;
+ 
+         if (field->getOperationTimeType() == func::CFunctor::instant) field->hasTimeInstant = true;
+         if (field->getOperationTimeType() == func::CFunctor::centered) field->hasTimeCentered = true;
+
+
+         if (field->file->time_counter.isEmpty())
+         {
+           if (timeCounterType==none) createTimeCounterAxis=true ;
+           if (field->hasTimeCentered)
+           {
+             timeCounterType=centered ;
+             if (!hasTimeCentered) createCenteredAxis=true ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (timeCounterType==none) timeCounterType=instant ;
+             if (!hasTimeInstant) createInstantAxis=true ;
+           }
+         }
+         else if (field->file->time_counter==CFile::time_counter_attr::instant)
+         {
+           if (field->hasTimeCentered)
+           {
+             if (!hasTimeCentered) createCenteredAxis=true ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (timeCounterType==none) createTimeCounterAxis=true ;
+             timeCounterType=instant ;
+             if (!hasTimeInstant) createInstantAxis=true ;
+           }
+         }
+         else if (field->file->time_counter==CFile::time_counter_attr::centered)
+         {
+           if (field->hasTimeCentered)
+           {
+             if (timeCounterType==none) createTimeCounterAxis=true ;
+             timeCounterType=centered ;
+             if (!hasTimeCentered) createCenteredAxis=true ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (!hasTimeInstant) createInstantAxis=true ;
+           }
+         }
+         else if (field->file->time_counter==CFile::time_counter_attr::instant_exclusive)
+         {
+           if (field->hasTimeCentered)
+           {
+             if (!hasTimeCentered) createCenteredAxis=true ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (timeCounterType==none) createTimeCounterAxis=true ;
+             timeCounterType=instant ;
+           }
+         }
+         else if (field->file->time_counter==CFile::time_counter_attr::centered_exclusive)
+         {
+           if (field->hasTimeCentered)
+           {
+             if (timeCounterType==none) createTimeCounterAxis=true ;
+             timeCounterType=centered ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (!hasTimeInstant) createInstantAxis=true ;
+           }
+         }
+         else if (field->file->time_counter==CFile::time_counter_attr::exclusive)
+         {
+           if (field->hasTimeCentered)
+           {
+             if (timeCounterType==none) createTimeCounterAxis=true ;
+             if (timeCounterType==instant) createInstantAxis=true ;
+             timeCounterType=centered ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (timeCounterType==none)
+             {
+               createTimeCounterAxis=true ;
+               timeCounterType=instant ;
+             }
+             if (timeCounterType==centered)
+             {
+               if (!hasTimeInstant) createInstantAxis=true ;
+             }
+           }
+         }
+         else if (field->file->time_counter==CFile::time_counter_attr::none)
+         {
+           if (field->hasTimeCentered)
+           {
+             if (!hasTimeCentered) createCenteredAxis=true ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (!hasTimeInstant) createInstantAxis=true ;
+           }
+         }
+         else if (field->file->time_counter==CFile::time_counter_attr::record)
+         {
+           if (timeCounterType==none) createTimeCounterAxis=true ;
+           timeCounterType=record ;
+           if (field->hasTimeCentered)
+           {
+             if (!hasTimeCentered) createCenteredAxis=true ;
+           }
+           if (field->hasTimeInstant)
+           {
+             if (!hasTimeInstant) createInstantAxis=true ;
+           }
+         }
+         
+         if (createInstantAxis)
+         {
+           axisId="time_instant" ;
+           axisBoundId="time_instant_bounds";
+           hasTimeInstant=true ;
+         }
+
+         if (createCenteredAxis)
+         {
+           axisId="time_centered" ;
+           axisBoundId="time_centered_bounds";
+           hasTimeCentered=true ;
+         }
+
+         
          try
          {
-          // Adding time_instant or time_centered
-           std::vector<StdString> dims;
-           dims.push_back(timeid);
-           if (!SuperClassWriter::varExist(axisid))
-           {
-              SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims);
-
-              CDate timeOrigin=cal->getTimeOrigin() ;
-              StdOStringStream oss2;
-  //            oss2<<initDate.getYear()<<"-"<<initDate.getMonth()<<"-"<<initDate.getDay()<<" "
-  //                <<initDate.getHour()<<"-"<<initDate.getMinute()<<"-"<<initDate.getSecond() ;
-              StdString strInitdate=oss2.str() ;
-              StdString strTimeOrigin=timeOrigin.toString() ;
-              this->writeTimeAxisAttributes
-                 (axisid, cal->getType(),
-                  StdString("seconds since ").append(strTimeOrigin),
-                  strTimeOrigin, axisBoundId);
-           }
-
-           // Adding time_instant_bounds or time_centered_bounds variables
-           if (!SuperClassWriter::varExist(axisBoundId))
-           {
-              dims.clear() ;
+            std::vector<StdString> dims;
+            
+            if (createInstantAxis || createCenteredAxis)
+            {
+              // Adding time_instant or time_centered
               dims.push_back(timeid);
-              dims.push_back(timeBoundId);
-              SuperClassWriter::addVariable(axisBoundId, NC_DOUBLE, dims);
-           }
-
-           if (field->file->time_counter != CFile::time_counter_attr::none)
+              if (!SuperClassWriter::varExist(axisId))
+              {
+                SuperClassWriter::addVariable(axisId, NC_DOUBLE, dims);
+
+                CDate timeOrigin=cal->getTimeOrigin() ;
+                StdOStringStream oss2;
+                StdString strInitdate=oss2.str() ;
+                StdString strTimeOrigin=timeOrigin.toString() ;
+                this->writeTimeAxisAttributes(axisId, cal->getType(),strTimeUnits+strTimeOrigin,
+                                              strTimeOrigin, axisBoundId);
+             }
+
+             // Adding time_instant_bounds or time_centered_bounds variables
+             if (!SuperClassWriter::varExist(axisBoundId))
+             {
+                dims.clear() ;
+                dims.push_back(timeid);
+                dims.push_back(timeBoundId);
+                SuperClassWriter::addVariable(axisBoundId, NC_DOUBLE, dims);
+             }
+           }
+
+           if (createTimeCounterAxis)
            {
              // Adding time_counter
-             axisid = getTimeCounterName();
+             axisId = getTimeCounterName();
              axisBoundId = getTimeCounterName() + "_bounds";
              dims.clear();
              dims.push_back(timeid);
-             if (!SuperClassWriter::varExist(axisid))
+             if (!SuperClassWriter::varExist(axisId))
              {
-                SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims);
-                SuperClassWriter::addAttribute("axis", string("T"), &axisid);
-
-                if (field->file->time_counter != CFile::time_counter_attr::record)
+                SuperClassWriter::addVariable(axisId, NC_DOUBLE, dims);
+                SuperClassWriter::addAttribute("axis", string("T"), &axisId);
+
+                if (field->file->time_counter.isEmpty() || 
+                   (field->file->time_counter != CFile::time_counter_attr::record))
                 {
                   CDate timeOrigin = cal->getTimeOrigin();
                   StdString strTimeOrigin = timeOrigin.toString();
 
-                  this->writeTimeAxisAttributes(axisid, cal->getType(),
-                                                StdString("seconds since ").append(strTimeOrigin),
+                  this->writeTimeAxisAttributes(axisId, cal->getType(),
+                                                strTimeUnits+strTimeOrigin,
                                                 strTimeOrigin, axisBoundId);
                 }
@@ -2388,5 +2607,5 @@
 
              // Adding time_counter_bound dimension
-             if (field->file->time_counter != CFile::time_counter_attr::record)
+             if (field->file->time_counter.isEmpty() || (field->file->time_counter != CFile::time_counter_attr::record))
              {
                 if (!SuperClassWriter::varExist(axisBoundId))
@@ -2563,6 +2782,18 @@
            SuperClassWriter::addAttribute("title"      , description);
            SuperClassWriter::addAttribute("Conventions", conventions);
-           SuperClassWriter::addAttribute("production" , production);
-           SuperClassWriter::addAttribute("timeStamp"  , timeStamp);
+           // SuperClassWriter::addAttribute("production" , production);
+
+           StdString timeStampStr ;
+           if (file->time_stamp_name.isEmpty()) timeStampStr="timeStamp" ;
+           else timeStampStr=file->time_stamp_name ;
+           SuperClassWriter::addAttribute(timeStampStr, timeStamp);
+
+           StdString uuidName ;
+           if (file->uuid_name.isEmpty()) uuidName="uuid" ;
+           else uuidName=file->uuid_name ;
+
+           if (file->uuid_format.isEmpty()) SuperClassWriter::addAttribute(uuidName, getUuidStr());
+           else SuperClassWriter::addAttribute(uuidName, getUuidStr(file->uuid_format));
+          
          }
          catch (CNetCdfException& e)
@@ -2616,5 +2847,5 @@
       ///--------------------------------------------------------------
 
-      StdSize CNc4DataOutput::getRecordFromTime(Time time)
+      StdSize CNc4DataOutput::getRecordFromTime(Time time, double factorUnit)
       {
         std::map<Time, StdSize>::const_iterator it = timeToRecordCache.find(time);
@@ -2622,15 +2853,17 @@
         {
           StdString timeAxisBoundsId(getTimeCounterName() + "_bounds");
-          if (!SuperClassWriter::varExist(timeAxisBoundsId))
-            timeAxisBoundsId = "time_instant_bounds";
+          if (!SuperClassWriter::varExist(timeAxisBoundsId)) timeAxisBoundsId = "time_centered_bounds";
+          if (!SuperClassWriter::varExist(timeAxisBoundsId)) timeAxisBoundsId = "time_instant_bounds";
 
           CArray<double,2> timeAxisBounds;
-          SuperClassWriter::getTimeAxisBounds(timeAxisBounds, timeAxisBoundsId, isCollective);
-
+          std::vector<StdSize> dimSize(SuperClassWriter::getDimensions(timeAxisBoundsId)) ;
+          
           StdSize record = 0;
           double dtime(time);
-          for (int n = timeAxisBounds.extent(1) - 1; n >= 0; n--)
+          for (int n = dimSize[0] - 1; n >= 0; n--)
           {
-            if (timeAxisBounds(1, n) < dtime)
+            SuperClassWriter::getTimeAxisBounds(timeAxisBounds, timeAxisBoundsId, isCollective, n);
+            timeAxisBounds*=factorUnit ;
+            if (timeAxisBounds(1, 0) < dtime)
             {
               record = n + 1;
Index: /XIOS/dev/dev_olga/src/io/nc4_data_output.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/nc4_data_output.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/nc4_data_output.hpp	(revision 1158)
@@ -23,7 +23,7 @@
             /// Constructeurs ///
             CNc4DataOutput
-               (const StdString & filename, bool exist);
+               (CFile* file, const StdString & filename, bool exist);
             CNc4DataOutput
-               (const StdString & filename, bool exist, bool useClassicFormat,
+               (CFile* file, const StdString & filename, bool exist, bool useClassicFormat,
                 bool useCFConvention,
                 MPI_Comm comm_file, bool multifile, bool isCollective = true,
@@ -96,5 +96,5 @@
                                      const StdString & nav_model);
 
-            StdSize getRecordFromTime(Time time);
+            StdSize getRecordFromTime(Time time, double factorUnit);
 
          private :
@@ -123,4 +123,8 @@
             std::set<std::string> writtenAxis, writtenCompressedAxis;
             std::set<std::string> writtenScalar;
+
+            enum { none, centered, instant, record} timeCounterType ;
+            bool hasTimeInstant ;
+            bool hasTimeCentered ;
       }; // class CNc4DataOutput
 
Index: /XIOS/dev/dev_olga/src/io/netCdfInterface.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/netCdfInterface.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/netCdfInterface.cpp	(revision 1158)
@@ -967,4 +967,10 @@
 }
 
+template<>
+int CNetCdfInterface::ncGetVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, char* data)
+{
+  return nc_get_vara_text(ncid, varid, start, count, data);
+}
+
 // Some specializations of putVariableType
 template<>
@@ -984,4 +990,10 @@
 {
   return nc_put_vara_int(ncid, varid, start, count, data);
+}
+
+template<>
+int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const char* data)
+{
+  return nc_put_vara_text(ncid, varid, start, count, data);
 }
 
Index: /XIOS/dev/dev_olga/src/io/netCdfInterface_decl.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/netCdfInterface_decl.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/netCdfInterface_decl.cpp	(revision 1158)
@@ -33,5 +33,6 @@
   macroPutVar(float)
   macroPutVar(int)
-
+  macroPutVar(char)
+  
 #define macroType(type, ncType) \
   template<> nc_type CNetCdfInterface::getNcType<type>() { return ncType; }
Index: /XIOS/dev/dev_olga/src/io/netCdfInterface_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/netCdfInterface_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/netCdfInterface_impl.hpp	(revision 1158)
@@ -121,16 +121,4 @@
       inqVarName(ncid, varId, varName);
       sstr << "Unable to write data given the location id: " << ncid << " and the variable whose id: " << varId << " and name: " << varName << std::endl;
-//      if (status == NC_ENOTVAR )
-//        sstr <<   "Variable not found. "<< std::endl;
-//      else if (status == NC_EINVALCOORDS)
-//        sstr <<   "Index exceeds dimension bound. "<< std::endl;
-//      else if (status == NC_EEDGE)
-//        sstr <<   " Start+count exceeds dimension bound. "<< std::endl;
-//      else if (status == NC_ERANGE)
-//        sstr <<   " One or more of the values are out of range. "<< std::endl;
-//      else if (status == NC_EINDEFINE)
-//        sstr <<   " Operation not allowed in define mode. "<< std::endl;
-//      else if (status == NC_EBADID)
-//        sstr <<   "Bad ncid. "<< std::endl;
       throw CNetCdfException(sstr.str());
     }
Index: /XIOS/dev/dev_olga/src/io/onetcdf4.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/onetcdf4.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/onetcdf4.cpp	(revision 1158)
@@ -7,4 +7,5 @@
 #include "netCdfInterface.hpp"
 #include "netCdfException.hpp"
+#include "timer.hpp"
 
 namespace xios
@@ -55,9 +56,11 @@
          if (!append || !std::ifstream(filename.c_str()))
          {
+            CTimer::get("Files : create").resume();
             if (wmpi)
                CNetCdfInterface::createPar(filename, mode, *comm, MPI_INFO_NULL, this->ncidp);
             else
                CNetCdfInterface::create(filename, mode, this->ncidp);
-
+            CTimer::get("Files : create").suspend();
+ 
             this->appendMode = false;
          }
@@ -65,9 +68,10 @@
          {
             mode |= NC_WRITE;
+            CTimer::get("Files : open").resume();
             if (wmpi)
                CNetCdfInterface::openPar(filename, mode, *comm, MPI_INFO_NULL, this->ncidp);
             else
                CNetCdfInterface::open(filename, mode, this->ncidp);
-
+            CTimer::get("Files : open").suspend();
             this->appendMode = true;
          }
@@ -83,5 +87,7 @@
       void CONetCDF4::close()
       {
+        CTimer::get("Files : close").resume();
         CNetCdfInterface::close(this->ncidp);
+        CTimer::get("Files : close").suspend();
       }
 
@@ -247,5 +253,26 @@
       }
 
-      //---------------------------------------------------------------
+      void CONetCDF4::getTimeAxisBounds(CArray<double,2>& timeAxisBounds, const StdString& name, bool collective, size_t record)
+      {
+        int grpid = this->getCurrentGroup();
+        int varid = this->getVariable(name);
+
+        std::vector<StdSize> start(2), count(2);
+        start[0] = record;
+        count[0] = 1 ;
+        start[1] = 0;
+        count[1] = 2;
+
+        timeAxisBounds.resize(2, 1);
+
+        if (this->wmpi && collective)
+          CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE);
+        if (this->wmpi && !collective)
+          CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT);
+
+        CNetCdfInterface::getVaraType(grpid, varid, &start[0], &count[0], timeAxisBounds.dataFirst());
+      }
+
+
 
       const CONetCDF4::CONetCDF4Path& CONetCDF4::getCurrentPath(void) const
@@ -503,9 +530,16 @@
       void CONetCDF4::writeData_(int grpid, int varid,
                                  const std::vector<StdSize>& sstart,
+                                 const std::vector<StdSize>& scount, char* data)
+      {
+          CNetCdfInterface::putVaraType(grpid, varid, &sstart[0], &scount[0], data);
+      }
+      
+      template <>
+      void CONetCDF4::writeData_(int grpid, int varid,
+                                 const std::vector<StdSize>& sstart,
                                  const std::vector<StdSize>& scount, const int* data)
       {
           CNetCdfInterface::putVaraType(grpid, varid, &sstart[0], &scount[0], data);
       }
-
       //---------------------------------------------------------------
 
@@ -528,5 +562,7 @@
 
          this->getWriteDataInfos(name, 0, array_size,  sstart, scount, NULL, NULL);
+
          this->writeData_(grpid, varid, sstart, scount, data.dataFirst());
+
       }
 
@@ -554,15 +590,34 @@
 
          this->getWriteDataInfos(name, record, array_size,  sstart, scount, NULL, NULL);
-         if (using_netcdf_internal)
-         {
-           if (!isRoot)
-           {
-             sstart[0] = sstart[0] + 1;
-             scount[0] = 0;
-           }
-         }
          this->writeData_(grpid, varid, sstart, scount, data.dataFirst());
        }
 
+      void CONetCDF4::writeTimeAxisDataBounds(const CArray<double, 1>& data, const StdString& name,
+                                        bool collective, StdSize record, bool isRoot)
+      {
+         int grpid = this->getCurrentGroup();
+         int varid = this->getVariable(name);
+
+         map<int,size_t>::iterator it=timeAxis.find(varid);
+         if (it == timeAxis.end()) timeAxis[varid] = record;
+         else
+         {
+           if (it->second >= record) return;
+           else it->second =record;
+         }
+
+         StdSize array_size = 1;
+         std::vector<StdSize> sstart, scount;
+
+         if (this->wmpi && collective)
+            CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE);
+         if (this->wmpi && !collective)
+            CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT);
+
+         this->getWriteDataInfos(name, record, array_size,  sstart, scount, NULL, NULL);
+         this->writeData_(grpid, varid, sstart, scount, data.dataFirst());
+       }
+
+
       //---------------------------------------------------------------
 
Index: /XIOS/dev/dev_olga/src/io/onetcdf4.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/onetcdf4.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/onetcdf4.hpp	(revision 1158)
@@ -71,4 +71,6 @@
             void writeTimeAxisData(const CArray<double,1>& data, const StdString& name,
                                    bool collective, StdSize record, bool Isroot);
+            void writeTimeAxisDataBounds(const CArray<double,1>& data, const StdString& name,
+                                   bool collective, StdSize record, bool Isroot);
             /// Accesseur ///
             const CONetCDF4Path& getCurrentPath(void) const;
@@ -97,5 +99,6 @@
             const StdString& getTimeCounterName(void) const { return timeCounterName; };
 
-            void getTimeAxisBounds(CArray<double,2>& timeAxisBounds, const StdString& name, bool collective);
+            void getTimeAxisBounds(CArray<double,2>& timeAxisBounds, const StdString& name, bool collective );
+            void getTimeAxisBounds(CArray<double,2>& timeAxisBounds, const StdString& name, bool collective, size_t record);
 
             bool varExist(const StdString& varname);
Index: /XIOS/dev/dev_olga/src/io/onetcdf4_decl.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/onetcdf4_decl.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/onetcdf4_decl.cpp	(revision 1158)
@@ -14,4 +14,5 @@
   macro(double, 2)
   macro(double, 3)
+  macro(StdString, 1)
  
   template void CONetCDF4::setDefaultValue<double>(const StdString & varname, const double* value) ;
Index: /XIOS/dev/dev_olga/src/io/onetcdf4_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/io/onetcdf4_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/io/onetcdf4_impl.hpp	(revision 1158)
@@ -4,4 +4,5 @@
 #include "onetcdf4.hpp"
 #include "netCdfInterface.hpp"
+#include "timer.hpp"
 
 namespace xios
@@ -23,6 +24,9 @@
     CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT);
 
+    CTimer::get("Files : get data infos").resume();
     this->getWriteDataInfos
     (name, record, array_size,  sstart, scount, start, count);
+    CTimer::get("Files : get data infos").suspend();
+
     if (data.numElements() != array_size)
     {
@@ -34,4 +38,46 @@
 
     this->writeData_(grpid, varid, sstart, scount, data.dataFirst());
+  }
+
+  template <>
+  void CONetCDF4::writeData(const CArray<StdString, 1>& data, const StdString & name,
+                            bool collective, StdSize record,
+                            const std::vector<StdSize> * start,
+                            const std::vector<StdSize> * count)
+  {
+    int grpid = this->getCurrentGroup();
+    int varid = this->getVariable(name);
+    StdSize array_size = 1;
+    std::vector<StdSize> sstart, scount;
+
+    if (this->wmpi && collective)
+    CNetCdfInterface::varParAccess(grpid, varid, NC_COLLECTIVE);
+    if (this->wmpi && !collective)
+    CNetCdfInterface::varParAccess(grpid, varid, NC_INDEPENDENT);
+
+    CTimer::get("CONetCDF4::writeData getWriteDataInfos").resume();
+    this->getWriteDataInfos(name, record, array_size,  sstart, scount, start, count);
+    CTimer::get("CONetCDF4::writeData getWriteDataInfos").suspend();
+ 
+    if (data.numElements()*stringArrayLen != array_size)
+    {
+      ERROR("CONetCDF4::writeData(...)",
+      << "[ input array size = "  << data.numElements()
+      << ", intern array size = " << array_size
+      << " ] Invalid input data !" );
+    }
+    char* ArrayStr ;
+    char *PtrArrayStr ;
+    PtrArrayStr=ArrayStr=new char[data.numElements()*stringArrayLen] ;
+    Array<StdString,1>::const_iterator it, itb=data.begin(), ite=data.end() ;
+    for(it=itb;it!=ite;++it,PtrArrayStr+=stringArrayLen)
+    {
+      it->copy(PtrArrayStr,it->size()) ;
+      PtrArrayStr[it->size()]='\0' ;
+    }
+    CTimer::get("CONetCDF4::writeData writeData_").resume();
+    this->writeData_(grpid, varid, sstart, scount, ArrayStr);
+    CTimer::get("CONetCDF4::writeData writeData_").suspend();
+    delete [] ArrayStr ;
   }
 
Index: /XIOS/dev/dev_olga/src/memtrack.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/memtrack.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/memtrack.cpp	(revision 1158)
@@ -52,4 +52,7 @@
 {
   void addr2line(const char *file_name, char** addr, int naddr) ;
+#ifdef XIOS_MEMTRACK_LIGHT
+  void addr2line(const char *file_name, char** addr, int naddr) {} 
+#endif
 }
 /* ------------------------------------------------------------ */
@@ -59,4 +62,9 @@
 namespace MemTrack
 {
+    size_t currentMemorySize=0 ;
+    size_t maxMemorySize=0 ; 
+
+    size_t getCurrentMemorySize(void) {return currentMemorySize; }
+    size_t getMaxMemorySize(void) {return maxMemorySize ; }
 
     /* ------------------------------------------------------------ */
@@ -375,4 +383,7 @@
         // Get the offset to the user chunk and return it.
         UserChunk *pUser = GetUserAddress(pProlog);
+
+        currentMemorySize += size ;
+        if (currentMemorySize>maxMemorySize) maxMemorySize=currentMemorySize ;
         
         return pUser;
@@ -400,4 +411,5 @@
         // Unlink the block header from the list and destroy it.
         BlockHeader *pBlockHeader = GetHeaderAddress(pProlog);
+        currentMemorySize-=pBlockHeader->GetRequestedSize();
         BlockHeader::RemoveNode(pBlockHeader);
         pBlockHeader->~BlockHeader();
Index: /XIOS/dev/dev_olga/src/memtrack.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/memtrack.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/memtrack.hpp	(revision 1158)
@@ -61,5 +61,6 @@
     void TrackDumpBlocks();
     void TrackListMemoryUsage();
-
+    size_t getCurrentMemorySize(void) ;
+    size_t getMaxMemorySize(void) ;
     /* ---------------------------------------- operator * (MemStamp, ptr) */
 
Index: /XIOS/dev/dev_olga/src/node/axis.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/axis.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/axis.cpp	(revision 1158)
@@ -27,5 +27,5 @@
       , hasBounds_(false), isCompressible_(false)
       , numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0)
-      , transformationMap_(), hasValue(false), doZoomByIndex_(false)
+      , transformationMap_(), hasValue(false), doZoomByIndex_(false), hasLabel(false)
       , computedWrittenIndex_(false)
    {
@@ -38,5 +38,5 @@
       , hasBounds_(false), isCompressible_(false)
       , numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0)
-      , transformationMap_(), hasValue(false), doZoomByIndex_(false)
+      , transformationMap_(), hasValue(false), doZoomByIndex_(false), hasLabel(false)
       , computedWrittenIndex_(false)
    {
@@ -58,4 +58,10 @@
 
    ///---------------------------------------------------------------
+
+   const std::set<StdString> & CAxis::getRelFiles(void) const
+   {
+      return (this->relFiles);
+   }
+
    bool CAxis::IsWritten(const StdString & filename) const
    {
@@ -70,6 +76,10 @@
    bool CAxis::isDistributed(void) const
    {
-      return (!this->begin.isEmpty() && !this->n.isEmpty() && (this->begin + this->n < this->n_glo)) ||
-             (!this->n.isEmpty() && (this->n != this->n_glo));;
+      bool distributed = (!this->begin.isEmpty() && !this->n.isEmpty() && (this->begin + this->n < this->n_glo)) ||
+             (!this->n.isEmpty() && (this->n != this->n_glo));
+      // A same stupid condition to make sure that if there is only one client, axis
+      // should be considered to be distributed. This should be a temporary solution     
+      distributed |= (1 == CContext::getCurrent()->client->clientSize);
+      return distributed;
    }
 
@@ -132,5 +142,4 @@
    std::map<int, StdSize> CAxis::getAttributesBufferSize()
    {
-//     CContextClient* client = CContext::getCurrent()->client;
      // For now the assumption is that secondary server pools consist of the same number of procs.
      // CHANGE the line below if the assumption changes.
@@ -172,4 +181,7 @@
          if (hasBounds_)
            sizeValEvent += CArray<double,2>::size(2 * it->second.size());
+ 
+         if (hasLabel)
+           sizeValEvent += CArray<StdString,1>::size(it->second.size());
 
          size_t size = CEventClient::headerSize + getId().size() + sizeof(size_t) + std::max(sizeIndexEvent, sizeValEvent);
@@ -255,5 +267,6 @@
       this->checkZoom();
       this->checkMask();
-      this->checkBounds();      
+      this->checkBounds();
+      this->checkLabel();
    }
 
@@ -339,9 +352,22 @@
    }
 
-   void CAxis::checkEligibilityForCompressedOutput()
-   {
-     // We don't check if the mask is valid here, just if a mask has been defined at this point.
-     isCompressible_ = !mask.isEmpty();
-   }
+  void CAxis::checkLabel()
+  {
+    if (!label.isEmpty())
+    {
+      if (label.extent(0) != n)
+        ERROR("CAxis::checkLabel(void)",
+              << "The label array of the axis [ id = '" << getId() << "' , context = '" << CObjectFactory::GetCurrentContextId() << "' ] must be of dimension of axis size." << std::endl
+              << "Axis size is " << n.getValue() << "." << std::endl
+              << "label size is "<< label.extent(0)<<  " .");
+      hasLabel = true;
+    }
+    else hasLabel = false;
+  }
+  void CAxis::checkEligibilityForCompressedOutput()
+  {
+    // We don't check if the mask is valid here, just if a mask has been defined at this point.
+    isCompressible_ = !mask.isEmpty();
+  }
 
    bool CAxis::dispatchEvent(CEventServer& event)
@@ -437,5 +463,4 @@
     CContext* context = CContext::getCurrent();
 
-    // int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1;
     int nbSrvPools = (context->hasServer) ? (context->hasClient ? context->clientPrimServer.size() : 1) : 1;
     for (int p = 0; p < nbSrvPools; ++p)
@@ -729,5 +754,4 @@
     CContext* context = CContext::getCurrent();
 
-    // int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1;
     int nbSrvPools = (context->hasServer) ? (context->hasClient ? context->clientPrimServer.size() : 1) : 1;
     for (int p = 0; p < nbSrvPools; ++p)
@@ -1071,4 +1095,9 @@
       }
     }
+
+    if (hasLabel)
+    {
+      //label_srv(ind_srv) = labelVal( ind);
+    }
   }
 
@@ -1114,4 +1143,35 @@
   }
 
+  /*!
+    Compare two axis objects. 
+    They are equal if only if they have identical attributes as well as their values.
+    Moreover, they must have the same transformations.
+  \param [in] axis Compared axis
+  \return result of the comparison
+  */
+  bool CAxis::isEqual(CAxis* obj)
+  {
+    vector<StdString> excludedAttr;
+    excludedAttr.push_back("axis_ref");
+
+    bool objEqual = SuperClass::isEqual(obj, excludedAttr);    
+    if (!objEqual) return objEqual;
+
+    TransMapTypes thisTrans = this->getAllTransformations();
+    TransMapTypes objTrans  = obj->getAllTransformations();
+
+    TransMapTypes::const_iterator it, itb, ite;
+    std::vector<ETranformationType> thisTransType, objTransType;
+    for (it = thisTrans.begin(); it != thisTrans.end(); ++it)
+      thisTransType.push_back(it->first);
+    for (it = objTrans.begin(); it != objTrans.end(); ++it)
+      objTransType.push_back(it->first);
+
+    if (thisTransType.size() != objTransType.size()) return false;
+    for (int idx = 0; idx < thisTransType.size(); ++idx)
+      objEqual &= (thisTransType[idx] == objTransType[idx]);
+
+    return objEqual;
+  }
 
   CTransformation<CAxis>* CAxis::addTransformation(ETranformationType transType, const StdString& id)
Index: /XIOS/dev/dev_olga/src/node/axis.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/axis.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/axis.hpp	(revision 1158)
@@ -68,5 +68,8 @@
 
          static CAxis* createAxis();
-     
+
+         /// Accesseurs ///
+         const std::set<StdString> & getRelFiles(void) const;
+
          int getNumberWrittenIndexes() const;
          int getTotalNumberWrittenIndexes() const;
@@ -115,4 +118,5 @@
          void duplicateTransformation(CAxis*);
          CTransformation<CAxis>* addTransformation(ETranformationType transType, const StdString& id="");
+         bool isEqual(CAxis* axis);
 
       public:
@@ -121,4 +125,5 @@
         CArray<double,1> value_srv;
         CArray<double,2> bound_srv;
+        CArray<StdString,1> label_srv;
         bool hasValue;
         CArray<int,1> globalDimGrid;
@@ -131,5 +136,6 @@
          void checkMask();
          void checkZoom();
-         void checkBounds();         
+         void checkBounds();
+         void checkLabel();
          void sendAttributes(const std::vector<int>& globalDim, int orderPositionInGrid,
                              CServerDistributionDescription::ServerDistributionType distType);
@@ -166,5 +172,5 @@
          std::map<int, CArray<int,1> > indiSrv_;
          bool hasBounds_;
-
+         bool hasLabel;
          bool doZoomByIndex_;
          bool computedWrittenIndex_;
Index: /XIOS/dev/dev_olga/src/node/calendar_wrapper.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/calendar_wrapper.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/calendar_wrapper.cpp	(revision 1158)
@@ -83,5 +83,5 @@
   {
     // Create the calendar if possible
-    if (0 != calendar)
+    if (calendar)
     {
       ERROR("CCalendarWrapper::createCalendar(void)",
Index: /XIOS/dev/dev_olga/src/node/context.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/context.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/context.cpp	(revision 1158)
@@ -14,4 +14,6 @@
 #include "type.hpp"
 #include "xios_spl.hpp"
+#include "timer.hpp"
+#include "memtrack.hpp"
 
 #include "server.hpp"
@@ -372,5 +374,5 @@
        comms.push_back(interCommClient);
      }
-     client = new CContextClient(this,intraCommClient,interCommClient,cxtClient);
+     client = new CContextClient(this,intraCommClient,interCommClient, cxtClient);
    }
 
@@ -615,4 +617,5 @@
    void CContext::closeDefinition(void)
    {
+    CTimer::get("Context : close definition").resume() ;
     postProcessingGlobalAttributes();
 
@@ -640,4 +643,5 @@
       if (!hasServer) startPrefetchingOfEnabledReadModeFiles();
     }
+    CTimer::get("Context : close definition").suspend() ;
    }
 
@@ -690,5 +694,4 @@
        this->enabledFiles[i]->generateNewTransformationGridDest();
      }
-
    }
 
@@ -783,4 +786,5 @@
    {
       const std::vector<CFile*> allFiles = CFile::getAll();
+      const CDate& initDate = calendar->getInitDate();
 
       for (unsigned int i = 0; i < allFiles.size(); i++)
@@ -788,8 +792,26 @@
          {
             if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fixÃ© Ã  vrai.
+            {
+              if ((initDate + allFiles[i]->output_freq.getValue()) < (initDate + this->getCalendar()->getTimeStep()))
+              {
+                error(0)<<"WARNING: void CContext::findEnabledFiles()"<<endl
+                    << "Output frequency in file \""<<allFiles[i]->getFileOutputName()
+                    <<"\" is less than the time step. File will not be written."<<endl;
+              }
+              else
                enabledFiles.push_back(allFiles[i]);
+            }
          }
-         else enabledFiles.push_back(allFiles[i]); // otherwise true by default
-
+         else
+         {
+           if ( (initDate + allFiles[i]->output_freq.getValue()) < (initDate + this->getCalendar()->getTimeStep()))
+           {
+             error(0)<<"WARNING: void CContext::findEnabledFiles()"<<endl
+                 << "Output frequency in file \""<<allFiles[i]->getFileOutputName()
+                 <<"\" is less than the time step. File will not be written."<<endl;
+           }
+           else
+             enabledFiles.push_back(allFiles[i]); // otherwise true by default
+         }
 
       if (enabledFiles.size() == 0)
@@ -1267,4 +1289,5 @@
      StdString fileDefRoot("file_definition");
      CFileGroup* cfgrpPtr = CFileGroup::get(fileDefRoot);
+
      for (int i = 0; i < size; ++i)
      {
@@ -1313,8 +1336,31 @@
        CFile* file = allFiles[i];
 
+       std::vector<CVariable*> fileVars, fieldVars, vars = file->getAllVariables();
+       for (size_t k = 0; k < vars.size(); k++)
+       {
+         CVariable* var = vars[k];
+
+         if (var->ts_target.isEmpty()
+              || var->ts_target == CVariable::ts_target_attr::file || var->ts_target == CVariable::ts_target_attr::both)
+           fileVars.push_back(var);
+
+         if (!var->ts_target.isEmpty()
+              && (var->ts_target == CVariable::ts_target_attr::field || var->ts_target == CVariable::ts_target_attr::both))
+           fieldVars.push_back(var);
+       }
+
        if (!file->timeseries.isEmpty() && file->timeseries != CFile::timeseries_attr::none)
        {
-         StdString tsPrefix = !file->ts_prefix.isEmpty() ? file->ts_prefix : file->getFileOutputName();
-
+         StdString fileNameStr("%file_name%") ;
+         StdString tsPrefix = !file->ts_prefix.isEmpty() ? file->ts_prefix : fileNameStr ;
+         
+         StdString fileName=file->getFileOutputName();
+         size_t pos=tsPrefix.find(fileNameStr) ;
+         while (pos!=std::string::npos)
+         {
+           tsPrefix=tsPrefix.replace(pos,fileNameStr.size(),fileName) ;
+           pos=tsPrefix.find(fileNameStr) ;
+         }
+        
          const std::vector<CField*> allFields = file->getAllFields();
          for (size_t j = 0; j < allFields.size(); j++)
@@ -1326,6 +1372,10 @@
              CFile* tsFile = CFile::create();
              tsFile->duplicateAttributes(file);
-             tsFile->setVirtualVariableGroup(file->getVirtualVariableGroup());
-
+
+             // Add variables originating from file and targeted to timeserie file
+             for (size_t k = 0; k < fileVars.size(); k++)
+               tsFile->getVirtualVariableGroup()->addChild(fileVars[k]);
+
+            
              tsFile->name = tsPrefix + "_";
              if (!field->name.isEmpty())
@@ -1341,5 +1391,24 @@
              CField* tsField = tsFile->addField();
              tsField->field_ref = field->getId();
-             tsField->setVirtualVariableGroup(field->getVirtualVariableGroup());
+
+             // Add variables originating from file and targeted to timeserie field
+             for (size_t k = 0; k < fieldVars.size(); k++)
+               tsField->getVirtualVariableGroup()->addChild(fieldVars[k]);
+
+             vars = field->getAllVariables();
+             for (size_t k = 0; k < vars.size(); k++)
+             {
+               CVariable* var = vars[k];
+
+               // Add variables originating from field and targeted to timeserie field
+               if (var->ts_target.isEmpty()
+                    || var->ts_target == CVariable::ts_target_attr::field || var->ts_target == CVariable::ts_target_attr::both)
+                 tsField->getVirtualVariableGroup()->addChild(var);
+
+               // Add variables originating from field and targeted to timeserie file
+               if (!var->ts_target.isEmpty()
+                    && (var->ts_target == CVariable::ts_target_attr::file || var->ts_target == CVariable::ts_target_attr::both))
+                 tsFile->getVirtualVariableGroup()->addChild(var);
+             }
 
              tsFile->solveFieldRefInheritance(true);
@@ -1456,8 +1525,10 @@
    void CContext::updateCalendar(int step)
    {
-      info(50) <<"Context "<< this->getId() <<" updateCalendar : before : " << calendar->getCurrentDate() << endl;
+      info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl;
       calendar->update(step);
-      info(50) <<"Context "<< this->getId() << " updateCalendar : after : " << calendar->getCurrentDate() << endl;
-
+      info(50) << "updateCalendar : after : " << calendar->getCurrentDate() << endl;
+#ifdef XIOS_MEMTRACK_LIGHT
+      info(50) << " Current memory used by XIOS : "<<  MemTrack::getCurrentMemorySize()*1.0/(1024*1024)<<" Mbyte, at timestep "<<step<<" of context "<<this->getId()<<endl ;
+#endif
       if (hasClient)
       {
@@ -1537,5 +1608,5 @@
 
   void CContext::sendRegistry(void)
-  {    
+  {
     registryOut->hierarchicalGatherRegistry() ;
 
Index: /XIOS/dev/dev_olga/src/node/domain.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/domain.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/domain.cpp	(revision 1158)
@@ -26,5 +26,5 @@
 namespace xios {
 
-   /// ////////////////////// Dfinitions ////////////////////// ///
+   /// ////////////////////// DÃ©finitions ////////////////////// ///
 
    CDomain::CDomain(void)
@@ -79,4 +79,10 @@
    }
 
+   const std::set<StdString> & CDomain::getRelFiles(void) const
+   {
+      return (this->relFiles);
+   }
+
+
    /*!
      Returns the number of indexes written by each server.
@@ -170,6 +176,5 @@
    {
       return ((this->zoom_i_index.isEmpty()) || (0 == this->zoom_i_index.numElements()));
-      // return ((this->zoom_ni_srv == 0) ||
-      //         (this->zoom_nj_srv == 0));
+
    }
 
@@ -190,6 +195,9 @@
    bool CDomain::isDistributed(void) const
    {
-      return !((!ni.isEmpty() && (ni == ni_glo) && !nj.isEmpty() && (nj == nj_glo)) ||
+      bool distributed =  !((!ni.isEmpty() && (ni == ni_glo) && !nj.isEmpty() && (nj == nj_glo)) ||
               (!i_index.isEmpty() && i_index.numElements() == ni_glo*nj_glo));
+      distributed |= (1 == CContext::getCurrent()->client->clientSize);
+
+      return distributed;
    }
 
@@ -221,4 +229,21 @@
 
    //----------------------------------------------------------------
+
+   /*!
+      Verify if all distribution information of a domain are available
+      This checking verifies the definition of distribution attributes (ni, nj, ibegin, jbegin)
+   */
+   bool CDomain::distributionAttributesHaveValue() const
+   {
+      bool hasValues = true;
+
+      if (ni.isEmpty() && ibegin.isEmpty() && i_index.isEmpty())
+      {
+        hasValues = false;
+        return hasValues;
+      }
+
+      return hasValues;
+   }
 
    /*!
@@ -331,8 +356,5 @@
             ni.setValue(ni_glo - ibeginVec[iIdx]);
           }
-        }
-
-        // Now fill other attributes
-        if (type_attr::rectilinear == type) fillInRectilinearLonLat();
+        } 
      }
      else  // unstructured domain
@@ -380,4 +402,7 @@
             nj.setValue(1);
           }
+
+          i_index.resize(ni);          
+          for(int idx = 0; idx < ni; ++idx) i_index(idx)=ibegin+idx;
         }
         else
@@ -391,4 +416,27 @@
 
      checkDomain();
+   }
+
+   /*!
+     Fill in longitude and latitude whose values are read from file
+   */
+   void CDomain::fillInLonLat()
+   {
+     switch (type)
+     {
+      case type_attr::rectilinear:
+        fillInRectilinearLonLat();
+        break;
+      case type_attr::curvilinear:
+        fillInCurvilinearLonLat();
+        break;
+      case type_attr::unstructured:
+        fillInUnstructuredLonLat();
+        break;
+
+      default:
+      break;
+     }
+
    }
 
@@ -468,6 +516,114 @@
    }
 
-
-
+    /*
+      Fill in longitude and latitude of curvilinear domain read from a file
+      If there are already longitude and latitude defined by model. We just igonore reading value.
+    */
+   void CDomain::fillInCurvilinearLonLat()
+   {
+     if (!lonvalue_curvilinear_read_from_file.isEmpty() && lonvalue_2d.isEmpty())
+     {
+       lonvalue_2d.resize(ni,nj);
+       for (int jdx = 0; jdx < nj; ++jdx)
+        for (int idx = 0; idx < ni; ++idx)
+         lonvalue_2d(idx,jdx) = lonvalue_curvilinear_read_from_file(idx+ibegin, jdx+jbegin);
+
+       lonvalue_curvilinear_read_from_file.free();
+     }
+
+     if (!latvalue_curvilinear_read_from_file.isEmpty() && latvalue_2d.isEmpty())
+     {
+       latvalue_2d.resize(ni,nj);
+       for (int jdx = 0; jdx < nj; ++jdx)
+        for (int idx = 0; idx < ni; ++idx)
+         latvalue_2d(idx,jdx) = latvalue_curvilinear_read_from_file(idx+ibegin, jdx+jbegin);
+
+       latvalue_curvilinear_read_from_file.free();
+     }
+
+     if (!bounds_lonvalue_curvilinear_read_from_file.isEmpty() && bounds_lon_2d.isEmpty())
+     {
+       bounds_lon_2d.resize(nvertex,ni,nj);
+       for (int jdx = 0; jdx < nj; ++jdx)
+        for (int idx = 0; idx < ni; ++idx)
+          for (int ndx = 0; ndx < nvertex; ++ndx)
+         bounds_lon_2d(ndx,idx,jdx) = bounds_lonvalue_curvilinear_read_from_file(ndx,idx+ibegin, jdx+jbegin);
+
+       bounds_lonvalue_curvilinear_read_from_file.free();
+     }
+
+     if (!bounds_latvalue_curvilinear_read_from_file.isEmpty() && bounds_lat_2d.isEmpty())
+     {
+       bounds_lat_2d.resize(nvertex,ni,nj);
+       for (int jdx = 0; jdx < nj; ++jdx)
+        for (int idx = 0; idx < ni; ++idx)
+          for (int ndx = 0; ndx < nvertex; ++ndx)
+            bounds_lat_2d(ndx,idx,jdx) = bounds_latvalue_curvilinear_read_from_file(ndx,idx+ibegin, jdx+jbegin);
+
+       bounds_latvalue_curvilinear_read_from_file.free();
+     }
+
+   }
+
+    /*
+      Fill in longitude and latitude of unstructured domain read from a file
+      If there are already longitude and latitude defined by model. We just igonore reading value.
+    */
+   void CDomain::fillInUnstructuredLonLat()
+   {
+     if (i_index.isEmpty())
+     {
+       i_index.resize(ni);
+       for(int idx = 0; idx < ni; ++idx) i_index(idx)=ibegin+idx;
+     }
+
+     if (!lonvalue_unstructured_read_from_file.isEmpty() && lonvalue_1d.isEmpty())
+     {
+        lonvalue_1d.resize(ni);
+        for (int idx = 0; idx < ni; ++idx)
+          lonvalue_1d(idx) = lonvalue_unstructured_read_from_file(i_index(idx));
+
+        // We dont need these values anymore, so just delete them
+        lonvalue_unstructured_read_from_file.free();
+     } 
+
+     if (!latvalue_unstructured_read_from_file.isEmpty() && latvalue_1d.isEmpty())
+     {
+        latvalue_1d.resize(ni);
+        for (int idx = 0; idx < ni; ++idx)
+          latvalue_1d(idx) =  latvalue_unstructured_read_from_file(i_index(idx));
+
+        // We dont need these values anymore, so just delete them
+        latvalue_unstructured_read_from_file.free();
+     }
+
+     if (!bounds_lonvalue_unstructured_read_from_file.isEmpty() && bounds_lon_1d.isEmpty())
+     {
+        int nbVertex = nvertex;
+        bounds_lon_1d.resize(nbVertex,ni);
+        for (int idx = 0; idx < ni; ++idx)
+          for (int jdx = 0; jdx < nbVertex; ++jdx)
+            bounds_lon_1d(jdx,idx) = bounds_lonvalue_unstructured_read_from_file(jdx, i_index(idx));
+
+        // We dont need these values anymore, so just delete them
+        lonvalue_unstructured_read_from_file.free();
+     }
+
+     if (!bounds_latvalue_unstructured_read_from_file.isEmpty() && bounds_lat_1d.isEmpty())
+     {
+        int nbVertex = nvertex;
+        bounds_lat_1d.resize(nbVertex,ni);
+        for (int idx = 0; idx < ni; ++idx)
+          for (int jdx = 0; jdx < nbVertex; ++jdx)
+            bounds_lat_1d(jdx,idx) = bounds_latvalue_unstructured_read_from_file(jdx, i_index(idx));
+
+        // We dont need these values anymore, so just delete them
+        lonvalue_unstructured_read_from_file.free();
+     }
+   }
+
+  /*
+    Get global longitude and latitude of rectilinear domain.
+  */
    void CDomain::AllgatherRectilinearLonLat(CArray<double,1>& lon, CArray<double,1>& lat, CArray<double,1>& lon_g, CArray<double,1>& lat_g)
    {
@@ -590,5 +746,5 @@
     else
     {
-      if (bounds_lat_start.isEmpty()) bounds_lon_start=-90. ;
+      if (bounds_lat_start.isEmpty()) bounds_lat_start=-90. ;
       if (bounds_lat_end.isEmpty()) bounds_lat_end=90 ;
     }
@@ -695,5 +851,6 @@
        for (int j = 0; j < nj; ++j)
          for (int i = 0; i < ni; ++i) j_index(i+j*ni) = j+jbegin;
-     }     
+     }
+     
      checkZoom();
    }
@@ -1431,7 +1588,5 @@
      if (context->hasClient)
      {
-       // this->checkMask();
       this->computeConnectedClients();
-       // if (hasLonLat || hasArea || isCompressible_) this->computeConnectedClients();
        if (hasLonLat)
          if (!context->hasServer)
@@ -1482,5 +1637,4 @@
      if (context->hasClient)
      {
-//       this->completeLonLatClient();
        sendAttributes();
      }
@@ -2694,5 +2848,4 @@
   }
 
-
   /*!
     Receive area information from client(s)
@@ -2742,4 +2895,35 @@
       
     }
+  }
+
+  /*!
+    Compare two domain objects. 
+    They are equal if only if they have identical attributes as well as their values.
+    Moreover, they must have the same transformations.
+  \param [in] domain Compared domain
+  \return result of the comparison
+  */
+  bool CDomain::isEqual(CDomain* obj)
+  {
+    vector<StdString> excludedAttr;
+    excludedAttr.push_back("domain_ref");
+    bool objEqual = SuperClass::isEqual(obj, excludedAttr);
+    if (!objEqual) return objEqual;
+
+    TransMapTypes thisTrans = this->getAllTransformations();
+    TransMapTypes objTrans  = obj->getAllTransformations();
+
+    TransMapTypes::const_iterator it, itb, ite;
+    std::vector<ETranformationType> thisTransType, objTransType;
+    for (it = thisTrans.begin(); it != thisTrans.end(); ++it)
+      thisTransType.push_back(it->first);
+    for (it = objTrans.begin(); it != objTrans.end(); ++it)
+      objTransType.push_back(it->first);
+
+    if (thisTransType.size() != objTransType.size()) return false;
+    for (int idx = 0; idx < thisTransType.size(); ++idx)
+      objEqual &= (thisTransType[idx] == objTransType[idx]);
+
+    return objEqual;
   }
 
Index: /XIOS/dev/dev_olga/src/node/domain.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/domain.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/domain.hpp	(revision 1158)
@@ -42,9 +42,8 @@
       , public CDomainAttributes
    {
-               /// typedef ///
-         typedef CObjectTemplate<CDomain>   SuperClass;
-         typedef CDomainAttributes SuperClassAttribute;
-         
-      public :
+     /// typedef ///
+     typedef CObjectTemplate<CDomain>   SuperClass;
+     typedef CDomainAttributes SuperClassAttribute;
+     public:
          enum EEventId
          {
@@ -91,5 +90,6 @@
          CTransformation<CDomain>* addTransformation(ETranformationType transType, const StdString& id="");
 
-      public:         
+      public:
+         const std::set<StdString> & getRelFiles(void) const;
          bool IsWritten(const StdString & filename) const;
          bool isWrittenCompressed(const StdString& filename) const;
@@ -116,5 +116,6 @@
          vector< vector<int> > i_indSrv ; // for each server, i global index to send
          vector< vector<int> > j_indSrv ; // for each server, j global index to send
-
+         std::vector<int> getNbGlob();
+         bool isEqual(CDomain* domain);
       public:
          /// Mutateur ///
@@ -130,5 +131,7 @@
          void fillInRectilinearBoundLonLat(CArray<double,1>& lon, CArray<double,1>& lat,
                                            CArray<double,2>& boundsLon, CArray<double,2>& boundsLat);
-         void fillInRectilinearLonLat();
+         
+         void fillInLonLat();
+         bool distributionAttributesHaveValue() const;
 
          static bool dispatchEvent(CEventServer& event);
@@ -157,6 +160,7 @@
          static StdString GetName(void);
          static StdString GetDefName(void);
-         static ENodeType GetType(void);   
-
+
+         static ENodeType GetType(void);
+         const std::map<int, vector<size_t> >& getIndexServer() const;
          CArray<bool, 1> localMask;
          bool isCurvilinear ;
@@ -182,5 +186,5 @@
 
          void setTransformations(const TransMapTypes&);         
-
+         void computeNGlobDomain();
          void sendAttributes();
          void sendIndex();
@@ -192,5 +196,7 @@
          void sendDataIndex();
          void convertLonLatValue();
-
+         void fillInRectilinearLonLat();
+         void fillInCurvilinearLonLat();
+         void fillInUnstructuredLonLat();
        private:         
          bool doZoomByIndex_;
Index: /XIOS/dev/dev_olga/src/node/expand_domain.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/expand_domain.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/expand_domain.cpp	(revision 1158)
@@ -38,10 +38,10 @@
   void CExpandDomain::checkValid(CDomain* domainDst)
   {
-    if (CDomain::type_attr::unstructured != domainDst->type)
-    {
-      ERROR("CExpandDomain::checkValid(CDomain* domainDst)",
-            << "Domain extension is only supported for unstructured" << std::endl
-            << "Check type of domain destination, id = " << domainDst->getId());
-    }
+    // if (CDomain::type_attr::unstructured != domainDst->type)
+    // {
+    //   ERROR("CExpandDomain::checkValid(CDomain* domainDst)",
+    //         << "Domain extension is only supported for unstructured" << std::endl
+    //         << "Check type of domain destination, id = " << domainDst->getId());
+    // }
 
     if (this->type.isEmpty()) this->type.setValue(CExpandDomain::type_attr::edge);
Index: /XIOS/dev/dev_olga/src/node/field.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/field.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/field.cpp	(revision 1158)
@@ -38,5 +38,8 @@
       , areAllReferenceSolved(false), isReferenceSolved(false), isReferenceSolvedAndTransformed(false)
       , useCompressedOutput(false)
+      , hasTimeInstant(false)
+      , hasTimeCentered(false)
       , wasDataAlreadyReceivedFromServer(false)
+      , isEOF(false)
    { setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); }
 
@@ -50,5 +53,8 @@
       , areAllReferenceSolved(false), isReferenceSolved(false), isReferenceSolvedAndTransformed(false)
       , useCompressedOutput(false)
+      , hasTimeInstant(false)
+      , hasTimeCentered(false)
       , wasDataAlreadyReceivedFromServer(false)
+      , isEOF(false)
    { setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); }
 
@@ -122,5 +128,5 @@
   void CField::sendUpdateData(const CArray<double,1>& data)
   {
-    CTimer::get("XIOS Send Data").resume();
+    CTimer::get("Field : send data").resume();
 
     CContext* context = CContext::getCurrent();
@@ -174,5 +180,5 @@
       }    
 
-    CTimer::get("XIOS Send Data").suspend();
+    CTimer::get("Field : send data").suspend();
   }
 
@@ -183,5 +189,5 @@
     list<CEventServer::SSubEvent>::iterator it;
     string fieldId;
-
+    CTimer::get("Field : recv data").resume();
     for (it = event.subEvents.begin(); it != event.subEvents.end(); ++it)
     {
@@ -192,4 +198,5 @@
     }
     get(fieldId)->recvUpdateData(rankBuffers);
+    CTimer::get("Field : recv data").suspend();
   }
 
@@ -252,69 +259,4 @@
     }
   }
-  
-//   void  CField::recvUpdateData(vector<int>& ranks, vector<CBufferIn*>& buffers)
-//   {
-//     CContext* context = CContext::getCurrent();
-
-//     if (data_srv.empty())
-//     {
-//       for (map<int, CArray<size_t, 1> >::iterator it = grid->outIndexFromClient.begin(); it != grid->outIndexFromClient.end(); ++it)
-//       {
-//         int rank = it->first;
-//         data_srv.insert(std::make_pair(rank, CArray<double,1>(it->second.numElements())));
-//         foperation_srv.insert(pair<int,boost::shared_ptr<func::CFunctor> >(rank,boost::shared_ptr<func::CFunctor>(new func::CInstant(data_srv[rank]))));
-//       }
-//     }
-
-//     const CDate& currDate = context->getCalendar()->getCurrentDate();
-//     const CDate opeDate      = last_operation_srv +freq_op + freq_operation_srv - freq_op;
-//     const CDate writeDate    = last_Write_srv     + freq_write_srv;
-
-//     if (opeDate <= currDate)
-//     {
-//       for (int n = 0; n < ranks.size(); n++)
-//       {
-//         CArray<double,1> data_tmp;
-//         *buffers[n] >> data_tmp;
-//         (*foperation_srv[ranks[n]])(data_tmp);
-//       }
-//       last_operation_srv = currDate;
-//     }
-
-//     if (writeDate < (currDate + freq_operation_srv))
-//     {
-//       for (int n = 0; n < ranks.size(); n++)
-//       {
-//         this->foperation_srv[ranks[n]]->final();
-//       }
-
-//       last_Write_srv = writeDate;
-//     }
-
-//     if (context->hasClient && context->hasServer)
-//     {
-//       size_t writtenSize;
-// //      if (field->getUseCompressedOutput())
-// //        writtenSize = grid->getNumberWrittenIndexes();
-// //      else
-//         writtenSize = grid->getWrittenDataSize();
-
-//       CArray<double,1> fieldData(writtenSize);
-// //      if (!field->default_value.isEmpty()) fieldData = field->default_value;
-
-// //      if (field->getUseCompressedOutput())
-// //        field->outputCompressedField(fieldData);
-// //      else
-//         this->outputField(fieldData);
-//       sendUpdateData(fieldData);
-//     }
-//     if (!context->hasClient && context->hasServer)
-//     {
-//       writeField();
-//     }
-
-//     lastlast_Write_srv = last_Write_srv;
-
-//   }
 
   void CField::writeField(void)
@@ -331,5 +273,5 @@
   }
 
-  void CField::sendReadDataRequest(const CDate& tsDataRequested)
+  bool CField::sendReadDataRequest(const CDate& tsDataRequested)
   {
     CContext* context = CContext::getCurrent();
@@ -339,15 +281,22 @@
     lastDataRequestedFromServer = tsDataRequested;
 
-    CEventClient event(getType(), EVENT_ID_READ_DATA);
-    if (client->isServerLeader())
+    if (!isEOF) // No need to send the request if we already know we are at EOF
     {
-      CMessage msg;
-      msg << getId();
-      const std::list<int>& ranks = client->getRanksServerLeader();
-      for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
-        event.push(*itRank, 1, msg);
-      client->sendEvent(event);
-    }
-    else client->sendEvent(event);
+      CEventClient event(getType(), EVENT_ID_READ_DATA);
+      if (client->isServerLeader())
+      {
+        CMessage msg;
+        msg << getId();
+        const std::list<int>& ranks = client->getRanksServerLeader();
+        for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
+          event.push(*itRank, 1, msg);
+        client->sendEvent(event);
+      }
+      else client->sendEvent(event);
+    }
+    else
+      serverSourceFilter->signalEndOfStream(tsDataRequested);
+
+    return !isEOF;
   }
 
@@ -361,4 +310,5 @@
 
     bool dataRequested = false;
+
     while (currentDate >= lastDataRequestedFromServer)
     {
@@ -368,8 +318,7 @@
       info(20) << "lastDataRequestedFromServer + file->output_freq.getValue() : " << lastDataRequestedFromServer + file->output_freq << endl ;
 
-      sendReadDataRequest(lastDataRequestedFromServer + file->output_freq);
-
-      dataRequested = true;
-    }
+      dataRequested |= sendReadDataRequest(lastDataRequestedFromServer + file->output_freq);
+    }
+
     return dataRequested;
   }
@@ -386,5 +335,5 @@
   {
     CContext* context = CContext::getCurrent();
-    CContextClient* client = context->client;    
+    CContextClient* client = context->client;
 
     CEventClient event(getType(), EVENT_ID_READ_DATA_READY);
@@ -393,5 +342,5 @@
     bool hasData = readField();
 
-    
+    map<int, CArray<double,1> >::iterator it;
     if (!grid->doGridHaveDataDistributed())
     {
@@ -413,5 +362,4 @@
             }
           }
-
           client->sendEvent(event);
        }
@@ -500,6 +448,4 @@
     std::map<int, CArray<double,1> > data;
 
-    bool isEOF = false;
-
     for (int i = 0; i < ranks.size(); i++)
     {
@@ -585,7 +531,15 @@
    //----------------------------------------------------------------
 
-   bool CField::isActive(void) const
-   {
-      return (instantDataFilter != NULL);
+   bool CField::isActive(bool atCurrentTimestep /*= false*/) const
+   {
+      if (clientSourceFilter)
+        return atCurrentTimestep ? clientSourceFilter->isDataExpected(CContext::getCurrent()->getCalendar()->getCurrentDate()) : true;
+      else if (storeFilter)
+        return true;
+      else if (instantDataFilter)
+        ERROR("bool CField::isActive(bool atCurrentTimestep)",
+              << "Impossible to check if field [ id = " << getId() << " ] is active as it cannot be used to receive nor send data.");
+
+      return false;
    }
 
@@ -815,5 +769,5 @@
           if (hasDirectFieldReference()) getDirectFieldReference()->solveAllReferenceEnabledField(false);
         }
-       else if (context->hasServer)        
+        else if (context->hasServer)
           solveServerOperation();
 
@@ -940,25 +894,26 @@
        {
          // Check if we have an expression to parse
-       if (hasExpression())
+         if (hasExpression())
          {
-         boost::scoped_ptr<IFilterExprNode> expr(parseExpr(getExpression() + '\0'));
-         boost::shared_ptr<COutputPin> filter = expr->reduce(gc, *this);
-
-         // Check if a spatial transformation is needed
-         if (!field_ref.isEmpty())
-         {
-           CGrid* gridRef = CField::get(field_ref)->grid;
-
-           if (grid && grid != gridRef && grid->hasTransform())
+           boost::scoped_ptr<IFilterExprNode> expr(parseExpr(getExpression() + '\0'));
+           boost::shared_ptr<COutputPin> filter = expr->reduce(gc, *this);
+
+           // Check if a spatial transformation is needed
+           if (!field_ref.isEmpty())
            {
-             double defaultValue = !default_value.isEmpty() ? default_value : 0.0;
-             std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters = CSpatialTransformFilter::buildFilterGraph(gc, gridRef, grid, defaultValue);
-
-             filter->connectOutput(filters.first, 0);
-             filter = filters.second;
+             CGrid* gridRef = CField::get(field_ref)->grid;
+
+             if (grid && grid != gridRef && grid->hasTransform())
+             {
+               bool hasMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true);
+               double defaultValue  = hasMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0);
+               std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters = CSpatialTransformFilter::buildFilterGraph(gc, gridRef, grid, hasMissingValue, defaultValue);
+
+               filter->connectOutput(filters.first, 0);
+               filter = filters.second;
+             }
            }
-         }
-
-         instantDataFilter = filter;
+
+           instantDataFilter = filter;
          }
          // Check if we have a reference on another field
@@ -967,29 +922,33 @@
          // Check if the data is to be read from a file
          else if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read)
-         instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid,
-                                                                                                     freq_offset.isEmpty() ? NoneDu : freq_offset,
-                                                                                                     true));
+           instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid,
+                                                                                                       freq_offset.isEmpty() ? NoneDu : freq_offset,
+                                                                                                       true));
          else // The data might be passed from the model
-         instantDataFilter = clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid));
-       }
-
-       // If the field data is to be read by the client or/and written to a file
-       if (enableOutput && !storeFilter && !fileWriterFilter)
-       {
-         if (!read_access.isEmpty() && read_access)
          {
-           storeFilter = boost::shared_ptr<CStoreFilter>(new CStoreFilter(gc, CContext::getCurrent(), grid));
-           instantDataFilter->connectOutput(storeFilter, 0);
+            bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true);
+            double defaultValue  = ignoreMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0);
+            instantDataFilter = clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, NoneDu, false,
+                                                                                                        ignoreMissingValue, defaultValue));
          }
-
-         if (file && (file->mode.isEmpty() || file->mode == CFile::mode_attr::write))
-         {
-           fileWriterFilter = boost::shared_ptr<CFileWriterFilter>(new CFileWriterFilter(gc, this));
-           getTemporalDataFilter(gc, file->output_freq)->connectOutput(fileWriterFilter, 0);
-         }
-       }
-     }
-   }
-
+       }
+     }
+
+     // If the field data is to be read by the client or/and written to a file
+     if (enableOutput && !storeFilter && !fileWriterFilter)
+     {
+       if (!read_access.isEmpty() && read_access)
+       {
+         storeFilter = boost::shared_ptr<CStoreFilter>(new CStoreFilter(gc, CContext::getCurrent(), grid));
+         instantDataFilter->connectOutput(storeFilter, 0);
+       }
+
+       if (file && (file->mode.isEmpty() || file->mode == CFile::mode_attr::write))
+       {
+         fileWriterFilter = boost::shared_ptr<CFileWriterFilter>(new CFileWriterFilter(gc, this));
+         getTemporalDataFilter(gc, file->output_freq)->connectOutput(fileWriterFilter, 0);
+       }
+     }
+   }
 
    /*!
@@ -1000,27 +959,28 @@
     * \return the output pin corresponding to the field reference
     */
-     boost::shared_ptr<COutputPin> CField::getFieldReference(CGarbageCollector& gc)
-     {
-       if (instantDataFilter || field_ref.isEmpty())
-         ERROR("COutputPin* CField::getFieldReference(CGarbageCollector& gc)",
-               "Impossible to get the field reference for a field which has already been parsed or which does not have a field_ref.");
-
-       CField* fieldRef = CField::get(field_ref);
-       fieldRef->buildFilterGraph(gc, false);
-
-       std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters;
-       // Check if a spatial transformation is needed
-       if (grid && grid != fieldRef->grid && grid->hasTransform())
-       {
-         double defaultValue = !default_value.isEmpty() ? default_value : 0.0;
-         filters = CSpatialTransformFilter::buildFilterGraph(gc, fieldRef->grid, grid, defaultValue);
-       }
-       else
-         filters.first = filters.second = boost::shared_ptr<CFilter>(new CPassThroughFilter(gc));
-
-       fieldRef->getInstantDataFilter()->connectOutput(filters.first, 0);
-
-       return filters.second;
-     }
+   boost::shared_ptr<COutputPin> CField::getFieldReference(CGarbageCollector& gc)
+   {
+     if (instantDataFilter || field_ref.isEmpty())
+       ERROR("COutputPin* CField::getFieldReference(CGarbageCollector& gc)",
+             "Impossible to get the field reference for a field which has already been parsed or which does not have a field_ref.");
+
+     CField* fieldRef = CField::get(field_ref);
+     fieldRef->buildFilterGraph(gc, false);
+
+     std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters;
+     // Check if a spatial transformation is needed
+     if (grid && grid != fieldRef->grid && grid->hasTransform())
+     {       
+       bool hasMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true);
+       double defaultValue  = hasMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0);                                
+       filters = CSpatialTransformFilter::buildFilterGraph(gc, fieldRef->grid, grid, hasMissingValue, defaultValue);
+     }
+     else
+       filters.first = filters.second = boost::shared_ptr<CFilter>(new CPassThroughFilter(gc));
+
+     fieldRef->getInstantDataFilter()->connectOutput(filters.first, 0);
+
+     return filters.second;
+   }
 
    /*!
@@ -1058,5 +1018,10 @@
        {
          if (!clientSourceFilter)
-           clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid));
+         {
+           bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true);
+           double defaultValue  = ignoreMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
+           clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, NoneDu, false,
+                                                                                   ignoreMissingValue, defaultValue));
+         }
 
          selfReferenceFilter = clientSourceFilter;
@@ -1104,4 +1069,47 @@
      return it->second;
    }
+
+  /*!
+    * Returns the temporal filter corresponding to the field's temporal operation
+    * for the specified operation frequency.
+    *
+    * \param gc the garbage collector to use
+    * \param outFreq the operation frequency, i.e. the frequency at which the output data will be computed
+    * \return the output pin corresponding to the requested temporal filter
+    */
+   
+   boost::shared_ptr<COutputPin> CField::getSelfTemporalDataFilter(CGarbageCollector& gc, CDuration outFreq)
+   {
+     if (instantDataFilter || !hasExpression())
+       ERROR("COutputPin* CField::getSelfTemporalDataFilter(CGarbageCollector& gc)",
+             "Impossible to add a self reference to a field which has already been parsed or which does not have an expression.");
+
+     if (!selfReferenceFilter) getSelfReference(gc) ;
+
+     if (serverSourceFilter || clientSourceFilter)
+     {
+       if (operation.isEmpty())
+         ERROR("void CField::getSelfTemporalDataFilter(CGarbageCollector& gc, CDuration outFreq)",
+               << "An operation must be defined for field \"" << getId() << "\".");
+
+       if (freq_op.isEmpty()) freq_op.setValue(TimeStep);
+       if (freq_offset.isEmpty()) freq_offset.setValue(NoneDu);
+
+       const bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true);
+
+       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation,
+                                                                             CContext::getCurrent()->getCalendar()->getInitDate(),
+                                                                             freq_op, freq_offset, outFreq,
+                                                                             ignoreMissingValue, ignoreMissingValue ? default_value : 0.0));
+       selfReferenceFilter->connectOutput(temporalFilter, 0);
+       return temporalFilter ;
+     }
+     else if (!field_ref.isEmpty())
+     {
+       CField* fieldRef = CField::get(field_ref);
+       fieldRef->buildFilterGraph(gc, false); 
+       return fieldRef->getTemporalDataFilter(gc, outFreq) ;
+     }
+  }
 
    //----------------------------------------------------------------
Index: /XIOS/dev/dev_olga/src/node/field.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/field.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/field.hpp	(revision 1158)
@@ -99,5 +99,5 @@
 
        public:
-         bool isActive(void) const;
+         bool isActive(bool atCurrentTimestep = false) const;
          bool hasOutputFile;
 
@@ -150,5 +150,5 @@
         void recvUpdateData(std::map<int,CBufferIn*>& rankBuffers);
         void writeField(void);
-        void sendReadDataRequest(const CDate& tsDataRequested);
+        bool sendReadDataRequest(const CDate& tsDataRequested);
         bool sendReadDataRequestIfNeeded(void);
         static void recvReadDataRequest(CEventServer& event);
@@ -157,5 +157,9 @@
         static void recvReadDataReady(CEventServer& event);
         void recvReadDataReady(vector<int> ranks, vector<CBufferIn*> buffers);
+        void outputField(CArray<double,3>& fieldOut);
+        void outputField(CArray<double,2>& fieldOut);
         void outputField(CArray<double,1>& fieldOut);
+        void inputField(CArray<double,3>& fieldOut);
+        void inputField(CArray<double,2>& fieldOut);
         void inputField(CArray<double,1>& fieldOut);
         void outputCompressedField(CArray<double, 1>& fieldOut);
@@ -240,5 +244,5 @@
          //! The terminal filter which stores the instant data
          boost::shared_ptr<CStoreFilter> storeFilter;
-         //! The terminal filter which sends the data to file
+         //! The terminal filter which writes the data to file
          boost::shared_ptr<CFileWriterFilter> fileWriterFilter;
          //! The terminal filter which writes data to file
Index: /XIOS/dev/dev_olga/src/node/file.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/file.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/file.cpp	(revision 1158)
@@ -14,5 +14,7 @@
 #include "type.hpp"
 #include "xios_spl.hpp"
+#include "context_client.hpp"
 #include "mpi.hpp"
+#include "timer.hpp"
 
 namespace xios {
@@ -49,7 +51,7 @@
    //----------------------------------------------------------------
 
-   const StdString& CFile::getFileOutputName(void) const
-   {
-     return name.isEmpty() ? getId() : name;
+   const StdString CFile::getFileOutputName(void) const
+   {
+     return (name.isEmpty() ? getId() : name) + (name_suffix.isEmpty() ? StdString("") :  name_suffix.getValue());
    }
 
@@ -215,9 +217,10 @@
       if (!split_freq.isEmpty())
       {
-        if (context->registryIn->foundKey("splitStart") && context->registryIn->foundKey("splitEnd"))
+        StdString keySuffix("CContext_"+CContext::getCurrent()->getId()+"::CFile_"+getFileOutputName()+"::") ; 
+        if (context->registryIn->foundKey(keySuffix+"splitStart") && context->registryIn->foundKey(keySuffix+"splitEnd"))
         {
           CDate savedSplitStart(*context->getCalendar()), savedSplitEnd(*context->getCalendar());
-          context->registryIn->getKey("splitStart", savedSplitStart);
-          context->registryIn->getKey("splitEnd",   savedSplitEnd);
+          context->registryIn->getKey(keySuffix+"splitStart", savedSplitStart);
+          context->registryIn->getKey(keySuffix+"splitEnd",   savedSplitEnd);
 
           if (savedSplitStart <= lastSplit && lastSplit <= savedSplitEnd)
@@ -234,6 +237,4 @@
       const int recordOffset = record_offset.isEmpty() ? 0 : record_offset;
 
-//      set<CAxis*> setAxis;
-//      set<CDomain*> setDomains;
       set<StdString> setAxis;
       set<StdString> setDomains;
@@ -263,5 +264,5 @@
       if (allDomainEmpty) MPI_Comm_free(&fileComm);
 
-      if (time_counter.isEmpty()) time_counter.setValue(time_counter_attr::centered);
+      // if (time_counter.isEmpty()) time_counter.setValue(time_counter_attr::centered);
       if (time_counter_name.isEmpty()) time_counter_name = "time_counter";
     }
@@ -281,5 +282,7 @@
         if (mode.isEmpty() || mode.getValue() == mode_attr::write)
         {
+          CTimer::get("Files : create headers").resume();
           if (!isOpen) createHeader();
+          CTimer::get("Files : create headers").suspend();
           checkSync();
         }        
@@ -303,5 +306,7 @@
         if (!mode.isEmpty() && mode.getValue() == mode_attr::read)
         {
+          CTimer::get("Files : open headers").resume();
           if (!isOpen) openInReadMode(&(context->server->intraComm));
+          CTimer::get("Files : open headers").suspend();
         }
         //checkSplit(); // Really need for reading?
@@ -374,5 +379,4 @@
       {
          StdString filename = getFileOutputName();
-         if (!name_suffix.isEmpty()) filename+=name_suffix.getValue();
 
 // determine splitting format in the file name  : firstPart%start_date%middlePart%end_date%lastPart
@@ -441,6 +445,7 @@
            oss << lastPart ;
 
-           context->registryOut->setKey("splitStart", lastSplit);
-           context->registryOut->setKey("splitEnd",   splitEnd);
+           StdString keySuffix("CContext_"+CContext::getCurrent()->getId()+"::CFile_"+getFileOutputName()+"::") ; 
+           context->registryOut->setKey(keySuffix+"splitStart", lastSplit);
+           context->registryOut->setKey(keySuffix+"splitEnd",   splitEnd);
          }
          else oss<<firstPart<<lastPart ;
@@ -489,5 +494,5 @@
          if (isOpen) data_out->closeFile();
 
-        data_out = shared_ptr<CDataOutput>(new CNc4DataOutput(oss.str(), append, useClassicFormat, useCFConvention,
+        data_out = shared_ptr<CDataOutput>(new CNc4DataOutput(this, oss.str(), append, useClassicFormat, useCFConvention,
                                                               fileComm, multifile, isCollective, time_counter_name));
         isOpen = true;
@@ -509,4 +514,10 @@
           {
             CField* field = *it;
+            this->data_out->writeFieldTimeAxis(field);
+          }
+          
+          for (it = this->enabledFields.begin(); it != end; it++)
+          {
+            CField* field = *it;
             this->data_out->writeField(field);
           }
@@ -517,4 +528,14 @@
 
           this->data_out->definition_end();
+        }
+        else
+        {
+          // check time axis even in append mode
+          std::vector<CField*>::iterator it, end = this->enabledFields.end();
+          for (it = this->enabledFields.begin(); it != end; it++)
+          {
+            CField* field = *it;
+            this->data_out->writeFieldTimeAxis(field);
+          }
         }
       }
@@ -535,5 +556,4 @@
       StdOStringStream oss;
       oss << filename;
-      if (!name_suffix.isEmpty()) oss << name_suffix.getValue();
 
       if (!split_freq.isEmpty())
@@ -872,5 +892,4 @@
    }
 
-
    /*!
    \brief Send a message to create a field on server side
Index: /XIOS/dev/dev_olga/src/node/file.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/file.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/file.hpp	(revision 1158)
@@ -70,5 +70,5 @@
       public:
          /// Accesseurs ///
-         const StdString& getFileOutputName(void) const;
+         const StdString getFileOutputName(void) const;
          boost::shared_ptr<CDataOutput> getDataOutput(void) const;
          boost::shared_ptr<CDataInput> getDataInput(void) const;
Index: /XIOS/dev/dev_olga/src/node/grid.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/grid.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/grid.cpp	(revision 1158)
@@ -31,7 +31,7 @@
       , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0)
       , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0)
-      , globalDim_(), connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false)
+      , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false)
       , transformations_(0), isTransformed_(false)
-      , axisPositionInGrid_(), positionDimensionDistributed_(1), hasDomainAxisBaseRef_(false)
+      , axisPositionInGrid_(), hasDomainAxisBaseRef_(false)
       , gridSrc_(), hasTransform_(false), isGenerated_(false), order_(), globalIndexOnServer_()
       , computedWrittenIndex_(false)
@@ -50,7 +50,7 @@
       , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0)
       , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0)
-      , globalDim_(), connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false)
+      , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false)
       , transformations_(0), isTransformed_(false)
-      , axisPositionInGrid_(), positionDimensionDistributed_(1), hasDomainAxisBaseRef_(false)
+      , axisPositionInGrid_(), hasDomainAxisBaseRef_(false)
       , gridSrc_(), hasTransform_(false), isGenerated_(false), order_(), globalIndexOnServer_()
       , computedWrittenIndex_(false)
@@ -76,7 +76,7 @@
 
 
-   StdSize CGrid::getDimension(void) const
-   {
-      return globalDim_.size();
+   StdSize CGrid::getDimension(void)
+   {
+      return getGlobalDimension().size();
    }
 
@@ -196,5 +196,5 @@
         for (int i = 0; i < axisListP.size(); ++i)
         {
-          axisListP[i]->checkAttributesOnClientAfterTransformation(globalDim_,axisPositionInGrid_[i]);
+          axisListP[i]->checkAttributesOnClientAfterTransformation(getGlobalDimension(),axisPositionInGrid_[i]);
         }
       }
@@ -243,6 +243,5 @@
      this->solveScalarRef(areAttributesChecked);
      this->solveAxisRef(areAttributesChecked);
-     this->solveDomainRef(areAttributesChecked);
-     computeGridGlobalDimension(getDomains(), getAxis(), getScalars(), axis_domain_order);
+     this->solveDomainRef(areAttributesChecked);     
      this->isDomainAxisChecked = areAttributesChecked;
    }
@@ -311,4 +310,9 @@
             {sendIndex(); this->isIndexSent = true;}
        }
+
+       // Not sure about this
+       //if (!(this->hasTransform() && !this->isTransformed()))
+       // this->isChecked = true;
+       //return;
      }
     
@@ -409,5 +413,5 @@
       using namespace std;
       std::vector<CDomain*> domainP = this->getDomains();
-      std::vector<CAxis*> axisP = this->getAxis();      
+      std::vector<CAxis*> axisP = this->getAxis();
       int dim = domainP.size() * 2 + axisP.size();
 
@@ -512,5 +516,5 @@
         {
           if (sendAtt)
-            axisListP[i]->sendCheckedAttributes(globalDim_,axisPositionInGrid_[i]);
+            axisListP[i]->sendCheckedAttributes(getGlobalDimension(),axisPositionInGrid_[i]);
           else
             axisListP[i]->checkAttributesOnClient();
@@ -534,4 +538,8 @@
         }
       }
+   }
+   std::vector<int> CGrid::getAxisPositionInGrid() const
+   {
+     return axisPositionInGrid_;
    }
 
@@ -652,6 +660,4 @@
               }              
             }
-
-
           }          
         }
@@ -695,5 +701,5 @@
        // Compute mapping between client and server
        std::vector<boost::unordered_map<size_t,std::vector<int> > > indexServerOnElement;
-       CServerDistributionDescription serverDistributionDescription(globalDim_, client->serverSize);
+       CServerDistributionDescription serverDistributionDescription(getGlobalDimension(), client->serverSize);
        serverDistributionDescription.computeServerGlobalByElement(indexServerOnElement,
                                                                   client->clientRank,
@@ -933,5 +939,5 @@
         }
       }
-     }
+    }
    }
    //----------------------------------------------------------------
@@ -1122,4 +1128,37 @@
    }
 
+/*
+   void CGrid::outputField(int rank, const CArray<double, 1>& stored, double* field)
+   {
+     const CArray<size_t,1>& out_i = outIndexFromClient[rank];
+     StdSize numElements = stored.numElements();
+     for (StdSize n = 0; n < numElements; ++n)
+     {
+       field[out_i(n)] = stored(n);
+     }
+   }
+
+   void CGrid::inputField(int rank, const double* const field, CArray<double,1>& stored)
+   {
+     const CArray<size_t,1>& out_i = outIndexFromClient[rank];
+     StdSize numElements = stored.numElements();
+     for (StdSize n = 0; n < numElements; ++n)
+     {
+       stored(n) = field[out_i(n)];
+     }
+   }
+
+   void CGrid::outputCompressedField(int rank, const CArray<double,1>& stored, double* field)
+   {
+     const CArray<size_t,1>& out_i = compressedOutIndexFromClient[rank];
+     StdSize numElements = stored.numElements();
+     for (StdSize n = 0; n < numElements; ++n)
+     {
+       field[out_i(n)] = stored(n);
+     }
+   }
+*/
+   //----------------------------------------------------------------
+
    void CGrid::storeField_arr(const double* const data, CArray<double, 1>& stored) const
    {
@@ -1170,5 +1209,4 @@
   {
     CContext* context = CContext::getCurrent();
-    // int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1;
     int nbSrvPools = (context->hasServer) ? (context->hasClient ? context->clientPrimServer.size() : 0) : 1;
     for (int p = 0; p < nbSrvPools; ++p)
@@ -1538,10 +1576,21 @@
   }
 
-  void CGrid::computeGridGlobalDimension(const std::vector<CDomain*>& domains,
-                                         const std::vector<CAxis*>& axis,
-                                         const std::vector<CScalar*>& scalars,
-                                         const CArray<int,1>& axisDomainOrder)
-  {
-    globalDim_.resize(domains.size()*2+axis.size()+scalars.size());
+  /*
+     Compute on the fly the global dimension of a grid with its elements
+     \param[in/out] globalDim global dimension of grid
+     \param[in] domains list of its domains
+     \param[in] axiss list of its axis
+     \param[in] scalars list of its scalars
+     \param[in] axisDomainOrder the order of element in a grid (e.g: scalar then axis)
+     \return The dimension of which we do distribution (often for server)
+  */
+  int CGrid::computeGridGlobalDimension(std::vector<int>& globalDim,
+                                        const std::vector<CDomain*> domains,
+                                        const std::vector<CAxis*> axis,
+                                        const std::vector<CScalar*> scalars,
+                                        const CArray<int,1>& axisDomainOrder)
+  {
+    globalDim.resize(domains.size()*2+axis.size()+scalars.size());
+    int positionDimensionDistributed = 1;
     int idx = 0, idxDomain = 0, idxAxis = 0, idxScalar = 0;
     for (int i = 0; i < axisDomainOrder.numElements(); ++i)
@@ -1551,13 +1600,13 @@
         if (!(domains[idxDomain]->type.isEmpty()) && (domains[idxDomain]->type==CDomain::type_attr::unstructured))
         {
-          positionDimensionDistributed_ = idx;
+          positionDimensionDistributed = idx;
         }
         else
         {
-          positionDimensionDistributed_ = idx +1;
-        }
-
-        globalDim_[idx]   = domains[idxDomain]->ni_glo.getValue();
-        globalDim_[idx+1] = domains[idxDomain]->nj_glo.getValue();
+          positionDimensionDistributed = idx +1;
+        }
+
+        globalDim[idx]   = domains[idxDomain]->ni_glo.getValue();
+        globalDim[idx+1] = domains[idxDomain]->nj_glo.getValue();
 
         ++idxDomain;
@@ -1566,5 +1615,5 @@
       else if (1 == axisDomainOrder(i))
       {
-        globalDim_[idx] = axis[idxAxis]->n_glo.getValue();
+        globalDim[idx] = axis[idxAxis]->n_glo.getValue();
         ++idxAxis;
         ++idx;
@@ -1572,14 +1621,27 @@
       else
       {
-        globalDim_[idx] = 1;
+        globalDim[idx] = 1;
         ++idxScalar;
         ++idx;
       }
     }
-  }
-
+
+    return positionDimensionDistributed;
+  }
+
+  // Retrieve the global dimension of grid
   std::vector<int> CGrid::getGlobalDimension()
   {
-    return globalDim_;
+    std::vector<int> globalDim;
+    computeGridGlobalDimension(globalDim, getDomains(), getAxis(), getScalars(), axis_domain_order);
+
+    return globalDim;
+  }
+
+  // Retrieve dimension on which we do distribution (Very often, it should be 2nd dimension)
+  int CGrid::getDistributedDimension()
+  {
+    std::vector<int> globalDim;
+    return computeGridGlobalDimension(globalDim, getDomains(), getAxis(), getScalars(), axis_domain_order);    
   }
 
Index: /XIOS/dev/dev_olga/src/node/grid.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/grid.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/grid.hpp	(revision 1158)
@@ -87,5 +87,5 @@
 
          /// Accesseurs ///
-         StdSize getDimension(void) const;
+         StdSize getDimension(void);
 
          StdSize  getDataSize(void) const;
@@ -176,4 +176,5 @@
          std::vector<int> getGlobalDimension();
          bool isScalarGrid() const;
+         std::vector<int> getAxisPositionInGrid() const;
 
          bool doGridHaveDataToWrite();
@@ -268,4 +269,10 @@
         void computeIndexByElement(const std::vector<boost::unordered_map<size_t,std::vector<int> > >& indexServerOnElement,
                                    CClientServerMapping::GlobalIndexMap& globalIndexOnServer);
+        int computeGridGlobalDimension(std::vector<int>& globalDim,
+                                       const std::vector<CDomain*> domains,
+                                       const std::vector<CAxis*> axis,
+                                       const std::vector<CScalar*> scalars,
+                                       const CArray<int,1>& axisDomainOrder);
+        int getDistributedDimension();
 
         void computeClientIndex();
@@ -296,6 +303,5 @@
         std::vector<int> axisPositionInGrid_;
         CGridTransformation* transformations_;
-        bool hasDomainAxisBaseRef_;
-        std::vector<int> globalDim_;
+        bool hasDomainAxisBaseRef_;        
         std::map<CGrid*, std::pair<bool,StdString> > gridSrc_;
         bool hasTransform_;
Index: /XIOS/dev/dev_olga/src/node/interpolate_domain.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/interpolate_domain.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/interpolate_domain.cpp	(revision 1158)
@@ -55,5 +55,5 @@
     {
       case mode_attr::read:
-        if (this->file.isEmpty())
+        if (this->weight_filename.isEmpty())
         {
           if (!this->write_weight)
@@ -64,5 +64,5 @@
         else
         {
-          weightFile = this->file;
+          weightFile = this->weight_filename;
           ifstream f(weightFile.c_str());
           if (!f.good())
@@ -75,7 +75,7 @@
         break;
       case mode_attr::read_or_compute:
-        if (!this->file.isEmpty() && !this->write_weight)
+        if (!this->weight_filename.isEmpty() && !this->write_weight)
         {
-          weightFile = this->file;
+          weightFile = this->weight_filename;
           ifstream f(weightFile.c_str());
           if (!f.good())
Index: /XIOS/dev/dev_olga/src/node/mesh.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/mesh.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/mesh.cpp	(revision 1158)
@@ -11,14 +11,14 @@
 /// ////////////////////// DÃ©finitions ////////////////////// ///
 
-  CMesh::CMesh(void) :  nbNodesGlo{0}, nbEdgesGlo{0}
-            ,  node_start{0}, node_count{0}
-            ,  edge_start{0}, edge_count{0}
-            ,  nbFaces_{0}, nbNodes_{0}, nbEdges_{0}
-            ,  nodesAreWritten{false}, edgesAreWritten{false}, facesAreWritten{false}
+  CMesh::CMesh(void) :  nbNodesGlo(0), nbEdgesGlo(0)
+            ,  node_start(0), node_count(0)
+            ,  edge_start(0), edge_count(0)
+            ,  nbFaces_(0), nbNodes_(0), nbEdges_(0)
+            ,  nodesAreWritten(false), edgesAreWritten(false), facesAreWritten(false)
             ,  node_lon(), node_lat()
             ,  edge_lon(), edge_lat(), edge_nodes()
             ,  face_lon(), face_lat()
             ,  face_nodes()
-            ,  pNodeGlobalIndex{NULL}, pEdgeGlobalIndex{NULL}
+            ,  pNodeGlobalIndex(NULL), pEdgeGlobalIndex(NULL)
   {
   }
@@ -91,30 +91,4 @@
       seed ^= sizetHash(first) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
     }
-    return seed ;
-  }
-
-///----------------------------------------------------------------
-/*!
- * \fn size_t generateEdgeIndex(size_t first, size_t second, int rank)
- * Generates an edge index.
- * If the same edge is generated by two processes, each process will have its own edge index.
- * \param [in] first Edge node.
- * \param [in] second Edge node.
- * \param [in] rank MPI process rank.
- */
-  size_t generateEdgeIndex(size_t first, size_t second, int rank)
-  {
-    size_t seed = rank ;
-    if (first < second)
-    {
-      seed = hashPair(seed, first);
-      seed = hashPair(seed, second);
-    }
-    else
-    {
-      seed = hashPair(seed, second);
-      seed = hashPair(seed, first);
-    }
-
     return seed ;
   }
@@ -141,4 +115,25 @@
     return seed ;
   }
+
+  ///----------------------------------------------------------------
+  /*!
+   * \fn size_t generateNodeIndex(vector<size_t>& valList)
+   * Generates a node index unique for all processes.
+   * \param [in] valList Vector storing four node hashes.
+   */
+    size_t generateNodeIndex(vector<size_t>& valList)
+    {
+      // Sort is needed to avoid problems for nodes with lon = 0 generated by faces in east and west semisphere
+      vector<size_t> vec = valList;
+      sort (vec.begin(), vec.end());
+      size_t seed = vec[0] ;
+      int it = 1;
+      for(; it != vec.size(); ++it)
+      {
+         seed = hashPair(seed, vec[it]);
+      }
+      return seed ;
+    }
+
 
 ///----------------------------------------------------------------
@@ -600,4 +595,5 @@
         CClientClientDHTSizet::Index2VectorInfoTypeMap nodeHash2Idx;
         CArray<size_t,1> nodeHashList(nbEdges_*nvertex*4);
+        int nbHash = 0;
         for (int ne = 0; ne < nbEdges_; ++ne)
         {
@@ -609,69 +605,103 @@
               if (nodeHash2Idx[hashValues[nh]].size() == 0)
               {
-                nodeHash2Idx[hashValues[nh]].push_back(generateNodeIndex(hashValues, mpiRank));
+                nodeHash2Idx[hashValues[nh]].push_back(generateNodeIndex(hashValues));
                 nodeHash2Idx[hashValues[nh]].push_back(mpiRank);
+                nodeHashList(nbHash) = hashValues[nh];
+                ++nbHash;
               }
-              nodeHashList((ne*nvertex + nv)*4 + nh) = hashValues[nh];
-            }
-          }
-        }
+            }
+          }
+        }
+        nodeHashList.resizeAndPreserve(nbHash);
 
         // (2.2) Generating global node indexes
-        // The ownership criterion: priority of the process holding the smaller index
+        // The ownership criterion: priority of the process of smaller index
         // Maps generated in this step are:
-        // nodeHash2Info = <hash, [[idx1, rank1], [idx2, rank2], [idx3, rank3]..]>
-        // nodeIdx2IdxMin = <idx, idxMin>
-        // nodeIdx2IdxGlo = <idxMin, idxMin>
-
-        CClientClientDHTSizet::Index2VectorInfoTypeMap nodeIdx2IdxMin;
-        CClientClientDHTSizet::Index2VectorInfoTypeMap nodeIdx2IdxGlo;
-        CArray<size_t,1> nodeIdxMinList(nbEdges_*nvertex);
-
-        CClientClientDHTSizet dhtNodeHash(nodeHash2Idx, comm);
-        dhtNodeHash.computeIndexInfoMapping(nodeHashList);
-        CClientClientDHTSizet::Index2VectorInfoTypeMap& nodeHash2Info = dhtNodeHash.getInfoIndexMap();
-        size_t iIdxMin = 0;
-
-        for (CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = nodeHash2Info.begin(); it != nodeHash2Info.end(); ++it)
-        {
-          size_t idx = (it->second)[0];
-          size_t idxMin = (it->second)[0];
-          for (int i = 2; i < (it->second).size();)
-          {
-            if (mpiRank == (it->second)[i+1])
-            {
-              idx = (it->second)[i];
-            }
-            if ((it->second)[i] < idxMin)
-            {
-                idxMin = (it->second)[i];
-                (it->second)[i] = (it->second)[i-2];
-            }
-            i += 2;
-          }
-          (it->second)[0] = idxMin;
-          if (nodeIdx2IdxMin.count(idx) == 0)
-          {
-            nodeIdx2IdxMin[idx].push_back(idxMin);
-            if (idx == idxMin)
-              nodeIdx2IdxGlo[idxMin].push_back(idxMin);
-            nodeIdxMinList(iIdxMin) = idxMin;
-            ++iIdxMin;
-          }
-        }
-        nodeIdxMinList.resizeAndPreserve(iIdxMin);
-        CDHTAutoIndexing dhtNodeIdxGlo = CDHTAutoIndexing(nodeIdx2IdxGlo, comm);
-        CClientClientDHTSizet dhtNodeIdx(nodeIdx2IdxGlo, comm);
-        dhtNodeIdx.computeIndexInfoMapping(nodeIdxMinList);
-        CClientClientDHTSizet::Index2VectorInfoTypeMap& nodeIdxMin2IdxGlo = dhtNodeIdx.getInfoIndexMap();
-        // nodeIdx2IdxGlo holds global indexes only for nodes owned by a process
-        // nodeIdxMin2IdxGlo holds global indexes for all nodes generated by a process
+        // Maps generated in this step are:
+         // nodeHash2Info = <hash, [[idx, rankMin], [idx, rank1], [idx, rank3]..]>
+         // nodeIdx2Idx = <idx, <rankOwner, idx>>
+
+         CClientClientDHTSizet dhtNodeHash(nodeHash2Idx, comm);
+         dhtNodeHash.computeIndexInfoMapping(nodeHashList);
+         CClientClientDHTSizet::Index2VectorInfoTypeMap& nodeHash2Info = dhtNodeHash.getInfoIndexMap();
+
+
+         CClientClientDHTSizet::Index2VectorInfoTypeMap nodeIdx2Idx;
+         CArray<size_t,1> nodeIdxList(nbEdges_*nvertex*4);
+         size_t nIdx = 0;
+
+         for (CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = nodeHash2Info.begin(); it != nodeHash2Info.end(); ++it)
+         {
+           size_t rankMin = (it->second)[1];
+           size_t idx = (it->second)[0];
+           for (int i = 2; i < (it->second).size();)
+           {
+             if ( (it->second)[i+1] < rankMin)
+             {
+               idx = (it->second)[i];
+               rankMin = (it->second)[i+1];
+               (it->second)[i+1] = (it->second)[i-1];
+             }
+             i += 2;
+           }
+           if (nodeIdx2Idx.count(idx) == 0)
+           {
+             if (mpiRank == rankMin)
+             {
+               nodeIdx2Idx[idx].push_back(rankMin);
+               nodeIdx2Idx[idx].push_back(idx);
+             }
+             nodeIdxList(nIdx) = idx;
+             ++nIdx;
+           }
+         }
+         nodeIdxList.resizeAndPreserve(nIdx);
+
+         // CDHTAutoIndexing will not give consistent node numbering for varying number of procs. =>
+         // Solution: global node indexing by hand.
+         // Maps modified in this step:
+         // nodeIdx2Idx = <idx, idxGlo>
+         int nodeCount = nodeIdx2Idx.size();
+         int nodeStart, nbNodes;
+         MPI_Scan(&nodeCount, &nodeStart, 1, MPI_UNSIGNED_LONG, MPI_SUM, comm);
+         int nNodes = nodeStart;
+         MPI_Bcast(&nNodes, 1, MPI_UNSIGNED_LONG, mpiSize-1, comm);
+         nbNodesGlo = nNodes;
+
+         nodeStart -= nodeCount;
+         node_start = nodeStart;
+         node_count = nodeCount;
+         CClientClientDHTSizet::Index2VectorInfoTypeMap dummyMap; // just a dummy map used to ensure that each node is numbered only once
+         size_t count = 0;
+
+         for (int ne = 0; ne < nbEdges_; ++ne)
+         {
+           for (int nv = 0; nv < nvertex; ++nv)
+           {
+             vector<size_t> hashValues = CMesh::createHashes(bounds_lon(nv, ne), bounds_lat(nv, ne));
+             size_t nodeIdx = generateNodeIndex(hashValues);
+             CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = nodeIdx2Idx.find(nodeIdx);
+             if (it != nodeIdx2Idx.end())
+             {
+               if (dummyMap.count(nodeIdx) == 0)
+               {
+                 dummyMap[nodeIdx].push_back(nodeIdx);
+                 (it->second)[1] = node_start + count;
+                 ++count;
+               }
+             }
+           }
+         }
+
+         CClientClientDHTSizet dhtNodeIdx(nodeIdx2Idx, comm);
+         dhtNodeIdx.computeIndexInfoMapping(nodeIdxList);
+         CClientClientDHTSizet::Index2VectorInfoTypeMap& nodeIdx2IdxGlo = dhtNodeIdx.getInfoIndexMap();
 
         // (2.3) Saving variables: node_lon, node_lat, edge_nodes
         // Creating map nodeHash2IdxGlo <hash, idxGlo>
         // Creating map edgeHash2IdxGlo <hash, idxGlo>
-        nbNodesGlo = dhtNodeIdxGlo.getNbIndexesGlobal();
-        node_count = dhtNodeIdxGlo.getIndexCount();
-        node_start = dhtNodeIdxGlo.getIndexStart();
+//        nbNodesGlo = dhtNodeIdxGlo.getNbIndexesGlobal();
+//        node_count = dhtNodeIdxGlo.getIndexCount();
+//        node_start = dhtNodeIdxGlo.getIndexStart();
         CClientClientDHTSizet::Index2VectorInfoTypeMap nodeHash2IdxGlo;
         node_lon.resize(node_count);
@@ -685,22 +715,14 @@
           {
             hashValues = CMesh::createHashes(bounds_lon(nv, ne), bounds_lat(nv, ne));
-            size_t myIdx = generateNodeIndex(hashValues, mpiRank);
-            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = nodeIdx2IdxMin.find(myIdx);
-            size_t ownerIdx = (itIdx->second)[0];
-
-            if (myIdx == ownerIdx)
-            {
-              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = nodeIdx2IdxGlo.find(myIdx);
-              idxGlo = (itIdxGlo->second)[0];
+            size_t myIdx = generateNodeIndex(hashValues);
+            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = nodeIdx2IdxGlo.find(myIdx);
+            idxGlo = (itIdx->second)[1];
+
+            if (mpiRank == (itIdx->second)[0])
+            {
 //              node_lon(idxGlo - node_start) = (bounds_lon(nv, ne) == 360.) ? (0.) : (bounds_lon(nv, ne));
               node_lon(idxGlo - node_start) = bounds_lon(nv, ne);
               node_lat(idxGlo - node_start) = bounds_lat(nv, ne);
             }
-            else
-            {
-              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = nodeIdxMin2IdxGlo.find(ownerIdx);
-              idxGlo = (itIdxGlo->second)[0];
-            }
-
             edge_nodes(nv,ne) = idxGlo;
             for (int nh = 0; nh < 4; ++nh)
@@ -793,5 +815,5 @@
         CClientClientDHTSizet::Index2VectorInfoTypeMap edgeHash2Rank;
         CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdxGlo2Face;
-        CArray<size_t,1> edgeIdxGloList(nbFaces_*nvertex);
+        CArray<size_t,1> edgeIdxList(nbFaces_*nvertex);
         size_t iIdx = 0;
 
@@ -824,10 +846,10 @@
               if (edgeIdxGlo2Face.count(edgeIdxGlo) == 0)
               {
-                edgeIdxGloList(iIdx) = edgeIdxGlo;
+                edgeIdxList(iIdx) = edgeIdxGlo;
                 ++iIdx;
               }
               edgeIdxGlo2Face[edgeIdxGlo].push_back(faceIdxGlo);
-              edgeHash2Rank[edgeHash].push_back(itEdgeHash->first);
               edgeHash2Rank[edgeHash].push_back(mpiRank);
+              edgeHash2Rank[edgeHash].push_back(itEdgeHash->second[0]);
             }
             else
@@ -837,5 +859,5 @@
           }
         }
-        edgeIdxGloList.resizeAndPreserve(iIdx);
+        edgeIdxList.resizeAndPreserve(iIdx);
 
         // (1.3) Saving remaining variables edge_faces and face_faces
@@ -846,30 +868,85 @@
         dhtEdgeHash.computeIndexInfoMapping(edgeHashList);
         CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeHash2Info = dhtEdgeHash.getInfoIndexMap();
-        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeHashMin2IdxGlo;
-
-        // edgeHash2Info = <edgeHash, <idxGlo, rank1, idxGlo, rank2>>
-        // edgeHashMin2IdxGlo = <edgeHashMin, idxGlo>
+
+        // edgeHash2Info = <edgeHash, < rank1, idxGlo, rank2, idxGlo>>
+        int edgeCount = 0;
         for (CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = edgeHash2Info.begin(); it != edgeHash2Info.end(); ++it)
         {
           vector <size_t> edgeInfo = it->second;
-          if (edgeInfo.size() == 4)                       // two processes generate the same edge
-            if (edgeInfo[1] > edgeInfo[3])
-              edgeInfo[1] = edgeInfo[3];
-          if (edgeInfo[1] == mpiRank)
-            edgeHashMin2IdxGlo[it->first].push_back(edgeInfo[0]);
-        }
-
-        CDHTAutoIndexing dhtEdgeIdxGlo = CDHTAutoIndexing(edgeHashMin2IdxGlo, comm);
-        edge_count = dhtEdgeIdxGlo.getIndexCount();
-        edge_start = dhtEdgeIdxGlo.getIndexStart();
+          if (edgeInfo[0] == mpiRank)
+          {
+            ++edgeCount;
+          }
+        }
+
+        int edgeStart, nbEdges;
+        MPI_Scan(&edgeCount, &edgeStart, 1, MPI_UNSIGNED_LONG, MPI_SUM, comm);
+        int nEdges = edgeStart;
+        MPI_Bcast(&nEdges, 1, MPI_UNSIGNED_LONG, mpiSize-1, comm);
+        nbEdgesGlo = nEdges;
+
+        // edges to be splitted equally between procs
+        if ( (nbEdgesGlo % mpiSize) == 0)
+        {
+          edge_count = nbEdgesGlo/mpiSize;
+          edge_start = mpiRank*edge_count;
+        }
+        else
+        {
+          if (mpiRank == (mpiSize - 1) )
+          {
+            edge_count = nbEdgesGlo/mpiSize;
+            edge_start = mpiRank*(nbEdgesGlo/mpiSize + 1);
+          }
+          else
+          {
+            edge_count = nbEdgesGlo/mpiSize + 1;
+            edge_start = mpiRank*edge_count;
+          }
+        }
+        CArray<size_t,1> edgeIdxGloList(edge_count);
+        for (int i = 0; i < edge_count; ++i)
+        {
+          edgeIdxGloList(i) = i + edge_start;
+        }
+
+        CClientClientDHTSizet dhtEdgeIdxGlo2Face (edgeIdxGlo2Face, comm);
+        CClientClientDHTSizet dhtEdge2Face (edgeIdxGlo2Face, comm);
+        dhtEdgeIdxGlo2Face.computeIndexInfoMapping(edgeIdxGloList);
+        CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdxGlo2FaceIdx = dhtEdgeIdxGlo2Face.getInfoIndexMap();
+        dhtEdge2Face.computeIndexInfoMapping(edgeIdxList);
+        CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdx2FaceIdx = dhtEdge2Face.getInfoIndexMap();
+
 
         edge_faces.resize(2, edge_count);
+        for (int i = 0; i < edge_count; ++i)
+        {
+          CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = edgeIdxGlo2FaceIdx.find(i + edge_start);
+          int indexGlo = it->first;
+          vector<size_t> faces = it->second;
+          int face1 = faces[0];
+          edge_faces(0, indexGlo - edge_start) = face1;
+          if (faces.size() == 2)
+          {
+            int face2 = faces[1];
+            edge_faces(1, indexGlo - edge_start) = face2;
+          }
+          else
+          {
+            edge_faces(1, indexGlo - edge_start) = -999;
+          }
+        }
+
+        size_t tmp;
+        vector<size_t> tmpVec;
+        for (CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = edgeIdx2FaceIdx.begin(); it != edgeIdx2FaceIdx.end(); it++)
+        {
+          tmp = it->first;
+          tmpVec = it->second;
+          tmp++;
+        }
+
+        CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itFace1, itFace2, itIndex;
         face_faces.resize(nvertex, nbFaces_);
-
-        CClientClientDHTSizet dhtEdge2Face (edgeIdxGlo2Face, comm);
-        dhtEdge2Face.computeIndexInfoMapping(edgeIdxGloList);
-        CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdxGlo2FaceIdx = dhtEdge2Face.getInfoIndexMap();
-        CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itFace1, itFace2;
-
         for (int nf = 0; nf < nbFaces_; ++nf)
         {
@@ -896,14 +973,13 @@
               size_t faceIdxGlo = nbFacesAccum + nf;
               size_t edgeHash = hashPairOrdered(it1->second[0], it2->second[0]);
-              itEdgeHash = edgeHash2IdxGlo.find(edgeHash);
-              if (itEdgeHash != edgeHashMin2IdxGlo.end())
+              itEdgeHash = edgeHash2Info.find(edgeHash);
+              int edgeIdxGlo = (itEdgeHash->second)[1];
+
+              if ( (itEdgeHash->second)[0] == mpiRank)
               {
-                int edgeIdxGlo = itEdgeHash->second[0];
-                itFace1 = edgeIdxGlo2FaceIdx.find(edgeIdxGlo);
+                itFace1 = edgeIdx2FaceIdx.find(edgeIdxGlo);
                 int face1 = itFace1->second[0];
                 if (itFace1->second.size() == 1)
                 {
-                  edge_faces(0, edgeIdxGlo - edge_start) = face1;
-                  edge_faces(1, edgeIdxGlo - edge_start) = -999;
                   face_faces(nv1, nf) = 999999;
                 }
@@ -911,6 +987,4 @@
                 {
                   int face2 = itFace1->second[1];
-                  edge_faces(0, edgeIdxGlo - edge_start) = face1;
-                  edge_faces(1, edgeIdxGlo - edge_start) = face2;
                   face_faces(nv1, nf) = (faceIdxGlo == face1 ? face2 : face1);
                 }
@@ -918,7 +992,5 @@
               else
               {
-                itEdgeHash = edgeHashMin2IdxGlo.find(edgeHash);
-                size_t edgeIdxGlo = itEdgeHash->second[0];
-                itFace1 = edgeIdxGlo2FaceIdx.find(edgeIdxGlo);
+                itFace1 = edgeIdx2FaceIdx.find(edgeIdxGlo);
                 int face1 = itFace1->second[0];
                 int face2 = itFace1->second[1];
@@ -957,4 +1029,5 @@
         CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it1, it2;
         CArray<size_t,1> edgeHashList(nbFaces_*nvertex);
+        int nEdgeHash = 0;
         for (int nf = 0; nf < nbFaces_; ++nf)
         {
@@ -978,73 +1051,65 @@
             face_nodes(nv1,nf) = it1->second[0];
             size_t edgeHash = hashPairOrdered(it1->second[0], it2->second[0]);
-            edgeHash2Idx[edgeHash].push_back(generateEdgeIndex(it1->second[0], it2->second[0], mpiRank));
-            edgeHash2Idx[edgeHash].push_back(mpiRank);
-            edgeHashList(nf*nvertex + nv1) = edgeHash;
-          }
-        }
-
-        // (2.2) Generating global edge indexes
-        // The ownership criterion: priority of the process holding the smaller index
+            if (edgeHash2Idx.count(edgeHash) == 0)
+            {
+              edgeHash2Idx[edgeHash].push_back(edgeHash);
+              edgeHash2Idx[edgeHash].push_back(mpiRank);
+              edgeHashList(nEdgeHash) = edgeHash;
+              ++nEdgeHash;
+            }
+          }
+        }
+        edgeHashList.resizeAndPreserve(nEdgeHash);
+
+        // (2.3) Generating global edge indexes
+        // The ownership criterion: priority of the process with smaller rank
         // Maps generated in this step are:
-        // edgeHash2Info = <hash, [[idx1, rank1], [idx2, rank2], [idx3, rank3]..]>
-        // edgeIdx2IdxMin = = <idx, idxMin>
-        // edgeIdx2IdxGlo = <idxMin, idxGlo>
+        // edgeIdx2Idx = = <idx, <rankOwner, idx>>
+        // edgeIdx2IdxGlo = <idxMin, <rankOwner, idxGlo>>
 
         CClientClientDHTSizet dhtEdgeHash(edgeHash2Idx, comm);
         dhtEdgeHash.computeIndexInfoMapping(edgeHashList);
         CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeHash2Info = dhtEdgeHash.getInfoIndexMap();
-
-        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdx2IdxMin;
-        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdx2IdxGlo;
-        CArray<size_t,1> edgeIdxMinList(nbFaces_*nvertex);
-        size_t iIdxMin = 0;
+        // edgeHash2Info = <hash, [[idx1, rank1], [idx2, rank2], [idx3, rank3]..]>
+
+        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdx2Idx;
 
         for (CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = edgeHash2Info.begin(); it != edgeHash2Info.end(); ++it)
         {
-          size_t idxMin = (it->second)[0];
+          size_t rankMin = (it->second)[1];
           size_t idx = (it->second)[0];
+
           for (int i = 2; i < (it->second).size();)
           {
-            if (mpiRank == (it->second)[i+1])
-            {
+            if ((it->second)[i+1] < rankMin)
+            {
+              rankMin = (it->second)[i+1];
               idx = (it->second)[i];
-            }
-            if ((it->second)[i] < idxMin)
-            {
-                idxMin = (it->second)[i];
-                (it->second)[i] = (it->second)[i-2];
+              (it->second)[i+1] = (it->second)[i-1];
             }
             i += 2;
           }
-          (it->second)[0] = idxMin;
-          if (edgeIdx2IdxMin.count(idx) == 0)
-          {
-            edgeIdx2IdxMin[idx].push_back(idxMin);
-            if (idx == idxMin)
-              edgeIdx2IdxGlo[idxMin].push_back(idxMin);
-            edgeIdxMinList(iIdxMin) = idxMin;
-            ++iIdxMin;
-          }
-        }
-        edgeIdxMinList.resizeAndPreserve(iIdxMin);
-        CDHTAutoIndexing dhtEdgeIdxGlo = CDHTAutoIndexing(edgeIdx2IdxGlo, comm);
-        CClientClientDHTSizet dhtEdgeIdx(edgeIdx2IdxGlo, comm);
-        dhtEdgeIdx.computeIndexInfoMapping(edgeIdxMinList);
-        CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdxMin2IdxGlo = dhtEdgeIdx.getInfoIndexMap();
-        // edgeIdx2IdxGlo holds global indexes only for edges owned by a process
-        // edgeIdxMin2IdxGlo holds global indexes for all edges generated by a process
-
-        // (2.3) Saving variables: edge_lon, edge_lat, face_edges
-        nbEdgesGlo = dhtEdgeIdxGlo.getNbIndexesGlobal();
-        edge_count = dhtEdgeIdxGlo.getIndexCount();
-        edge_start = dhtEdgeIdxGlo.getIndexStart();
-        edge_lon.resize(edge_count);
-        edge_lat.resize(edge_count);
-        edge_nodes.resize(2, edge_count);
-        face_edges.resize(nvertex, nbFaces_);
-
-        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdxGlo2Face;
-        CArray<size_t,1> edgeIdxGloList(nbFaces_*nvertex);
-        size_t iIdx = 0;
+          if (edgeIdx2Idx.count(idx) == 0)
+          {
+            if (mpiRank == rankMin)
+            {
+              edgeIdx2Idx[idx].push_back(rankMin);
+              edgeIdx2Idx[idx].push_back(idx);
+            }
+          }
+        }
+
+        int edgeCount = edgeIdx2Idx.size();
+        int edgeStart, nbEdges;
+        MPI_Scan(&edgeCount, &edgeStart, 1, MPI_UNSIGNED_LONG, MPI_SUM, comm);
+        int nEdges = edgeStart;
+        MPI_Bcast(&nEdges, 1, MPI_UNSIGNED_LONG, mpiSize-1, comm);
+        nbEdgesGlo = nEdges;
+
+        edgeStart -= edgeCount;
+        edge_start = edgeStart;
+        edge_count = edgeCount;
+        CClientClientDHTSizet::Index2VectorInfoTypeMap dummyEdgeMap;
+        int count = 0;
 
         for (int nf = 0; nf < nbFaces_; ++nf)
@@ -1068,19 +1133,70 @@
               it2 = nodeHash2IdxGlo.find(nodeHashList((nf*nvertex + nv1)*4 + nh2));
             }
+            size_t nodeIdxGlo1 = it1->second[0];
+            size_t nodeIdxGlo2 = it2->second[0];
+
+            if (nodeIdxGlo1 != nodeIdxGlo2)
+            {
+              size_t edgeIdx = hashPairOrdered(nodeIdxGlo1, nodeIdxGlo2);
+              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = edgeIdx2Idx.find(edgeIdx);
+              if (it != edgeIdx2Idx.end())
+              {
+                if (dummyEdgeMap.count(edgeIdx) == 0)
+                {
+                  dummyEdgeMap[edgeIdx].push_back(edgeIdx);
+                  (it->second)[1] = edge_start + count;
+                  ++count;
+                }
+              }
+            }
+          }
+        }
+
+        CClientClientDHTSizet dhtEdgeIdx(edgeIdx2Idx, comm);
+        dhtEdgeIdx.computeIndexInfoMapping(edgeHashList);
+        CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdx2IdxGlo = dhtEdgeIdx.getInfoIndexMap();
+
+        // (2.4) Saving variables: edge_lon, edge_lat, face_edges
+        edge_lon.resize(edge_count);
+        edge_lat.resize(edge_count);
+        edge_nodes.resize(2, edge_count);
+        face_edges.resize(nvertex, nbFaces_);
+
+        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdxGlo2Face;
+        CArray<size_t,1> edgeIdxGloList(nbFaces_*nvertex);
+        size_t iIdx = 0;
+
+        for (int nf = 0; nf < nbFaces_; ++nf)
+        {
+          for (int nv1 = 0; nv1 < nvertex; ++nv1)
+          {
+            // Getting global indexes of edge's nodes
+            int nh1 = 0;
+            int nv2 = (nv1 < nvertex -1 ) ? (nv1 + 1) : (nv1 + 1 - nvertex); // cyclic rotation
+            it1 = nodeHash2IdxGlo.find(nodeHashList((nf*nvertex + nv1)*4 + nh1));
+            while (it1 == nodeHash2IdxGlo.end())
+            {
+              ++nh1;
+              it1 = nodeHash2IdxGlo.find(nodeHashList((nf*nvertex + nv1)*4 + nh1));
+            }
+            int nh2 = 0;
+            it2 = nodeHash2IdxGlo.find(nodeHashList((nf*nvertex + nv2)*4 + nh2));
+            while (it2 == nodeHash2IdxGlo.end())
+            {
+              ++nh2;
+              it2 = nodeHash2IdxGlo.find(nodeHashList((nf*nvertex + nv1)*4 + nh2));
+            }
             // Getting edge global index
             size_t nodeIdxGlo1 = it1->second[0];
             size_t nodeIdxGlo2 = it2->second[0];
-            size_t myIdx = generateEdgeIndex(nodeIdxGlo1, nodeIdxGlo2, mpiRank);
+            size_t myIdx = hashPairOrdered(nodeIdxGlo1, nodeIdxGlo2);
             if (nodeIdxGlo1 != nodeIdxGlo2)
             {
-              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = edgeIdx2IdxMin.find(myIdx);
-              size_t ownerIdx = (itIdx->second)[0];
-              int edgeIdxGlo = 0;
+              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = edgeIdx2IdxGlo.find(myIdx);
+              int edgeIdxGlo = (itIdx->second)[1];
               size_t faceIdxGlo = nbFacesAccum + nf;
 
-              if (myIdx == ownerIdx)
+              if (mpiRank == (itIdx->second)[0])
               {
-                CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdx2IdxGlo.find(myIdx);
-                edgeIdxGlo = (itIdxGlo->second)[0];
                 double edgeLon;
                 double diffLon = abs(bounds_lon(nv1, nf) - bounds_lon(nv2, nf));
@@ -1096,9 +1212,4 @@
                 edge_nodes(1, edgeIdxGlo - edge_start) = nodeIdxGlo2;
               }
-              else
-              {
-                CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdxMin2IdxGlo.find(ownerIdx);
-                edgeIdxGlo = (itIdxGlo->second)[0];
-              }
               face_edges(nv1,nf) = edgeIdxGlo;
               if (edgeIdxGlo2Face.count(edgeIdxGlo) == 0)
@@ -1117,5 +1228,5 @@
         edgeIdxGloList.resizeAndPreserve(iIdx);
 
-        // (2.4) Saving remaining variables edge_faces and face_faces
+        // (2.5) Saving remaining variables edge_faces and face_faces
         edge_faces.resize(2, edge_count);
         face_faces.resize(nvertex, nbFaces_);
@@ -1125,4 +1236,5 @@
         CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdxGlo2FaceIdx = dhtEdge2Face.getInfoIndexMap();
         CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itNodeIdxGlo1, itNodeIdxGlo2;
+        CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx;
 
         for (int nf = 0; nf < nbFaces_; ++nf)
@@ -1149,13 +1261,11 @@
             size_t nodeIdxGlo2 = it2->second[0];
 
-            size_t myIdx = generateEdgeIndex(nodeIdxGlo1, nodeIdxGlo2, mpiRank);
-            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = edgeIdx2IdxMin.find(myIdx);
-            size_t ownerIdx = (itIdx->second)[0];
+            size_t myIdx = hashPairOrdered(nodeIdxGlo1, nodeIdxGlo2);
+            itIdx = edgeIdx2IdxGlo.find(myIdx);
             size_t faceIdxGlo = nbFacesAccum + nf;
-
-            if (myIdx == ownerIdx)
-            {
-              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdx2IdxGlo.find(myIdx);
-              int edgeIdxGlo = (itIdxGlo->second)[0];
+            int edgeIdxGlo = (itIdx->second)[1];
+
+            if (mpiRank == (itIdx->second)[0])
+            {
               it1 = edgeIdxGlo2FaceIdx.find(edgeIdxGlo);
               int face1 = it1->second[0];
@@ -1176,6 +1286,4 @@
             else
             {
-              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdxMin2IdxGlo.find(ownerIdx);
-              size_t edgeIdxGlo = (itIdxGlo->second)[0];
               it1 = edgeIdxGlo2FaceIdx.find(edgeIdxGlo);
               int face1 = it1->second[0];
@@ -1200,5 +1308,6 @@
           {
             hashValues = CMesh::createHashes(bounds_lon(nv, nf), bounds_lat(nv, nf));
-            size_t nodeIndex = generateNodeIndex(hashValues, mpiRank);
+//            size_t nodeIndex = generateNodeIndex(hashValues, mpiRank);
+            size_t nodeIndex = generateNodeIndex(hashValues);
             for (int nh = 0; nh < 4; ++nh)
             {
@@ -1216,9 +1325,9 @@
 
         // (3.2) Generating global node indexes
-        // The ownership criterion: priority of the process holding the smaller index
+        // The ownership criterion: priority of the process with smaller rank.
+        // With any other criterion it is not possible to have consistent node indexing for different number of procs.
         // Maps generated in this step are:
-        // nodeHash2Info = <hash, [[idxMin, rankMin], [idx1, rank1], [idx3, rank3]..]>
-        // nodeIdx2IdxMin = = <idx, idxMin>
-        // nodeIdx2IdxGlo = <idxMin, idxGlo>
+        // nodeHash2Info = <hash, [[idx, rankMin], [idx, rank1], [idx, rank3]..]>
+        // nodeIdx2Idx = <idx, <rankOwner, idx>>
 
         CClientClientDHTSizet dhtNodeHash(nodeHash2Idx, comm);
@@ -1226,48 +1335,80 @@
         CClientClientDHTSizet::Index2VectorInfoTypeMap& nodeHash2Info = dhtNodeHash.getInfoIndexMap();
 
-        CClientClientDHTSizet::Index2VectorInfoTypeMap nodeIdx2IdxMin;
-        CClientClientDHTSizet::Index2VectorInfoTypeMap nodeIdx2IdxGlo;
-        CArray<size_t,1> nodeIdxMinList(nbFaces_*nvertex*4);
-        size_t iIdxMin = 0;
+        CClientClientDHTSizet::Index2VectorInfoTypeMap nodeIdx2Idx;
+        CArray<size_t,1> nodeIdxList(nbFaces_*nvertex*4);
+        size_t nIdx = 0;
 
         for (CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = nodeHash2Info.begin(); it != nodeHash2Info.end(); ++it)
         {
-          size_t idxMin = (it->second)[0];
+          size_t rankMin = (it->second)[1];
           size_t idx = (it->second)[0];
           for (int i = 2; i < (it->second).size();)
           {
-            if (mpiRank == (it->second)[i+1])
+            if ( (it->second)[i+1] < rankMin)
             {
               idx = (it->second)[i];
-            }
-            if ((it->second)[i] < idxMin)
-            {
-                idxMin = (it->second)[i];
-                (it->second)[i] = (it->second)[i-2];
+              rankMin = (it->second)[i+1];
+              (it->second)[i+1] = (it->second)[i-1];
             }
             i += 2;
           }
-          (it->second)[0] = idxMin;
-          if (nodeIdx2IdxMin.count(idx) == 0)
-          {
-            nodeIdx2IdxMin[idx].push_back(idxMin);
-            if (idx == idxMin)
-              nodeIdx2IdxGlo[idxMin].push_back(idxMin);
-            nodeIdxMinList(iIdxMin) = idxMin;
-            ++iIdxMin;
-          }
-        }
-
-        nodeIdxMinList.resizeAndPreserve(iIdxMin);
-        CDHTAutoIndexing dhtNodeIdxGlo = CDHTAutoIndexing(nodeIdx2IdxGlo, comm);
-        CClientClientDHTSizet dhtNodeIdx(nodeIdx2IdxGlo, comm);
-        dhtNodeIdx.computeIndexInfoMapping(nodeIdxMinList);
-        CClientClientDHTSizet::Index2VectorInfoTypeMap& nodeIdxMin2IdxGlo = dhtNodeIdx.getInfoIndexMap();
+          if (nodeIdx2Idx.count(idx) == 0)
+          {
+            if (mpiRank == rankMin)
+            {
+              nodeIdx2Idx[idx].push_back(rankMin);
+              nodeIdx2Idx[idx].push_back(idx);
+            }
+            nodeIdxList(nIdx) = idx;
+            ++nIdx;
+          }
+        }
+
+//        CDHTAutoIndexing dhtNodeIdxGlo = CDHTAutoIndexing(nodeIdx2Idx, comm);
+        // CDHTAutoIndexing will not give consistent node numbering for varying number of procs. =>
+        // Solution: global node indexing by hand.
+        // Maps modified in this step:
+        // nodeIdx2Idx = <idx, idxGlo>
+        int nodeCount = nodeIdx2Idx.size();
+        int nodeStart, nbNodes;
+        MPI_Scan(&nodeCount, &nodeStart, 1, MPI_UNSIGNED_LONG, MPI_SUM, comm);
+        int nNodes = nodeStart;
+        MPI_Bcast(&nNodes, 1, MPI_UNSIGNED_LONG, mpiSize-1, comm);
+        nbNodesGlo = nNodes;
+
+        nodeStart -= nodeCount;
+        node_start = nodeStart;
+        node_count = nodeCount;
+        CClientClientDHTSizet::Index2VectorInfoTypeMap dummyMap; // just a dummy map used to ensure that each node is numbered only once
+        size_t count = 0;
+
+        for (int nf = 0; nf < nbFaces_; ++nf)
+        {
+          for (int nv = 0; nv < nvertex; ++nv)
+          {
+            vector<size_t> hashValues = CMesh::createHashes(bounds_lon(nv, nf), bounds_lat(nv, nf));
+            size_t nodeIdx = generateNodeIndex(hashValues);
+            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = nodeIdx2Idx.find(nodeIdx);
+            if (it != nodeIdx2Idx.end())
+            {
+              if (dummyMap.count(nodeIdx) == 0)
+              {
+                dummyMap[nodeIdx].push_back(nodeIdx);
+                (it->second)[1] = node_start + count;
+                ++count;
+              }
+            }
+          }
+        }
+        nodeIdxList.resizeAndPreserve(nIdx);
+        CClientClientDHTSizet dhtNodeIdx(nodeIdx2Idx, comm);
+        dhtNodeIdx.computeIndexInfoMapping(nodeIdxList);
+        CClientClientDHTSizet::Index2VectorInfoTypeMap& nodeIdx2IdxGlo = dhtNodeIdx.getInfoIndexMap();
 
         // (3.3) Saving node data: node_lon, node_lat, and face_nodes
         // Generating edgeHash2Info = <hash, <idx, rank>> and edgeHashList
-        nbNodesGlo = dhtNodeIdxGlo.getNbIndexesGlobal();
-        node_count = dhtNodeIdxGlo.getIndexCount();
-        node_start = dhtNodeIdxGlo.getIndexStart();
+//        nbNodesGlo = dhtNodeIdxGlo.getNbIndexesGlobal();
+//        node_count = dhtNodeIdxGlo.getIndexCount();
+//        node_start = dhtNodeIdxGlo.getIndexStart();
         node_lon.resize(node_count);
         node_lat.resize(node_count);
@@ -1286,28 +1427,21 @@
             vector<size_t> hashValues1 = CMesh::createHashes(bounds_lon(nv1, nf), bounds_lat(nv1, nf));
             vector<size_t> hashValues2 = CMesh::createHashes(bounds_lon(nv2, nf), bounds_lat(nv2, nf));
-            size_t myNodeIdx1 = generateNodeIndex(hashValues1, mpiRank);
-            size_t myNodeIdx2 = generateNodeIndex(hashValues2, mpiRank);
-            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itNodeIdx1 = nodeIdx2IdxMin.find(myNodeIdx1);
-            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itNodeIdx2 = nodeIdx2IdxMin.find(myNodeIdx2);
-            size_t ownerNodeIdx = (itNodeIdx1->second)[0];
-
-            if (myNodeIdx1 == ownerNodeIdx)
-            {
-              itNodeIdxGlo1 = nodeIdx2IdxGlo.find(myNodeIdx1);
-              nodeIdxGlo1 = (itNodeIdxGlo1->second)[0];
+            size_t nodeIdx1 = generateNodeIndex(hashValues1);
+            size_t nodeIdx2 = generateNodeIndex(hashValues2);
+            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itNodeIdx1 = nodeIdx2IdxGlo.find(nodeIdx1);
+            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itNodeIdx2 = nodeIdx2IdxGlo.find(nodeIdx2);
+            size_t ownerRank = (itNodeIdx1->second)[0];
+            nodeIdxGlo1 = (itNodeIdx1->second)[1];
+            nodeIdxGlo2 = (itNodeIdx2->second)[1];
+
+            if (mpiRank == ownerRank)
+            {
               node_lon(nodeIdxGlo1 - node_start) = bounds_lon(nv1, nf);
               node_lat(nodeIdxGlo1 - node_start) = bounds_lat(nv1, nf);
             }
-            else
-            {
-              itNodeIdxGlo1 = nodeIdxMin2IdxGlo.find(ownerNodeIdx);
-              nodeIdxGlo1 = (itNodeIdxGlo1->second)[0];
-            }
-            itNodeIdxGlo2 = nodeIdxMin2IdxGlo.find((itNodeIdx2->second)[0]);
-            nodeIdxGlo2 = (itNodeIdxGlo2->second)[0];
             if (nodeIdxGlo1 != nodeIdxGlo2)
             {
               size_t edgeHash = hashPairOrdered(nodeIdxGlo1, nodeIdxGlo2);
-              edgeHash2Idx[edgeHash].push_back(generateEdgeIndex(nodeIdxGlo1, nodeIdxGlo2, mpiRank));
+              edgeHash2Idx[edgeHash].push_back(edgeHash);
               edgeHash2Idx[edgeHash].push_back(mpiRank);
               edgeHashList(nEdgeHash) = edgeHash;
@@ -1321,6 +1455,6 @@
         // (3.4) Generating global edge indexes
         // Maps generated in this step are:
-        // edgeIdx2IdxMin = = <idx, idxMin>
-        // edgeIdx2IdxGlo = <idxMin, idxGlo>
+        // edgeIdx2Idx = = <idx, <rankOwner, idx>>
+        // edgeIdx2IdxGlo = <idxMin, <rankOwner, idxGlo>>
 
         CClientClientDHTSizet dhtEdgeHash(edgeHash2Idx, comm);
@@ -1329,49 +1463,84 @@
         // edgeHash2Info = <hash, [[idx1, rank1], [idx2, rank2], [idx3, rank3]..]>
 
-        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdx2IdxMin;
-        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdx2IdxGlo;
-        CArray<size_t,1> edgeIdxMinList(nbFaces_*nvertex);
-        iIdxMin = 0;
+        CClientClientDHTSizet::Index2VectorInfoTypeMap edgeIdx2Idx;
 
         for (CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = edgeHash2Info.begin(); it != edgeHash2Info.end(); ++it)
         {
-          size_t idxMin = (it->second)[0];
+          size_t rankMin = (it->second)[1];
           size_t idx = (it->second)[0];
 
           for (int i = 2; i < (it->second).size();)
           {
-            if (mpiRank == (it->second)[i+1])
-            {
+            if ((it->second)[i+1] < rankMin)
+            {
+              rankMin = (it->second)[i+1];
               idx = (it->second)[i];
-            }
-            if ((it->second)[i] < idxMin)
-            {
-                idxMin = (it->second)[i];
-                (it->second)[i] = (it->second)[i-2];
+              (it->second)[i+1] = (it->second)[i-1];
             }
             i += 2;
           }
-          (it->second)[0] = idxMin;
-          if (edgeIdx2IdxMin.count(idx) == 0)
-          {
-            edgeIdx2IdxMin[idx].push_back(idxMin);
-            if (idx == idxMin)
-              edgeIdx2IdxGlo[idxMin].push_back(idxMin);
-            edgeIdxMinList(iIdxMin) = idxMin;
-            ++iIdxMin;
-          }
-        }
-        edgeIdxMinList.resizeAndPreserve(iIdxMin);
-        CDHTAutoIndexing dhtEdgeIdxGlo = CDHTAutoIndexing(edgeIdx2IdxGlo, comm);
-        CClientClientDHTSizet dhtEdgeIdx(edgeIdx2IdxGlo, comm);
-        dhtEdgeIdx.computeIndexInfoMapping(edgeIdxMinList);
-        CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdxMin2IdxGlo = dhtEdgeIdx.getInfoIndexMap();
+          if (edgeIdx2Idx.count(idx) == 0)
+          {
+            if (mpiRank == rankMin)
+            {
+              edgeIdx2Idx[idx].push_back(rankMin);
+              edgeIdx2Idx[idx].push_back(idx);
+            }
+          }
+        }
+
+        int edgeCount = edgeIdx2Idx.size();
+        int edgeStart, nbEdges;
+        MPI_Scan(&edgeCount, &edgeStart, 1, MPI_UNSIGNED_LONG, MPI_SUM, comm);
+        int nEdges = edgeStart;
+        MPI_Bcast(&nEdges, 1, MPI_UNSIGNED_LONG, mpiSize-1, comm);
+        nbEdgesGlo = nEdges;
+
+        edgeStart -= edgeCount;
+        edge_start = edgeStart;
+        edge_count = edgeCount;
+        CClientClientDHTSizet::Index2VectorInfoTypeMap dummyEdgeMap;
+        count = 0;
+
+        for (int nf = 0; nf < nbFaces_; ++nf)
+        {
+          for (int nv1 = 0; nv1 < nvertex; ++nv1)
+          {
+            int nv2 = (nv1 < nvertex -1 ) ? (nv1 + 1) : (nv1 + 1 - nvertex); // cyclic rotation
+            vector<size_t> hashValues1 = CMesh::createHashes(bounds_lon(nv1, nf), bounds_lat(nv1, nf));
+            vector<size_t> hashValues2 = CMesh::createHashes(bounds_lon(nv2, nf), bounds_lat(nv2, nf));
+            size_t nodeIdx1 = generateNodeIndex(hashValues1);
+            size_t nodeIdx2 = generateNodeIndex(hashValues2);
+            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itNodeIdx1 = nodeIdx2IdxGlo.find(nodeIdx1);
+            CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itNodeIdx2 = nodeIdx2IdxGlo.find(nodeIdx2);
+            nodeIdxGlo1 = (itNodeIdx1->second)[1];
+            nodeIdxGlo2 = (itNodeIdx2->second)[1];
+
+            if (nodeIdxGlo1 != nodeIdxGlo2)
+            {
+              size_t edgeIdx = hashPairOrdered(nodeIdxGlo1, nodeIdxGlo2);
+              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator it = edgeIdx2Idx.find(edgeIdx);
+              if (it != edgeIdx2Idx.end())
+              {
+                if (dummyEdgeMap.count(edgeIdx) == 0)
+                {
+                  dummyEdgeMap[edgeIdx].push_back(edgeIdx);
+                  (it->second)[1] = edge_start + count;
+                  ++count;
+                }
+              }
+            }
+          }
+        }
+        CClientClientDHTSizet dhtEdgeIdx(edgeIdx2Idx, comm);
+        dhtEdgeIdx.computeIndexInfoMapping(edgeHashList);
+        CClientClientDHTSizet::Index2VectorInfoTypeMap& edgeIdx2IdxGlo = dhtEdgeIdx.getInfoIndexMap();
 
         // (3.5) Saving variables: edge_lon, edge_lat, face_edges
         // Creating map edgeIdxGlo2Face <idxGlo, face>
-
-        nbEdgesGlo = dhtEdgeIdxGlo.getNbIndexesGlobal();
-        edge_count = dhtEdgeIdxGlo.getIndexCount();
-        edge_start = dhtEdgeIdxGlo.getIndexStart();
+//        nbEdgesGlo = dhtEdgeIdxGlo.getNbIndexesGlobal();
+//        edge_count = dhtEdgeIdxGlo.getIndexCount();
+//        edge_start = dhtEdgeIdxGlo.getIndexStart();
+
         edge_lon.resize(edge_count);
         edge_lat.resize(edge_count);
@@ -1393,25 +1562,20 @@
             vector<size_t> hashValues2 = CMesh::createHashes(bounds_lon(nv2, nf), bounds_lat(nv2, nf));
 
-            size_t myNodeIdx1 = generateNodeIndex(hashValues1, mpiRank);
-            size_t myNodeIdx2 = generateNodeIndex(hashValues2, mpiRank);
-            it1 = nodeIdx2IdxMin.find(myNodeIdx1);
-            it2 = nodeIdx2IdxMin.find(myNodeIdx2);
-            itNodeIdxGlo1 = nodeIdxMin2IdxGlo.find((it1->second)[0]);
-            itNodeIdxGlo2 = nodeIdxMin2IdxGlo.find((it2->second)[0]);
-            size_t nodeIdxGlo1 = (itNodeIdxGlo1->second)[0];
-            size_t nodeIdxGlo2 = (itNodeIdxGlo2->second)[0];
+            size_t nodeIdx1 = generateNodeIndex(hashValues1);
+            size_t nodeIdx2 = generateNodeIndex(hashValues2);
+            it1 = nodeIdx2IdxGlo.find(nodeIdx1);
+            it2 = nodeIdx2IdxGlo.find(nodeIdx2);
+            size_t nodeIdxGlo1 = (it1->second)[1];
+            size_t nodeIdxGlo2 = (it2->second)[1];
 
             if (nodeIdxGlo1 != nodeIdxGlo2)
             {
-              size_t myIdx = generateEdgeIndex(nodeIdxGlo1, nodeIdxGlo2, mpiRank);
-              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = edgeIdx2IdxMin.find(myIdx);
-              size_t ownerIdx = (itIdx->second)[0];
-              int edgeIdxGlo;
+              size_t myIdx = hashPairOrdered(nodeIdxGlo1, nodeIdxGlo2);
+              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = edgeIdx2IdxGlo.find(myIdx);
+              int edgeIdxGlo = (itIdx->second)[1];
               size_t faceIdxGlo = nbFacesAccum + nf;
 
-              if (myIdx == ownerIdx)
+              if (mpiRank == (itIdx->second)[0])
               {
-                CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdx2IdxGlo.find(myIdx);
-                edgeIdxGlo = (itIdxGlo->second)[0];
                 double edgeLon;
                 double diffLon = abs(bounds_lon(nv1, nf) - bounds_lon(nv2, nf));
@@ -1427,9 +1591,4 @@
                 edge_nodes(1, edgeIdxGlo - edge_start) = nodeIdxGlo2;
               }
-              else
-              {
-                CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdxMin2IdxGlo.find(ownerIdx);
-                edgeIdxGlo = (itIdxGlo->second)[0];
-              }
               face_edges(nv1,nf) = edgeIdxGlo;
               if (edgeIdxGlo2Face.count(edgeIdxGlo) == 0)
@@ -1465,24 +1624,20 @@
             vector<size_t> hashValues2 = CMesh::createHashes(bounds_lon(nv2, nf), bounds_lat(nv2, nf));
 
-            size_t myNodeIdx1 = generateNodeIndex(hashValues1, mpiRank);
-            size_t myNodeIdx2 = generateNodeIndex(hashValues2, mpiRank);
+            size_t myNodeIdx1 = generateNodeIndex(hashValues1);
+            size_t myNodeIdx2 = generateNodeIndex(hashValues2);
             if (myNodeIdx1 != myNodeIdx2)
             {
-              it1 = nodeIdx2IdxMin.find(myNodeIdx1);
-              it2 = nodeIdx2IdxMin.find(myNodeIdx2);
-              itNodeIdxGlo1 = nodeIdxMin2IdxGlo.find((it1->second)[0]);
-              itNodeIdxGlo2 = nodeIdxMin2IdxGlo.find((it2->second)[0]);
-              size_t nodeIdxGlo1 = (itNodeIdxGlo1->second)[0];
-              size_t nodeIdxGlo2 = (itNodeIdxGlo2->second)[0];
-
-              size_t myIdx = generateEdgeIndex(nodeIdxGlo1, nodeIdxGlo2, mpiRank);
-              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = edgeIdx2IdxMin.find(myIdx);
-              size_t ownerIdx = (itIdx->second)[0];
+              it1 = nodeIdx2IdxGlo.find(myNodeIdx1);
+              it2 = nodeIdx2IdxGlo.find(myNodeIdx2);
+              size_t nodeIdxGlo1 = (it1->second)[1];
+              size_t nodeIdxGlo2 = (it2->second)[1];
+              size_t myIdx = hashPairOrdered(nodeIdxGlo1, nodeIdxGlo2);
+              CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdx = edgeIdx2IdxGlo.find(myIdx);
+              int edgeIdxGlo = (itIdx->second)[1];
+
               size_t faceIdxGlo = nbFacesAccum + nf;
 
-              if (myIdx == ownerIdx)
+              if (mpiRank == (itIdx->second)[0])
               {
-                CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdx2IdxGlo.find(myIdx);
-                int edgeIdxGlo = (itIdxGlo->second)[0];
                 it1 = edgeIdxGlo2FaceIdx.find(edgeIdxGlo);
                 int face1 = it1->second[0];
@@ -1500,14 +1655,12 @@
                   face_faces(nv1, nf) = (faceIdxGlo == face1 ? face2 : face1);
                 }
-              } // myIdx == ownerIdx
+              }
               else
               {
-                CClientClientDHTSizet::Index2VectorInfoTypeMap::iterator itIdxGlo = edgeIdxMin2IdxGlo.find(ownerIdx);
-                size_t edgeIdxGlo = (itIdxGlo->second)[0];
                 it1 = edgeIdxGlo2FaceIdx.find(edgeIdxGlo);
                 int face1 = it1->second[0];
                 int face2 = it1->second[1];
                 face_faces(nv1, nf) = (faceIdxGlo == face1 ? face2 : face1);
-              } // myIdx != ownerIdx
+              }
             } // myNodeIdx1 != myNodeIdx2
             else
@@ -1515,4 +1668,5 @@
           }
         }
+
       }
       facesAreWritten = true;
Index: /XIOS/dev/dev_olga/src/node/scalar.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/scalar.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/scalar.cpp	(revision 1158)
@@ -63,4 +63,35 @@
   {
 
+  }
+
+  /*!
+    Compare two scalar objects. 
+    They are equal if only if they have identical attributes as well as their values.
+    Moreover, they must have the same transformations.
+  \param [in] scalar Compared scalar
+  \return result of the comparison
+  */
+  bool CScalar::isEqual(CScalar* obj)
+  {
+    vector<StdString> excludedAttr;
+    excludedAttr.push_back("scalar_ref");
+    bool objEqual = SuperClass::isEqual(obj, excludedAttr);
+    if (!objEqual) return objEqual;
+
+    TransMapTypes thisTrans = this->getAllTransformations();
+    TransMapTypes objTrans  = obj->getAllTransformations();
+
+    TransMapTypes::const_iterator it, itb, ite;
+    std::vector<ETranformationType> thisTransType, objTransType;
+    for (it = thisTrans.begin(); it != thisTrans.end(); ++it)
+      thisTransType.push_back(it->first);
+    for (it = objTrans.begin(); it != objTrans.end(); ++it)
+      objTransType.push_back(it->first);
+
+    if (thisTransType.size() != objTransType.size()) return false;
+    for (int idx = 0; idx < thisTransType.size(); ++idx)
+      objEqual &= (thisTransType[idx] == objTransType[idx]);
+
+    return objEqual;
   }
 
Index: /XIOS/dev/dev_olga/src/node/scalar.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/scalar.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/scalar.hpp	(revision 1158)
@@ -76,10 +76,10 @@
            void duplicateTransformation(CScalar*);
            CTransformation<CScalar>* addTransformation(ETranformationType transType, const StdString& id="");
+           bool isEqual(CScalar* scalar);
 
          private:
            std::set<StdString> relFiles;
+           TransMapTypes transformationMap_;
 
-         private:
-            TransMapTypes transformationMap_;            
             void setTransformations(const TransMapTypes&);
 
Index: /XIOS/dev/dev_olga/src/node/variable.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/variable.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/variable.cpp	(revision 1158)
@@ -40,7 +40,22 @@
       if (!node.getContent(this->content))
       {
+        xml::THashAttributes attributes = node.getAttributes();
+        StdString variableName = attributes["name"];
+
+        node.goToParentElement();
+        StdString parentName = node.getElementName();
+        attributes = node.getAttributes();
+        error << "The variable id = " << id << " and name = " << variableName << " does not have any content. Please define it!" << std::endl
+              << "This variable is inside another element whose attributes are :" << std::endl;
+
+        for (xml::THashAttributes::iterator it = attributes.begin(); it != attributes.end(); ++it)
+        {
+           error << it->first << "=\"" << it->second.c_str() << "\" ";
+        }
+        error << std::endl; 
+
          ERROR("CVariable::parse(xml::CXMLNode & node)",
                << "[ variable id = " << id
-               << " ] variable is not defined !");
+               << " ] variable is not defined !. It does not have any content. See error log for more details.");
       }
       content = boost::trim_copy(content) ;
@@ -108,22 +123,4 @@
       }
      }
-
-    //  if (!context->hasServer)
-    //  {
-    //    CContextClient* client=context->client ;
-
-    //    CEventClient event(this->getType(),EVENT_ID_VARIABLE_VALUE) ;
-    //    if (client->isServerLeader())
-    //    {
-    //      CMessage msg ;
-    //      msg<<this->getId() ;
-    //      msg<<content ;
-    //      const std::list<int>& ranks = client->getRanksServerLeader();
-    //      for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
-    //        event.push(*itRank,1,msg);
-    //      client->sendEvent(event) ;
-    //    }
-    //    else client->sendEvent(event) ;
-    // }
    }
 
Index: /XIOS/dev/dev_olga/src/node/variable.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/node/variable.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/node/variable.hpp	(revision 1158)
@@ -9,4 +9,5 @@
 #include "attribute_enum.hpp"
 #include "attribute_enum_impl.hpp"
+#include "declare_attribute.hpp"
 
 namespace xios
Index: /XIOS/dev/dev_olga/src/object_template.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/object_template.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/object_template.hpp	(revision 1158)
@@ -67,4 +67,7 @@
          static bool dispatchEvent(CEventServer& event) ;
 
+         bool isEqual(const string& id, const vector<StdString>& excludedAttrs);
+         bool isEqual(T* obj, const vector<StdString>& excludedAttrs);
+
          /// Accesseur statique ///
          static std::vector<boost::shared_ptr<DerivedType> > &
Index: /XIOS/dev/dev_olga/src/object_template_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/object_template_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/object_template_impl.hpp	(revision 1158)
@@ -136,4 +136,23 @@
    }
 
+   /*!
+     Compare two object of same type
+   */
+   template <class T>
+   bool CObjectTemplate<T>::isEqual(const string& id, const vector<StdString>& excludedAttrs)
+   {
+      T* obj = CObjectTemplate<T>::get(id);
+      return this->isEqual(obj, excludedAttrs);
+   }
+
+   template <class T>
+   bool CObjectTemplate<T>::isEqual(T* obj, const vector<StdString>& excludedAttrs)
+   {
+
+      CAttributeMap& attrMapThis = *this;
+      CAttributeMap& attrMapObj  = *obj;
+      return (attrMapThis.isEqual(attrMapObj, excludedAttrs));
+   }
+
    //---------------------------------------------------------------
 
@@ -199,31 +218,4 @@
          }
        }
-
-     // if (client->isServerLeader())
-     // {
-     //   size_t minimumSize = 0;
-     //   CAttributeMap& attrMap = *this;
-     //   CAttributeMap::const_iterator it = attrMap.begin(), itE = attrMap.end();
-     //   for (; it != itE; ++it)
-     //   {
-     //     if (!it->second->isEmpty())
-     //     {
-     //       size_t size = it->second->getName().size() + sizeof(size_t) + it->second->size();
-     //       if (size > minimumSize)
-     //         minimumSize = size;
-     //     }
-     //   }
-
-     //   if (minimumSize)
-     //   {
-     //     // Account for extra header info
-     //     minimumSize += CEventClient::headerSize + getIdServer().size() + sizeof(size_t);
-
-     //     const std::list<int>& ranks = client->getRanksServerLeader();
-     //     for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
-     //       minimumSizes.insert(std::make_pair(*itRank, minimumSize));
-     //   }
-     // }
-
        return minimumSizes;
      }
@@ -257,6 +249,5 @@
       CAttributeMap & attrMap = *this;
       CAttribute* attr=attrMap[id];
-      if (attr->doSend()) 
-        sendAttributToServer(*attr);
+      sendAttributToServer(*attr);
    }
 
@@ -369,5 +360,4 @@
   }
 
-
   template <class T>
   void CObjectTemplate<T>::recvAttributFromClient(CEventServer& event)
Index: /XIOS/dev/dev_olga/src/parse_expr/filter_expr_node.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/filter_expr_node.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/filter_expr_node.cpp	(revision 1158)
@@ -2,4 +2,5 @@
 #include "unary_arithmetic_filter.hpp"
 #include "binary_arithmetic_filter.hpp"
+#include "ternary_arithmetic_filter.hpp"
 #include "field.hpp"
 
@@ -40,15 +41,24 @@
   boost::shared_ptr<COutputPin> CFilterTemporalFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
   {
-    if (!CField::has(fieldId))
+    boost::shared_ptr<COutputPin> outputPin;
+
+    if (fieldId == "this")
+      outputPin = thisField.getSelfTemporalDataFilter(gc, thisField.freq_op.isEmpty() ? TimeStep : thisField.freq_op);
+    else if (CField::has(fieldId))
+    {
+      CField* field = CField::get(fieldId);
+      if (field == &thisField)
+        ERROR("boost::shared_ptr<COutputPin> CFilterTemporalFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
+              << "The field " << fieldId << " has an invalid reference to itself. "
+              << "Use the keyword \"this\" if you want to reference the input data sent to this field.");
+
+      field->buildFilterGraph(gc, false);
+      outputPin = field->getTemporalDataFilter(gc, thisField.freq_op.isEmpty() ? TimeStep : thisField.freq_op);
+    }
+    else
       ERROR("boost::shared_ptr<COutputPin> CFilterTemporalFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
             << "The field " << fieldId << " does not exist.");
 
-    CField* field = CField::get(fieldId);
-    if (field == &thisField)
-      ERROR("boost::shared_ptr<COutputPin> CFilterFieldExprNode::reduce(CGarbageCollector& gc, CField& thisField) const",
-            << "The field " << fieldId << " has an invalid reference to itself.");
-
-    field->buildFilterGraph(gc, false);
-    return field->getTemporalDataFilter(gc, thisField.freq_op.isEmpty() ? TimeStep : thisField.freq_op);
+    return outputPin;
   }
 
@@ -120,3 +130,147 @@
     return filter;
   }
+
+
+
+
+  CFilterScalarScalarFieldOpExprNode::CFilterScalarScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("  CFilterScalarScalarFieldOpExprNode::CFilterScalarScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  boost::shared_ptr<COutputPin> CFilterScalarScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
+  {
+    boost::shared_ptr<CScalarScalarFieldArithmeticFilter> filter(new CScalarScalarFieldArithmeticFilter(gc, opId, child1->reduce(),child2->reduce()));
+    child3->reduce(gc, thisField)->connectOutput(filter, 0);
+    return filter;
+  }
+
+
+  CFilterScalarFieldScalarOpExprNode::CFilterScalarFieldScalarOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("  CFilterScalarFieldScalarOpExprNode::CFilterScalarFieldScalarOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  boost::shared_ptr<COutputPin> CFilterScalarFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
+  {
+    boost::shared_ptr<CScalarFieldScalarArithmeticFilter> filter(new CScalarFieldScalarArithmeticFilter(gc, opId, child1->reduce(),child3->reduce()));
+    child2->reduce(gc, thisField)->connectOutput(filter, 0);
+    return filter;
+  }
+
+
+  CFilterScalarFieldFieldOpExprNode::CFilterScalarFieldFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("  CFilterScalarFieldFieldOpExprNode::CFilterScalarFieldFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  boost::shared_ptr<COutputPin> CFilterScalarFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
+  {
+    boost::shared_ptr<CScalarFieldFieldArithmeticFilter> filter(new CScalarFieldFieldArithmeticFilter(gc, opId, child1->reduce()));
+    child2->reduce(gc, thisField)->connectOutput(filter, 0);
+    child3->reduce(gc, thisField)->connectOutput(filter, 1);
+    return filter;
+  }
+
+
+
+  CFilterFieldScalarScalarOpExprNode::CFilterFieldScalarScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("  CFilterFieldScalarScalarOpExprNode::CFilterFieldScalarScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  boost::shared_ptr<COutputPin> CFilterFieldScalarScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
+  {
+    boost::shared_ptr<CFieldScalarScalarArithmeticFilter> filter(new CFieldScalarScalarArithmeticFilter(gc, opId, child2->reduce(),child3->reduce()));
+    child1->reduce(gc, thisField)->connectOutput(filter, 0);
+    return filter;
+  }
+
+
+
+  CFilterFieldScalarFieldOpExprNode::CFilterFieldScalarFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("  CFilterFieldScalarFieldOpExprNode::CFilterFieldScalarFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  boost::shared_ptr<COutputPin> CFilterFieldScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
+  {
+    boost::shared_ptr<CFieldScalarFieldArithmeticFilter> filter(new CFieldScalarFieldArithmeticFilter(gc, opId, child2->reduce()));
+    child1->reduce(gc, thisField)->connectOutput(filter, 0);
+    child3->reduce(gc, thisField)->connectOutput(filter, 1);
+    return filter;
+  }
+
+
+
+  CFilterFieldFieldScalarOpExprNode::CFilterFieldFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("  CFilterFieldFieldScalarOpExprNode::CFilterFieldFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  boost::shared_ptr<COutputPin> CFilterFieldFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
+  {
+    boost::shared_ptr<CFieldFieldScalarArithmeticFilter> filter(new CFieldFieldScalarArithmeticFilter(gc, opId, child3->reduce()));
+    child1->reduce(gc, thisField)->connectOutput(filter, 0);
+    child2->reduce(gc, thisField)->connectOutput(filter, 1);
+    return filter;
+  }
+
+
+  CFilterFieldFieldFieldOpExprNode::CFilterFieldFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("  CFilterFieldFieldFieldOpExprNode::CFilterFieldFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  boost::shared_ptr<COutputPin> CFilterFieldFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const
+  {
+    boost::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);
+    return filter;
+  }
+  
 }
Index: /XIOS/dev/dev_olga/src/parse_expr/filter_expr_node.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/filter_expr_node.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/filter_expr_node.hpp	(revision 1158)
@@ -169,4 +169,211 @@
       boost::scoped_ptr<IFilterExprNode> child1, child2; //!< The field child nodes to which the operator is applied
   };
+
+
+
+ /*!
+   * Expression node corresponding to a ternary operation on a scalar-scalar-field.
+   */
+  class CFilterScalarScalarFieldOpExprNode : public IFilterExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided fields and scalars child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param child1 the scalar child node to which the operator is applied
+       * \param opId the identifier of the operator
+       * \param child2 the scalar child node to which the operator is applied
+       * \param child3 the field child node to which the operator is applied
+      */
+      CFilterScalarScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3);
+
+      virtual boost::shared_ptr<COutputPin> reduce(CGarbageCollector& gc, CField& thisField) const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IScalarExprNode> child1; //!< The scalar child node to which the operator is applied
+      boost::scoped_ptr<IScalarExprNode> child2; //!< The scalar child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child3; //!< The field child node to which the operator is applied
+  };
+
+
+  /*!
+   * Expression node corresponding to a ternary operation on a scalar-field-scalar.
+   */
+  class CFilterScalarFieldScalarOpExprNode : public IFilterExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided fields and scalars child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param child1 the scalar child node to which the operator is applied
+       * \param opId the identifier of the operator
+       * \param child2 the field child node to which the operator is applied
+       * \param child3 the scalar child node to which the operator is applied
+      */
+      CFilterScalarFieldScalarOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3);
+
+      virtual boost::shared_ptr<COutputPin> reduce(CGarbageCollector& gc, CField& thisField) const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IScalarExprNode> child1; //!< The scalar child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child2; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IScalarExprNode> child3; //!< The scalar child node to which the operator is applied
+  };
+
+
+  /*!
+   * Expression node corresponding to a ternary operation on a scalar-field-field.
+   */
+  class CFilterScalarFieldFieldOpExprNode : public IFilterExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided fields and scalars child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param child1 the scalar child node to which the operator is applied
+       * \param opId the identifier of the operator
+       * \param child2 the field child node to which the operator is applied
+       * \param child3 the field child node to which the operator is applied
+      */
+      CFilterScalarFieldFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3);
+
+      virtual boost::shared_ptr<COutputPin> reduce(CGarbageCollector& gc, CField& thisField) const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IScalarExprNode> child1; //!< The scalar child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child2; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child3; //!< The field child node to which the operator is applied
+  };
+
+
+
+/*!
+   * Expression node corresponding to a ternary operation on a field-scalar-scalar.
+   */
+  class CFilterFieldScalarScalarOpExprNode : public IFilterExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided fields and scalars child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param child1 the field child node to which the operator is applied
+       * \param opId the identifier of the operator
+       * \param child2 the scalar child node to which the operator is applied
+       * \param child3 the scalar child node to which the operator is applied
+      */
+      CFilterFieldScalarScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3);
+
+      virtual boost::shared_ptr<COutputPin> reduce(CGarbageCollector& gc, CField& thisField) const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IFilterExprNode> child1; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IScalarExprNode> child2; //!< The scalar child node to which the operator is applied
+      boost::scoped_ptr<IScalarExprNode> child3; //!< The scalar child node to which the operator is applied
+  };
+
+
+/*!
+   * Expression node corresponding to a ternary operation on a field-scalar-field.
+   */
+  class CFilterFieldScalarFieldOpExprNode : public IFilterExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided fields and scalars child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param child1 the field child node to which the operator is applied
+       * \param opId the identifier of the operator
+       * \param child2 the scalar child node to which the operator is applied
+       * \param child3 the field child node to which the operator is applied
+      */
+      CFilterFieldScalarFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3);
+
+      virtual boost::shared_ptr<COutputPin> reduce(CGarbageCollector& gc, CField& thisField) const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IFilterExprNode> child1; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IScalarExprNode> child2; //!< The scalar child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child3; //!< The field child node to which the operator is applied
+  };
+
+  /*!
+   * Expression node corresponding to a ternary operation on a field-field-scalar.
+   */
+  class CFilterFieldFieldScalarOpExprNode : public IFilterExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided fields and scalars child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param child1 the field child node to which the operator is applied
+       * \param opId the identifier of the operator
+       * \param child2 the field child node to which the operator is applied
+       * \param child3 the scalar child node to which the operator is applied
+      */
+      CFilterFieldFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3);
+
+      virtual boost::shared_ptr<COutputPin> reduce(CGarbageCollector& gc, CField& thisField) const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IFilterExprNode> child1; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child2; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IScalarExprNode> child3; //!< The scalar child node to which the operator is applied
+  };
+
+
+  /*!
+   * Expression node corresponding to a ternary operation on a field-field-field.
+   */
+  class CFilterFieldFieldFieldOpExprNode : public IFilterExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided fields and scalars child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param child1 the field child node to which the operator is applied
+       * \param opId the identifier of the operator
+       * \param child2 the field child node to which the operator is applied
+       * \param child3 the field child node to which the operator is applied
+      */
+      CFilterFieldFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3);
+
+      virtual boost::shared_ptr<COutputPin> reduce(CGarbageCollector& gc, CField& thisField) const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IFilterExprNode> child1; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child2; //!< The field child node to which the operator is applied
+      boost::scoped_ptr<IFilterExprNode> child3; //!< The field child node to which the operator is applied
+  };
+
+
+
 }
 
Index: /XIOS/dev/dev_olga/src/parse_expr/generate_lex_yacc.sh
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/generate_lex_yacc.sh	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/generate_lex_yacc.sh	(revision 1158)
@@ -1,2 +1,2 @@
-bison -d yacc_parser.yacc -o yacc_parser.cpp
+bison --verbose -d yacc_parser.yacc -o yacc_parser.cpp
 flex -o lex_parser.cpp -f lex_parser.lex 
Index: /XIOS/dev/dev_olga/src/parse_expr/lex_parser.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/lex_parser.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/lex_parser.cpp	(revision 1158)
@@ -10,5 +10,5 @@
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 39
+#define YY_FLEX_SUBMINOR_VERSION 37
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
@@ -143,13 +143,5 @@
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
 #define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
 #endif
 
@@ -177,5 +169,4 @@
 
     #define YY_LESS_LINENO(n)
-    #define YY_LINENO_REWIND_TO(ptr)
     
 /* Return all but the first "n" matched characters back to the input stream. */
@@ -356,5 +347,4 @@
 extern char *yytext;
 #define yytext_ptr yytext
-
 static yyconst flex_int16_t yy_nxt[][128] =
     {
@@ -382,13 +372,13 @@
         4,    4,    5,    4,    4,    4,    6,    4,    4,    4,
         7,    8,    9,   10,    4,   11,    4,   12,   13,   13,
-       13,   13,   13,   13,   13,   13,   13,   13,    4,    4,
-       14,   15,   16,    4,   17,   18,   18,   18,   18,   18,
-
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,    4,    4,    4,   19,    4,    4,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,   18,   18,    4,    4,    4,    4,    4
+       13,   13,   13,   13,   13,   13,   13,   13,   14,    4,
+       15,   16,   17,   18,   19,   20,   20,   20,   20,   20,
+
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,    4,    4,    4,   21,    4,    4,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,   20,   20,    4,    4,    4,    4,    4
     },
 
@@ -400,12 +390,12 @@
 
         7,    8,    9,   10,    4,   11,    4,   12,   13,   13,
-       13,   13,   13,   13,   13,   13,   13,   13,    4,    4,
-       14,   15,   16,    4,   17,   18,   18,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,    4,    4,    4,   19,    4,    4,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,   18,   18,   18,   18,   18,   18,   18,   18,   18,
-       18,   18,   18,    4,    4,    4,    4,    4
+       13,   13,   13,   13,   13,   13,   13,   13,   14,    4,
+       15,   16,   17,   18,   19,   20,   20,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,    4,    4,    4,   21,    4,    4,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,   20,   20,   20,   20,   20,   20,   20,   20,   20,
+       20,   20,   20,    4,    4,    4,    4,    4
     },
 
@@ -446,8 +436,8 @@
 
     {
-        3,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   21,
+        3,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   23,
        -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,
        -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,
-       -5,   -5,   21,   -5,   -5,   -5,   -5,   -5,   -5,   -5,
+       -5,   -5,   23,   -5,   -5,   -5,   -5,   -5,   -5,   -5,
        -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,   -5,
 
@@ -470,12 +460,12 @@
        -6,   -6,   -6,   -6,   -6,   -6,   -6,   -6,   -6,   -6,
        -6,   -6,   -6,   -6,   -6,   -6,   -6,   -6,   -6,   -6,
-       -6,   -6,   -6,   -6,   -6,   22,   22,   22,   22,   22,
-       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       22,   -6,   -6,   -6,   -6,   -6,   -6,   22,   22,   22,
-       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-       22,   22,   22,   22,   22,   22,   22,   22,   22,   22,
-
-       22,   22,   22,   -6,   -6,   -6,   -6,   -6
+       -6,   -6,   -6,   -6,   -6,   24,   24,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+       24,   -6,   -6,   -6,   -6,   -6,   -6,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+
+       24,   24,   24,   -6,   -6,   -6,   -6,   -6
     },
 
@@ -574,5 +564,5 @@
       -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
       -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
-      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+      -12,   25,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
       -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
       -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
@@ -589,11 +579,11 @@
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
-      -13,  -13,  -13,  -13,  -13,  -13,   23,  -13,   24,   24,
-       24,   24,   24,   24,   24,   24,   24,   24,  -13,  -13,
-      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,   25,
+      -13,  -13,  -13,  -13,  -13,  -13,   26,  -13,   27,   27,
+       27,   27,   27,   27,   27,   27,   27,   27,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,   28,
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
-      -13,   25,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
+      -13,   28,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
 
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
@@ -608,5 +598,5 @@
       -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
       -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
-      -14,   26,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
       -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
 
@@ -626,5 +616,5 @@
 
       -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,
-      -15,   27,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,
+      -15,   29,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,
       -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,
       -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,  -15,
@@ -643,5 +633,5 @@
       -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
       -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
-      -16,   28,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,   30,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
       -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
       -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
@@ -660,12 +650,12 @@
       -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
       -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
-      -17,  -17,  -17,  -17,  -17,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-
-       29,  -17,  -17,  -17,  -17,  -17,  -17,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-       29,   29,   29,  -17,  -17,  -17,  -17,  -17
+      -17,   31,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17
     },
 
@@ -675,14 +665,14 @@
       -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
       -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
-      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,  -18,  -18,
-
-      -18,  -18,  -18,  -18,  -18,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,  -18,  -18,  -18,  -18,   30,  -18,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,  -18,  -18,  -18,  -18,  -18
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18
     },
 
@@ -695,11 +685,11 @@
       -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
       -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19
+      -19,  -19,  -19,  -19,  -19,   32,   32,   32,   32,   32,
+       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
+       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
+       32,  -19,  -19,  -19,  -19,  -19,  -19,   32,   32,   32,
+       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
+       32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
+       32,   32,   32,  -19,  -19,  -19,  -19,  -19
 
     },
@@ -710,21 +700,21 @@
       -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
       -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20
-    },
-
-    {
-        3,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,   21,
+      -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,  -20,  -20,
+      -20,  -20,  -20,  -20,  -20,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,  -20,  -20,  -20,  -20,   33,  -20,   33,   33,   33,
+
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,  -20,  -20,  -20,  -20,  -20
+    },
+
+    {
+        3,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
       -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
       -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
-      -21,  -21,   21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
+      -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
       -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
       -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
@@ -745,23 +735,21 @@
       -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
 
-      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,  -22,  -22,
-      -22,  -22,  -22,  -22,  -22,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,  -22,  -22,  -22,  -22,   31,  -22,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,  -22,  -22,  -22,  -22,  -22
-    },
-
-    {
-        3,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22
+    },
+
+    {
+        3,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,   23,
 
       -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
       -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
-      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
-      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,  -23,  -23,
+      -23,  -23,   23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
       -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
       -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
@@ -769,4 +757,6 @@
       -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
       -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
 
       -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
@@ -779,14 +769,14 @@
       -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
       -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
-      -24,  -24,  -24,  -24,  -24,  -24,   23,  -24,   24,   24,
-       24,   24,   24,   24,   24,   24,   24,   24,  -24,  -24,
-      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,   25,
-      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
-
-      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
-      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
-      -24,   25,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
-      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
-      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24
+      -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,  -24,  -24,
+      -24,  -24,  -24,  -24,  -24,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,  -24,  -24,  -24,  -24,   34,  -24,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,  -24,  -24,  -24,  -24,  -24
     },
 
@@ -796,7 +786,7 @@
       -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
       -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
-      -25,  -25,  -25,   33,  -25,   33,  -25,  -25,   34,   34,
-
-       34,   34,   34,   34,   34,   34,   34,   34,  -25,  -25,
+      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
+
+      -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
       -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
       -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
@@ -814,4 +804,6 @@
       -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
       -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
+      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,  -26,  -26,
       -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
       -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
@@ -820,6 +812,4 @@
       -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
       -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
-      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
-      -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
 
       -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26
@@ -831,12 +821,12 @@
       -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
       -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+      -27,  -27,  -27,  -27,  -27,  -27,   26,  -27,   27,   27,
+       27,   27,   27,   27,   27,   27,   27,   27,  -27,  -27,
+      -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,   28,
       -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
       -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+
       -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
-      -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
-      -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
-
-      -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
-      -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+      -27,   28,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
       -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
       -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27
@@ -848,6 +838,6 @@
       -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
       -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
-      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
-      -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
+      -28,  -28,  -28,   36,  -28,   36,  -28,  -28,   37,   37,
+       37,   37,   37,   37,   37,   37,   37,   37,  -28,  -28,
 
       -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
@@ -866,13 +856,13 @@
 
       -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
-      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,  -29,  -29,
-      -29,  -29,  -29,  -29,  -29,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,  -29,  -29,  -29,  -29,   35,  -29,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,  -29,  -29,  -29,  -29,  -29
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29
 
     },
@@ -883,14 +873,14 @@
       -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
       -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
-      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,  -30,  -30,
-      -30,  -30,  -30,  -30,  -30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,  -30,  -30,  -30,  -30,   30,  -30,   30,   30,   30,
-
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
-       30,   30,   30,  -30,  -30,  -30,  -30,  -30
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30
     },
 
@@ -900,14 +890,14 @@
       -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
       -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
-      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,  -31,  -31,
-      -31,  -31,  -31,  -31,  -31,   31,   31,   31,   31,   31,
-
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,  -31,  -31,  -31,  -31,   31,  -31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,  -31,  -31,  -31,  -31,  -31
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31,
+      -31,  -31,  -31,  -31,  -31,  -31,  -31,  -31
     },
 
@@ -918,13 +908,13 @@
       -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
 
-      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,   32,   32,
-       32,   32,   32,   32,   32,   32,   32,   32,  -32,  -32,
-      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,   25,
-      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
-      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
-      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
-      -32,   25,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
-      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
-      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32
+      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,  -32,  -32,
+      -32,  -32,  -32,  -32,  -32,   38,   38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,  -32,  -32,  -32,  -32,   38,  -32,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,   38,   38,  -32,  -32,  -32,  -32,  -32
     },
 
@@ -935,14 +925,14 @@
       -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
       -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,   34,   34,
-       34,   34,   34,   34,   34,   34,   34,   34,  -33,  -33,
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
-
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,
-      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33
+      -33,  -33,  -33,  -33,  -33,  -33,  -33,  -33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,  -33,  -33,
+      -33,  -33,  -33,  -33,  -33,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,  -33,  -33,  -33,  -33,   33,  -33,   33,   33,   33,
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+
+       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
+       33,   33,   33,  -33,  -33,  -33,  -33,  -33
     },
 
@@ -954,12 +944,12 @@
       -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,  -34,  -34,
-      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
-      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
-
-      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
-      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
-      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
-      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34,
-      -34,  -34,  -34,  -34,  -34,  -34,  -34,  -34
+      -34,  -34,  -34,  -34,  -34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,  -34,  -34,  -34,  -34,   34,  -34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,  -34,  -34,  -34,  -34,  -34
     },
 
@@ -972,11 +962,63 @@
 
        35,   35,   35,   35,   35,   35,   35,   35,  -35,  -35,
-      -35,  -35,  -35,  -35,  -35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,  -35,  -35,  -35,  -35,   35,  -35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
-       35,   35,   35,  -35,  -35,  -35,  -35,  -35
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,   28,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,   28,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35
+    },
+
+    {
+        3,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,   37,   37,
+       37,   37,   37,   37,   37,   37,   37,   37,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36
+    },
+
+    {
+        3,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,   37,   37,
+       37,   37,   37,   37,   37,   37,   37,   37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37,
+      -37,  -37,  -37,  -37,  -37,  -37,  -37,  -37
+    },
+
+    {
+        3,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,  -38,  -38,
+
+      -38,  -38,  -38,  -38,  -38,   38,   38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,  -38,  -38,  -38,  -38,   38,  -38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
+       38,   38,   38,  -38,  -38,  -38,  -38,  -38
     },
 
@@ -998,6 +1040,6 @@
 	(yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 19
-#define YY_END_OF_BUFFER 20
+#define YY_NUM_RULES 22
+#define YY_END_OF_BUFFER 23
 /* This struct is not used in this scanner,
    but its presence is necessary. */
@@ -1007,10 +1049,10 @@
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[36] =
+static yyconst flex_int16_t yy_accept[39] =
     {   0,
-        0,    0,   20,   19,    1,   19,   16,   17,    8,    6,
-        7,    9,    2,   12,   19,   13,   19,    5,   10,   18,
-        1,    4,    0,    2,    0,   14,   11,   15,    3,    5,
-        4,    2,    0,    2,    3
+        0,    0,   23,   22,    1,   22,   19,   20,    8,    6,
+        7,    9,    2,   18,   12,   22,   13,   17,   22,    5,
+       10,   21,    1,    4,   16,    0,    2,    0,   14,   11,
+       15,    3,    5,    4,    2,    0,    2,    3
     } ;
 
@@ -1018,10 +1060,10 @@
 static char *yy_last_accepting_cpos;
 
-static yyconst yy_state_type yy_NUL_trans[36] =
+static yyconst yy_state_type yy_NUL_trans[39] =
     {   0,
-       20,   20,    0,    0,    0,    0,    0,    0,    0,    0,
+       22,   22,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0
+        0,    0,    0,    0,    0,    0,    0,    0
     } ;
 
@@ -1053,5 +1095,5 @@
 #include "yacc_parser.hpp"
 
-#line 1056 "lex_parser.cpp"
+#line 1098 "lex_parser.cpp"
 
 #define INITIAL 0
@@ -1134,10 +1176,5 @@
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
 #define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
 #endif
 
@@ -1224,4 +1261,9 @@
 	register int yy_act;
     
+#line 29 "lex_parser.lex"
+
+
+#line 1267 "lex_parser.cpp"
+
 	if ( !(yy_init) )
 		{
@@ -1249,10 +1291,4 @@
 		yy_load_buffer_state( );
 		}
-
-	{
-#line 29 "lex_parser.lex"
-
-
-#line 1257 "lex_parser.cpp"
 
 	while ( 1 )		/* loops until end-of-file is reached */
@@ -1388,23 +1424,38 @@
 case 16:
 YY_RULE_SETUP
-#line 68 "lex_parser.lex"
-return LEFT_PARENTHESIS;
+#line 67 "lex_parser.lex"
+return NE;
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 69 "lex_parser.lex"
-return RIGHT_PARENTHESIS;
+#line 68 "lex_parser.lex"
+return QUESTION_MARK;
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 71 "lex_parser.lex"
-return END;
+#line 69 "lex_parser.lex"
+return COLON;
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 72 "lex_parser.lex"
+#line 70 "lex_parser.lex"
+return LEFT_PARENTHESIS;
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 71 "lex_parser.lex"
+return RIGHT_PARENTHESIS;
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 73 "lex_parser.lex"
+return END;
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 74 "lex_parser.lex"
 ECHO;
 	YY_BREAK
-#line 1409 "lex_parser.cpp"
+#line 1460 "lex_parser.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
@@ -1537,5 +1588,4 @@
 	} /* end of action switch */
 		} /* end of scanning one token */
-	} /* end of user's declarations */
 } /* end of yylex */
 
@@ -2166,5 +2216,5 @@
 	char *buf;
 	yy_size_t n;
-	yy_size_t i;
+	int i;
     
 	/* Get memory for full buffer, including space for trailing EOB's. */
@@ -2396,3 +2446,3 @@
 #define YYTABLES_NAME "yytables"
 
-#line 71 "lex_parser.lex"
+#line 74 "lex_parser.lex"
Index: /XIOS/dev/dev_olga/src/parse_expr/lex_parser.lex
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/lex_parser.lex	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/lex_parser.lex	(revision 1158)
@@ -65,5 +65,7 @@
 "<=" return LE;
 ">=" return GE;
-
+"/=" return NE;
+"?" return QUESTION_MARK;
+":" return COLON;
 "("  return LEFT_PARENTHESIS;
 ")"  return RIGHT_PARENTHESIS;
Index: /XIOS/dev/dev_olga/src/parse_expr/operator_expr.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/operator_expr.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/operator_expr.hpp	(revision 1158)
@@ -17,9 +17,17 @@
     typedef double (*functionScalar)(double);
     typedef double (*functionScalarScalar)(double, double);
+    typedef double (*functionScalarScalarScalar)(double, double,double);
     typedef CArray<double,1> (*functionField)(const CArray<double,1>&);
     typedef CArray<double,1> (*functionFieldField)(const CArray<double,1>&, const CArray<double,1>&);
     typedef CArray<double,1> (*functionFieldScalar)(const CArray<double,1>&, double);
     typedef CArray<double,1> (*functionScalarField)(double, const CArray<double,1>&);
-
+    typedef CArray<double,1> (*functionScalarScalarField)(double, double, const CArray<double,1>&);
+    typedef CArray<double,1> (*functionScalarFieldScalar)(double, const CArray<double,1>&, double);
+    typedef CArray<double,1> (*functionScalarFieldField)(double, const CArray<double,1>&, const CArray<double,1>&);
+    typedef CArray<double,1> (*functionFieldScalarScalar)(const CArray<double,1>&, double, double);
+    typedef CArray<double,1> (*functionFieldScalarField)(const CArray<double,1>&, double, const CArray<double,1>&);
+    typedef CArray<double,1> (*functionFieldFieldScalar)(const CArray<double,1>&,  const CArray<double,1>&, double);
+    typedef CArray<double,1> (*functionFieldFieldField)(const CArray<double,1>&,  const CArray<double,1>&, const CArray<double,1>&);
+    
     COperatorExpr(void)
     {
@@ -43,5 +51,7 @@
       opScalarScalar[string("le")] = le_ss;
       opScalarScalar[string("ge")] = ge_ss;
-
+      opScalarScalar[string("ne")] = ne_ss;
+      opScalarScalarScalar[string("cond")] = cond_sss;
+      
       opField[string("neg")] = neg_f;
       opField[string("cos")] = cos_f;
@@ -63,4 +73,5 @@
       opFieldField[string("le")] = le_ff;
       opFieldField[string("ge")] = ge_ff;
+      opFieldField[string("ne")] = ne_ff;
 
       opFieldScalar[string("add")] = add_fs;
@@ -74,4 +85,5 @@
       opFieldScalar[string("le")] = le_fs;
       opFieldScalar[string("ge")] = ge_fs;
+      opFieldScalar[string("ne")] = ne_fs;
 
       opScalarField[string("add")] = add_sf;
@@ -84,4 +96,15 @@
       opScalarField[string("le")] = le_sf;
       opScalarField[string("ge")] = ge_sf;
+      opScalarField[string("ne")] = ne_sf;
+
+      opScalarScalarField[string("cond")] = cond_ssf;
+      opScalarFieldScalar[string("cond")] = cond_sfs;
+      opScalarFieldField[string("cond")] = cond_sff;
+      opFieldScalarScalar[string("cond")] = cond_fss;
+      opFieldScalarField[string("cond")] = cond_fsf;
+      opFieldFieldScalar[string("cond")] = cond_ffs;
+      opFieldFieldField[string("cond")] = cond_fff;
+
+
     }
 
@@ -102,4 +125,12 @@
     }
 
+    functionScalarScalarScalar getOpScalarScalarScalar(const string& id)
+    {
+      map<string,double (*)(double,double,double)>::iterator it;
+      it = opScalarScalarScalar.find(id);
+      if (it == opScalarScalarScalar.end()) ERROR("functionScalarScalarScalar getOpScalarScalarScalar(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+
     functionField getOpField(const string& id)
     {
@@ -134,10 +165,77 @@
     }
 
+    functionScalarScalarField getOpScalarScalarField(const string& id)
+    {
+      map<string,functionScalarScalarField>::iterator it;
+      it = opScalarScalarField.find(id);
+      if (it == opScalarScalarField.end()) ERROR("functionScalarScalarField getOpScalarScalarField(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+
+    functionScalarFieldScalar getOpScalarFieldScalar(const string& id)
+    {
+      map<string,functionScalarFieldScalar>::iterator it;
+      it = opScalarFieldScalar.find(id);
+      if (it == opScalarFieldScalar.end()) ERROR("functionScalarFieldScalar getOpScalarScalarField(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+
+    functionScalarFieldField getOpScalarFieldField(const string& id)
+    {
+      map<string,functionScalarFieldField>::iterator it;
+      it = opScalarFieldField.find(id);
+      if (it == opScalarFieldField.end()) ERROR("functionScalarFieldField getOpScalarFieldField(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+
+    functionFieldScalarScalar getOpFieldScalarScalar(const string& id)
+    {
+      map<string,functionFieldScalarScalar>::iterator it;
+      it = opFieldScalarScalar.find(id);
+      if (it == opFieldScalarScalar.end()) ERROR("functionFieldScalarScalar getOpFieldScalarScalar(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+
+    functionFieldScalarField getOpFieldScalarField(const string& id)
+    {
+      map<string,functionFieldScalarField>::iterator it;
+      it = opFieldScalarField.find(id);
+      if (it == opFieldScalarField.end()) ERROR("functionFieldScalarField getOpFieldScalarField(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+
+    functionFieldFieldScalar getOpFieldFieldScalar(const string& id)
+    {
+      map<string,functionFieldFieldScalar>::iterator it;
+      it = opFieldFieldScalar.find(id);
+      if (it == opFieldFieldScalar.end()) ERROR("functionFieldFieldScalar getOpFieldFieldScalar(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+
+    functionFieldFieldField getOpFieldFieldField(const string& id)
+    {
+      map<string,functionFieldFieldField>::iterator it;
+      it = opFieldFieldField.find(id);
+      if (it == opFieldFieldField.end()) ERROR("functionFieldFieldField getOpFieldFieldField(const string& id)", << "unknown operator : " << id)
+      return it->second;
+    }
+    
+    
     map<string,functionScalar> opScalar;
     map<string,functionScalarScalar> opScalarScalar;
+    map<string,functionScalarScalarScalar> opScalarScalarScalar;
     map<string,functionField> opField;
     map<string,functionFieldField> opFieldField;
     map<string,functionFieldScalar> opFieldScalar;
     map<string,functionScalarField> opScalarField;
+    map<string,functionScalarScalarField> opScalarScalarField;
+    map<string,functionScalarFieldScalar> opScalarFieldScalar;
+    map<string,functionScalarFieldField> opScalarFieldField;
+    map<string,functionFieldScalarScalar> opFieldScalarScalar;
+    map<string,functionFieldScalarField> opFieldScalarField;
+    map<string,functionFieldFieldScalar> opFieldFieldScalar;
+    map<string,functionFieldFieldField> opFieldFieldField;
+
+
 
     static inline double neg_s(double x)   { return -x; }
@@ -160,4 +258,5 @@
     static inline double le_ss(double x, double y)    { return x <= y; }
     static inline double ge_ss(double x, double y)    { return x >= y; }
+    static inline double ne_ss(double x, double y)    { return x != y; }
 
     static inline CArray<double,1> neg_f(const CArray<double,1>& x)   { return Array<double,1>(-x); }
@@ -180,4 +279,5 @@
     static inline CArray<double,1> le_ff(const CArray<double,1>& x, const CArray<double,1>& y)    { return Array<double,1>(x <= y); }
     static inline CArray<double,1> ge_ff(const CArray<double,1>& x, const CArray<double,1>& y)    { return Array<double,1>(x >= y); }
+    static inline CArray<double,1> ne_ff(const CArray<double,1>& x, const CArray<double,1>& y)    { return Array<double,1>(x != y); }
 
     static inline CArray<double,1> add_fs(const CArray<double,1>& x, double y)   { return Array<double,1>(x + y); }
@@ -191,4 +291,5 @@
     static inline CArray<double,1> le_fs(const CArray<double,1>& x, double y)    { return Array<double,1>(x <= y); }
     static inline CArray<double,1> ge_fs(const CArray<double,1>& x, double y)    { return Array<double,1>(x >= y); }
+    static inline CArray<double,1> ne_fs(const CArray<double,1>& x, double y)    { return Array<double,1>(x != y); }
 
     static inline CArray<double,1> add_sf(double x, const CArray<double,1>& y)   { return Array<double,1>(x + y); }
@@ -201,4 +302,70 @@
     static inline CArray<double,1> le_sf(double x, const CArray<double,1>& y)    { return Array<double,1>(x <= y); }
     static inline CArray<double,1> ge_sf(double x, const CArray<double,1>& y)    { return Array<double,1>(x >= y); }
+    static inline CArray<double,1> ne_sf(double x, const CArray<double,1>& y)    { return Array<double,1>(x != y); }
+
+
+    static inline double cond_sss(double x, double y, double z)   { return (x==0) ? z : y ; }
+
+    static inline CArray<double,1> cond_ssf(double x, double y, const CArray<double,1>& z)
+    {
+      CArray<double,1> ret(z.numElements()) ;
+      if (x==0) ret=z ;
+      else ret=y ;
+      return ret ;
+    }
+
+    static inline CArray<double,1> cond_sfs(double x, const CArray<double,1>& y, double z)
+    {
+      CArray<double,1> ret(y.numElements()) ;
+     if (x==0) ret=z ;
+      else ret=y ;
+      return ret ;
+    }
+
+    static inline CArray<double,1> cond_sff(double x, const CArray<double,1>& y, const CArray<double,1>& z)
+    {
+      CArray<double,1> ret(y.numElements()) ;
+      if (x==0) ret=z ;
+      else ret=y ;
+      return ret ;
+    }
+    
+    static inline CArray<double,1> cond_fss(const CArray<double,1>& x, double y, double z)
+    {
+      CArray<double,1> ret(x.numElements()) ;
+      Array<double,1>::const_iterator itx=x.begin(),itxe=x.end();
+      Array<double,1>::iterator itret=ret.begin() ;
+      
+      for(;itx!=itxe;++itx,++itret) *itret=( (*itx==0)?z:y) ;
+      return ret ;
+    }
+
+    static inline CArray<double,1> cond_fsf(const CArray<double,1>& x, double y, const CArray<double,1>& z)
+    {
+      CArray<double,1> ret(x.numElements()) ;
+      Array<double,1>::const_iterator itx=x.begin(), itxe=x.end(), itz=z.begin();
+      Array<double,1>::iterator itret=ret.begin() ;
+      for(;itx!=itxe;++itx,++itz,++itret) *itret=( (*itx==0)?*itz:y) ;
+      return ret ;
+    }
+
+    static inline CArray<double,1> cond_ffs(const CArray<double,1>& x, const CArray<double,1>& y, double z)
+    {
+      CArray<double,1> ret(x.numElements()) ;
+      Array<double,1>::const_iterator itx=x.begin(), itxe=x.end(), ity=y.begin() ;
+      Array<double,1>::iterator itret=ret.begin() ;
+      for(;itx!=itxe;++itx,++ity,++itret) *itret=( (*itx==0)?z:*ity) ;
+      return ret ;
+    }
+
+    static inline CArray<double,1> cond_fff(const CArray<double,1>& x, const CArray<double,1>& y, const CArray<double,1>&  z)
+    {
+      CArray<double,1> ret(x.numElements()) ;
+      Array<double,1>::const_iterator itx=x.begin(), itxe=x.end(), ity=y.begin(), itz=z.begin() ;
+      Array<double,1>::iterator itret=ret.begin() ;
+      for(;itx!=itxe;++itx,++ity,++itz,++itret) *itret=( (*itx==0)?*itz:*ity) ;
+      return ret ;
+    }
+
   };
 
Index: /XIOS/dev/dev_olga/src/parse_expr/scalar_expr_node.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/scalar_expr_node.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/scalar_expr_node.cpp	(revision 1158)
@@ -23,8 +23,16 @@
   double CScalarVarExprNode::reduce() const
   {
-    if (!CVariable::has(varId)) 
-      ERROR("double CScalarVarExprNode::reduce() const", << "The variable " << varId << " does not exist.");
+    // $missing_value will be replaced with NaN
+    if (varId == "missing_value")
+    {
+      return std::numeric_limits<double>::quiet_NaN();
+    }
+    else
+    {
+      if (!CVariable::has(varId)) 
+        ERROR("double CScalarVarExprNode::reduce() const", << "The variable " << varId << " does not exist.");
 
-    return CVariable::get(varId)->getData<double>();
+      return CVariable::get(varId)->getData<double>();
+    }
   }
 
@@ -59,3 +67,21 @@
     return op(child1->reduce(), child2->reduce());
   }
+
+
+  CScalarTernaryOpExprNode::CScalarTernaryOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)
+    : child1(child1)
+    , opId(opId)
+    , child2(child2)
+    , child3(child3)
+  {
+    if (!child1 || !child2 || !child3)
+      ERROR("CScalarTernaryOpExprNode::CScalarTernaryOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)",
+            "Impossible to create the new expression node, an invalid child node was provided.");
+  }
+
+  double CScalarTernaryOpExprNode::reduce() const
+  {
+    COperatorExpr::functionScalarScalarScalar op = operatorExpr.getOpScalarScalarScalar(opId);
+    return op(child1->reduce(), child2->reduce(), child3->reduce());
+  }
 }
Index: /XIOS/dev/dev_olga/src/parse_expr/scalar_expr_node.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/scalar_expr_node.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/scalar_expr_node.hpp	(revision 1158)
@@ -107,4 +107,25 @@
       boost::scoped_ptr<IScalarExprNode> child1, child2; //!< The scalar child nodes to which the operator is applied
   };
+
+    class CScalarTernaryOpExprNode : public IScalarExprNode
+  {
+    public:
+      /*!
+       * Constructs an expression node corresponding to the specified ternary operation
+       * applied to the provided scalar child nodes.
+       * Note that the child nodes will be destroyed automatically when the parent node
+       * is destroyed.
+       *
+       * \param opId the identifier of the operator
+       * \param child1, child2 , child3 the scalar child nodes to which the operator is applied
+       */
+      CScalarTernaryOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3);
+
+      double reduce() const;
+
+    private:
+      std::string opId; //!< The identifier of the field
+      boost::scoped_ptr<IScalarExprNode> child1, child2, child3; //!< The scalar child nodes to which the operator is applied
+  };
 }
 
Index: /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.cpp	(revision 1158)
@@ -145,8 +145,11 @@
     LE = 270,
     GE = 271,
-    LEFT_PARENTHESIS = 272,
-    RIGHT_PARENTHESIS = 273,
-    END = 274,
-    NEG = 275
+    NE = 272,
+    LEFT_PARENTHESIS = 273,
+    RIGHT_PARENTHESIS = 274,
+    QUESTION_MARK = 275,
+    COLON = 276,
+    END = 277,
+    NEG = 278
   };
 #endif
@@ -163,5 +166,5 @@
   xios::IFilterExprNode* filterNode;
 
-#line 166 "yacc_parser.cpp" /* yacc.c:355  */
+#line 169 "yacc_parser.cpp" /* yacc.c:355  */
 };
 # define YYSTYPE_IS_TRIVIAL 1
@@ -178,5 +181,5 @@
 /* Copy the second part of user declarations.  */
 
-#line 181 "yacc_parser.cpp" /* yacc.c:358  */
+#line 184 "yacc_parser.cpp" /* yacc.c:358  */
 
 #ifdef short
@@ -420,19 +423,19 @@
 #define YYFINAL  16
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   204
+#define YYLAST   371
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  21
+#define YYNTOKENS  24
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  4
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  52
+#define YYNRULES  64
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  108
+#define YYNSTATES  138
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   275
+#define YYMAXUTOK   278
 
 #define YYTRANSLATE(YYX)                                                \
@@ -470,5 +473,5 @@
        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20
+      15,    16,    17,    18,    19,    20,    21,    22,    23
 };
 
@@ -477,10 +480,11 @@
 static const yytype_uint8 yyrline[] =
 {
-       0,    61,    61,    62,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117
+       0,    63,    63,    64,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    88,    89,    90,    91,    92,    93,    94,    95,    96,
+      97,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+     107,   108,   109,   110,   111,   112,   113,   114,   115,   116,
+     117,   118,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131
 };
 #endif
@@ -492,7 +496,7 @@
 {
   "$end", "error", "$undefined", "NUMBER", "VAR", "ID", "AVERAGE", "PLUS",
-  "MINUS", "TIMES", "DIVIDE", "POWER", "EQ", "LT", "GT", "LE", "GE",
-  "LEFT_PARENTHESIS", "RIGHT_PARENTHESIS", "END", "NEG", "$accept", "Line",
-  "Expression", "Field_expr", YY_NULLPTR
+  "MINUS", "TIMES", "DIVIDE", "POWER", "EQ", "LT", "GT", "LE", "GE", "NE",
+  "LEFT_PARENTHESIS", "RIGHT_PARENTHESIS", "QUESTION_MARK", "COLON", "END",
+  "NEG", "$accept", "Line", "Expression", "Field_expr", YY_NULLPTR
 };
 #endif
@@ -505,17 +509,17 @@
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     275
+     275,   276,   277,   278
 };
 # endif
 
-#define YYPACT_NINF -13
+#define YYPACT_NINF -14
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-13)))
+  (!!((Yystate) == (-14)))
 
 #define YYTABLE_NINF -1
 
 #define yytable_value_is_error(Yytable_value) \
-  0
+  (!!((Yytable_value) == (-1)))
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
@@ -523,15 +527,18 @@
 static const yytype_int16 yypact[] =
 {
-      90,   -13,   -13,   -12,   -13,    35,    35,   -13,    44,   188,
-     103,    35,    24,    34,   116,   128,   -13,    35,    35,    35,
-      35,    65,    35,    35,    35,    35,    35,    35,    35,    35,
-      35,    35,    35,    35,    35,    35,    35,   -13,   140,   152,
-     -13,   -13,    -7,    23,    -7,    23,    24,    34,    24,    34,
-      54,    65,    65,    24,     0,    67,     0,    67,     0,    67,
-       0,    67,     0,    67,    -7,    23,    -7,    23,    24,    34,
-      24,    34,    24,    34,     0,    67,     0,    67,     0,    67,
-       0,    67,     0,    67,   -13,   -13,    65,    24,   164,    65,
-      65,    65,    65,    65,    65,    65,    65,    65,   176,    95,
-      95,    24,    24,    92,    92,    92,    92,    92
+      73,   -14,   -14,   -13,   -14,   124,   124,   -14,    39,   304,
+     104,   124,    34,    36,   220,   234,   -14,   124,   124,   124,
+     124,   133,   124,   124,   124,   124,   124,   124,   124,   124,
+     124,   124,   124,   124,   124,   124,   124,   124,   124,   124,
+     124,   -14,   248,   262,   -14,   -14,    -7,    27,    -7,    27,
+      34,    36,    34,    36,    30,   133,   133,    34,     0,    75,
+       0,    75,     0,    75,     0,    75,     0,    75,     0,    75,
+     145,   160,    -7,    27,    -7,    27,    34,    36,    34,    36,
+      34,    36,     0,    75,     0,    75,     0,    75,     0,    75,
+       0,    75,     0,    75,   175,   190,   -14,   -14,   133,    34,
+     276,   133,   133,   133,   133,   133,   133,   133,   133,   133,
+     133,   133,   124,   124,   124,   124,   290,    33,    33,    34,
+      34,   360,   360,   360,   360,   360,   360,   205,   318,   332,
+     318,   332,   318,   332,   318,   332,   133,   346
 };
 
@@ -541,15 +548,18 @@
 static const yytype_uint8 yydefact[] =
 {
-       0,     4,     5,    19,    20,     0,     0,     2,     0,     0,
-       0,     0,    10,    25,     0,     0,     1,     0,     0,     0,
+       0,     4,     5,    21,    22,     0,     0,     2,     0,     0,
+       0,     0,    10,    27,     0,     0,     1,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     3,     0,     0,
-      17,    32,     6,    34,     7,    36,     8,    38,     9,    40,
-       0,     0,     0,    11,    12,    43,    13,    45,    14,    47,
-      15,    49,    16,    51,    33,    21,    35,    22,    37,    23,
-      39,    24,    41,    26,    42,    27,    44,    28,    46,    29,
-      48,    30,    50,    31,    18,    52,     0,    10,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     6,
-       7,     8,     9,    12,    13,    14,    15,    16
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     3,     0,     0,    19,    35,     6,    44,     7,    46,
+       8,    48,     9,    50,     0,     0,     0,    11,    12,    53,
+      13,    55,    14,    57,    15,    59,    16,    61,    17,    63,
+       0,     0,    43,    23,    45,    24,    47,    25,    49,    26,
+      51,    28,    52,    29,    54,    30,    56,    31,    58,    32,
+      60,    33,    62,    34,     0,     0,    20,    64,     0,    10,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     6,     7,     8,
+       9,    12,    13,    14,    15,    16,    17,     0,    18,    36,
+      37,    38,    39,    40,    41,    42,     0,    18
 };
 
@@ -557,5 +567,5 @@
 static const yytype_int8 yypgoto[] =
 {
-     -13,   -13,    -5,    31
+     -14,   -14,    -5,    35
 };
 
@@ -569,52 +579,86 @@
      positive, shift that token.  If negative, reduce the rule whose
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
-static const yytype_uint8 yytable[] =
-{
-      12,    14,    19,    20,    21,    11,    38,    17,    18,    19,
-      20,    21,    42,    44,    46,    48,    53,    54,    56,    58,
-      60,    62,    64,    66,    68,    70,    72,    74,    76,    78,
-      80,    82,    29,    30,    31,    21,    13,    15,     1,     2,
-       3,     4,    39,     5,    16,    31,    87,    88,    43,    45,
-      47,    49,     6,    55,    57,    59,    61,    63,    65,    67,
-      69,    71,    73,    75,    77,    79,    81,    83,     1,     2,
-      50,    86,     0,    51,    27,    28,    29,    30,    31,     0,
-       0,    98,    52,     0,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,     1,     2,     3,     4,     0,     5,    89,
-      90,    91,    92,    21,    91,    92,    21,     6,     0,     7,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-       0,     0,    37,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,     0,    40,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,     0,    41,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,     0,    84,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,     0,
-      85,    89,    90,    91,    92,    21,    93,    94,    95,    96,
-      97,     0,    40,    89,    90,    91,    92,    21,    93,    94,
-      95,    96,    97,     0,    84,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26
+static const yytype_int16 yytable[] =
+{
+      12,    14,    19,    20,    21,    11,    42,    17,    18,    19,
+      20,    21,    46,    48,    50,    52,    57,    58,    60,    62,
+      64,    66,    68,    70,    72,    74,    76,    78,    80,    82,
+      84,    86,    88,    90,    92,    94,    31,    32,    33,    16,
+      13,    15,   103,   104,    21,    21,    43,    33,    98,     0,
+      99,   100,    47,    49,    51,    53,     0,    59,    61,    63,
+      65,    67,    69,    71,    73,    75,    77,    79,    81,    83,
+      85,    87,    89,    91,    93,    95,     1,     2,     3,     4,
+       0,     5,    29,    30,    31,    32,    33,     0,     0,     0,
+       0,     6,     0,   116,     0,     7,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,   130,   132,
+     134,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,     0,     0,    40,     0,    41,     1,     2,     3,
+       4,   137,     5,     0,     0,     0,     1,     2,    54,     0,
+       0,    55,     6,     0,     0,     0,     0,   129,   131,   133,
+     135,    56,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,     0,     0,    28,   112,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,     0,     0,
+      40,   113,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,     0,     0,    28,   114,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,     0,     0,
+      40,   115,   101,   102,   103,   104,    21,   105,   106,   107,
+     108,   109,   110,     0,     0,   111,   136,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,     0,    44,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,     0,    45,    40,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,     0,    96,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+       0,    97,    40,   101,   102,   103,   104,    21,   105,   106,
+     107,   108,   109,   110,     0,    44,   111,   101,   102,   103,
+     104,    21,   105,   106,   107,   108,   109,   110,     0,    96,
+     111,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,     0,     0,    28,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,     0,     0,    -1,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+       0,     0,    -1,   101,   102,   103,   104,    21,   105,   106,
+     107,   108,   109,   110,     0,     0,    -1,   101,   102,   103,
+     104,    21
 };
 
-static const yytype_int8 yycheck[] =
-{
-       5,     6,     9,    10,    11,    17,    11,     7,     8,     9,
+static const yytype_int16 yycheck[] =
+{
+       5,     6,     9,    10,    11,    18,    11,     7,     8,     9,
       10,    11,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,     9,    10,    11,    11,     5,     6,     3,     4,
-       5,     6,    11,     8,     0,    11,    51,    52,    17,    18,
-      19,    20,    17,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,     3,     4,
-       5,    17,    -1,     8,     7,     8,     9,    10,    11,    -1,
-      -1,    86,    17,    -1,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,     3,     4,     5,     6,    -1,     8,     7,
-       8,     9,    10,    11,     9,    10,    11,    17,    -1,    19,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      -1,    -1,    19,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    -1,    18,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    -1,    18,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    -1,    18,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    -1,
-      18,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    -1,    18,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    -1,    18,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16
+      35,    36,    37,    38,    39,    40,     9,    10,    11,     0,
+       5,     6,     9,    10,    11,    11,    11,    11,    18,    -1,
+      55,    56,    17,    18,    19,    20,    -1,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,     3,     4,     5,     6,
+      -1,     8,     7,     8,     9,    10,    11,    -1,    -1,    -1,
+      -1,    18,    -1,    98,    -1,    22,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    -1,    -1,    20,    -1,    22,     3,     4,     5,
+       6,   136,     8,    -1,    -1,    -1,     3,     4,     5,    -1,
+      -1,     8,    18,    -1,    -1,    -1,    -1,   112,   113,   114,
+     115,    18,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    -1,    -1,    20,    21,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    -1,    -1,
+      20,    21,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    -1,    -1,    20,    21,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    -1,    -1,
+      20,    21,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    -1,    -1,    20,    21,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
+      20,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    -1,    19,    20,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    -1,    19,    20,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      -1,    19,    20,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    -1,    19,    20,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
+      20,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    -1,    -1,    20,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    -1,    -1,    20,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      -1,    -1,    20,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    -1,    -1,    20,     7,     8,     9,
+      10,    11
 };
 
@@ -623,15 +667,18 @@
 static const yytype_uint8 yystos[] =
 {
-       0,     3,     4,     5,     6,     8,    17,    19,    22,    23,
-      24,    17,    23,    24,    23,    24,     0,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    19,    23,    24,
-      18,    18,    23,    24,    23,    24,    23,    24,    23,    24,
-       5,     8,    17,    23,    23,    24,    23,    24,    23,    24,
-      23,    24,    23,    24,    23,    24,    23,    24,    23,    24,
-      23,    24,    23,    24,    23,    24,    23,    24,    23,    24,
-      23,    24,    23,    24,    18,    18,    17,    23,    23,     7,
-       8,     9,    10,    12,    13,    14,    15,    16,    23,    23,
-      23,    23,    23,    23,    23,    23,    23,    23
+       0,     3,     4,     5,     6,     8,    18,    22,    25,    26,
+      27,    18,    26,    27,    26,    27,     0,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    20,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      20,    22,    26,    27,    19,    19,    26,    27,    26,    27,
+      26,    27,    26,    27,     5,     8,    18,    26,    26,    27,
+      26,    27,    26,    27,    26,    27,    26,    27,    26,    27,
+      26,    27,    26,    27,    26,    27,    26,    27,    26,    27,
+      26,    27,    26,    27,    26,    27,    26,    27,    26,    27,
+      26,    27,    26,    27,    26,    27,    19,    19,    18,    26,
+      26,     7,     8,     9,    10,    12,    13,    14,    15,    16,
+      17,    20,    21,    21,    21,    21,    26,    26,    26,    26,
+      26,    26,    26,    26,    26,    26,    26,    26,    26,    27,
+      26,    27,    26,    27,    26,    27,    21,    26
 };
 
@@ -639,10 +686,11 @@
 static const yytype_uint8 yyr1[] =
 {
-       0,    21,    22,    22,    23,    23,    23,    23,    23,    23,
-      23,    23,    23,    23,    23,    23,    23,    23,    23,    24,
-      24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
-      24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
-      24,    24,    24,    24,    24,    24,    24,    24,    24,    24,
-      24,    24,    24
+       0,    24,    25,    25,    26,    26,    26,    26,    26,    26,
+      26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
+      26,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+      27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+      27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+      27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
+      27,    27,    27,    27,    27
 };
 
@@ -651,9 +699,10 @@
 {
        0,     2,     1,     2,     1,     1,     3,     3,     3,     3,
-       2,     3,     3,     3,     3,     3,     3,     3,     4,     1,
-       1,     3,     3,     3,     3,     2,     3,     3,     3,     3,
+       2,     3,     3,     3,     3,     3,     3,     3,     5,     3,
+       4,     1,     1,     3,     3,     3,     3,     2,     3,     3,
+       3,     3,     3,     3,     3,     3,     5,     5,     5,     5,
+       5,     5,     5,     3,     3,     3,     3,     3,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     4
+       3,     3,     3,     3,     4
 };
 
@@ -1332,311 +1381,383 @@
     {
         case 2:
-#line 61 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 63 "yacc_parser.yacc" /* yacc.c:1646  */
     { /* Nothing to do */ }
-#line 1337 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1386 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 3:
-#line 62 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 64 "yacc_parser.yacc" /* yacc.c:1646  */
     { parsed = (yyvsp[-1].filterNode); }
-#line 1343 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1392 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 4:
-#line 66 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 68 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarValExprNode(*(yyvsp[0].str)); delete (yyvsp[0].str); }
-#line 1349 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1398 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 5:
-#line 67 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 69 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarVarExprNode(*(yyvsp[0].str)); delete (yyvsp[0].str); }
-#line 1355 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1404 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 6:
-#line 68 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 70 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "add", (yyvsp[0].scalarNode)); }
-#line 1361 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1410 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 7:
-#line 69 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 71 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "minus", (yyvsp[0].scalarNode)); }
-#line 1367 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1416 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 8:
-#line 70 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 72 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "mult", (yyvsp[0].scalarNode)); }
-#line 1373 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1422 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 9:
-#line 71 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 73 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "div", (yyvsp[0].scalarNode)); }
-#line 1379 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1428 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 10:
-#line 72 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 74 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarUnaryOpExprNode("neg", (yyvsp[0].scalarNode)); }
-#line 1385 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1434 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 11:
-#line 73 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 75 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "pow", (yyvsp[0].scalarNode)); }
-#line 1391 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1440 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 12:
-#line 74 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 76 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "eq", (yyvsp[0].scalarNode)); }
-#line 1397 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1446 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 13:
-#line 75 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 77 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "lt", (yyvsp[0].scalarNode)); }
-#line 1403 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1452 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 14:
-#line 76 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 78 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "gt", (yyvsp[0].scalarNode)); }
-#line 1409 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1458 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 15:
-#line 77 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 79 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "le", (yyvsp[0].scalarNode)); }
-#line 1415 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1464 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 16:
-#line 78 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 80 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "ge", (yyvsp[0].scalarNode)); }
-#line 1421 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1470 "yacc_parser.cpp" /* yacc.c:1646  */
     break;
 
   case 17:
-#line 79 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 81 "yacc_parser.yacc" /* yacc.c:1646  */
+    { (yyval.scalarNode) = new CScalarBinaryOpExprNode((yyvsp[-2].scalarNode), "ne", (yyvsp[0].scalarNode)); }
+#line 1476 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 18:
+#line 82 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.scalarNode) = new CScalarTernaryOpExprNode((yyvsp[-4].scalarNode), "cond", (yyvsp[-2].scalarNode), (yyvsp[0].scalarNode));}
+#line 1482 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 19:
+#line 83 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = (yyvsp[-1].scalarNode); }
-#line 1427 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 18:
-#line 80 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1488 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 20:
+#line 84 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.scalarNode) = new CScalarUnaryOpExprNode(*(yyvsp[-3].str), (yyvsp[-1].scalarNode)); delete (yyvsp[-3].str); }
-#line 1433 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 19:
-#line 84 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1494 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 21:
+#line 88 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldExprNode(*(yyvsp[0].str)); delete (yyvsp[0].str); }
-#line 1439 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 20:
-#line 85 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1500 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 22:
+#line 89 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterTemporalFieldExprNode(*(yyvsp[0].str)); delete (yyvsp[0].str); }
-#line 1445 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 21:
-#line 86 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1506 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 23:
+#line 90 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "add", (yyvsp[0].filterNode)); }
-#line 1451 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 22:
-#line 87 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1512 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 24:
+#line 91 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "minus", (yyvsp[0].filterNode)); }
-#line 1457 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 23:
-#line 88 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1518 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 25:
+#line 92 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "mult", (yyvsp[0].filterNode)); }
-#line 1463 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 24:
-#line 89 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1524 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 26:
+#line 93 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "div", (yyvsp[0].filterNode)); }
-#line 1469 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 25:
-#line 90 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1530 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 27:
+#line 94 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterUnaryOpExprNode("neg", (yyvsp[0].filterNode)); }
-#line 1475 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 26:
-#line 91 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1536 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 28:
+#line 95 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "pow", (yyvsp[0].filterNode)); }
-#line 1481 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 27:
-#line 92 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1542 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 29:
+#line 96 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "eq", (yyvsp[0].filterNode)); }
-#line 1487 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 28:
-#line 93 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1548 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 30:
+#line 97 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "lt", (yyvsp[0].filterNode)); }
-#line 1493 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 29:
-#line 94 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1554 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 31:
+#line 98 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "gt", (yyvsp[0].filterNode)); }
-#line 1499 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 30:
-#line 95 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1560 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 32:
+#line 99 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "le", (yyvsp[0].filterNode)); }
-#line 1505 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 31:
-#line 96 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1566 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 33:
+#line 100 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "ge", (yyvsp[0].filterNode)); }
-#line 1511 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 32:
-#line 97 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1572 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 34:
+#line 101 "yacc_parser.yacc" /* yacc.c:1646  */
+    { (yyval.filterNode) = new CFilterFieldFieldOpExprNode((yyvsp[-2].filterNode), "ne", (yyvsp[0].filterNode)); }
+#line 1578 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 35:
+#line 102 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = (yyvsp[-1].filterNode); }
-#line 1517 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 33:
-#line 98 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1584 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 36:
+#line 103 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.filterNode) = new CFilterScalarScalarFieldOpExprNode((yyvsp[-4].scalarNode), "cond",(yyvsp[-2].scalarNode), (yyvsp[0].filterNode));}
+#line 1590 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 37:
+#line 104 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.filterNode) = new CFilterScalarFieldScalarOpExprNode((yyvsp[-4].scalarNode), "cond",(yyvsp[-2].filterNode), (yyvsp[0].scalarNode));}
+#line 1596 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 38:
+#line 105 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.filterNode) = new CFilterScalarFieldFieldOpExprNode((yyvsp[-4].scalarNode), "cond",(yyvsp[-2].filterNode), (yyvsp[0].filterNode));}
+#line 1602 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 39:
+#line 106 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.filterNode) = new CFilterFieldScalarScalarOpExprNode((yyvsp[-4].filterNode), "cond",(yyvsp[-2].scalarNode), (yyvsp[0].scalarNode));}
+#line 1608 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 40:
+#line 107 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.filterNode) = new CFilterFieldScalarFieldOpExprNode((yyvsp[-4].filterNode), "cond",(yyvsp[-2].scalarNode), (yyvsp[0].filterNode));}
+#line 1614 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 41:
+#line 108 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.filterNode) = new CFilterFieldFieldScalarOpExprNode((yyvsp[-4].filterNode), "cond",(yyvsp[-2].filterNode), (yyvsp[0].scalarNode));}
+#line 1620 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 42:
+#line 109 "yacc_parser.yacc" /* yacc.c:1646  */
+    {(yyval.filterNode) = new CFilterFieldFieldFieldOpExprNode((yyvsp[-4].filterNode), "cond",(yyvsp[-2].filterNode), (yyvsp[0].filterNode));}
+#line 1626 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 43:
+#line 110 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "add", (yyvsp[0].scalarNode)); }
-#line 1523 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 34:
-#line 99 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1632 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 44:
+#line 111 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "add", (yyvsp[0].filterNode)); }
-#line 1529 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 35:
-#line 100 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1638 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 45:
+#line 112 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "minus", (yyvsp[0].scalarNode)); }
-#line 1535 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 36:
-#line 101 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1644 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 46:
+#line 113 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "minus", (yyvsp[0].filterNode)); }
-#line 1541 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 37:
-#line 102 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1650 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 47:
+#line 114 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "mult", (yyvsp[0].scalarNode)); }
-#line 1547 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 38:
-#line 103 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1656 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 48:
+#line 115 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "mult", (yyvsp[0].filterNode)); }
-#line 1553 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 39:
-#line 104 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1662 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 49:
+#line 116 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "div", (yyvsp[0].scalarNode)); }
-#line 1559 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 40:
-#line 105 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1668 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 50:
+#line 117 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "div", (yyvsp[0].filterNode)); }
-#line 1565 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 41:
-#line 106 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1674 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 51:
+#line 118 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "pow", (yyvsp[0].scalarNode)); }
-#line 1571 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 42:
-#line 107 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1680 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 52:
+#line 119 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "eq", (yyvsp[0].scalarNode)); }
-#line 1577 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 43:
-#line 108 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1686 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 53:
+#line 120 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "eq", (yyvsp[0].filterNode)); }
-#line 1583 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 44:
-#line 109 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1692 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 54:
+#line 121 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "lt", (yyvsp[0].scalarNode)); }
-#line 1589 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 45:
-#line 110 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1698 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 55:
+#line 122 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "lt", (yyvsp[0].filterNode)); }
-#line 1595 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 46:
-#line 111 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1704 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 56:
+#line 123 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "gt", (yyvsp[0].scalarNode)); }
-#line 1601 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 47:
-#line 112 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1710 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 57:
+#line 124 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "gt", (yyvsp[0].filterNode)); }
-#line 1607 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 48:
-#line 113 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1716 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 58:
+#line 125 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "le", (yyvsp[0].scalarNode)); }
-#line 1613 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 49:
-#line 114 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1722 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 59:
+#line 126 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "le", (yyvsp[0].filterNode)); }
-#line 1619 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 50:
-#line 115 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1728 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 60:
+#line 127 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "ge", (yyvsp[0].scalarNode)); }
-#line 1625 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 51:
-#line 116 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1734 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 61:
+#line 128 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "ge", (yyvsp[0].filterNode)); }
-#line 1631 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-  case 52:
-#line 117 "yacc_parser.yacc" /* yacc.c:1646  */
+#line 1740 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 62:
+#line 129 "yacc_parser.yacc" /* yacc.c:1646  */
+    { (yyval.filterNode) = new CFilterFieldScalarOpExprNode((yyvsp[-2].filterNode), "ne", (yyvsp[0].scalarNode)); }
+#line 1746 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 63:
+#line 130 "yacc_parser.yacc" /* yacc.c:1646  */
+    { (yyval.filterNode) = new CFilterScalarFieldOpExprNode((yyvsp[-2].scalarNode), "ne", (yyvsp[0].filterNode)); }
+#line 1752 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+  case 64:
+#line 131 "yacc_parser.yacc" /* yacc.c:1646  */
     { (yyval.filterNode) = new CFilterUnaryOpExprNode(*(yyvsp[-3].str), (yyvsp[-1].filterNode)); delete (yyvsp[-3].str); }
-#line 1637 "yacc_parser.cpp" /* yacc.c:1646  */
-    break;
-
-
-#line 1641 "yacc_parser.cpp" /* yacc.c:1646  */
+#line 1758 "yacc_parser.cpp" /* yacc.c:1646  */
+    break;
+
+
+#line 1762 "yacc_parser.cpp" /* yacc.c:1646  */
       default: break;
     }
@@ -1866,5 +1987,5 @@
   return yyresult;
 }
-#line 119 "yacc_parser.yacc" /* yacc.c:1906  */
+#line 133 "yacc_parser.yacc" /* yacc.c:1906  */
 
 
Index: /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.hpp	(revision 1158)
@@ -60,8 +60,11 @@
     LE = 270,
     GE = 271,
-    LEFT_PARENTHESIS = 272,
-    RIGHT_PARENTHESIS = 273,
-    END = 274,
-    NEG = 275
+    NE = 272,
+    LEFT_PARENTHESIS = 273,
+    RIGHT_PARENTHESIS = 274,
+    QUESTION_MARK = 275,
+    COLON = 276,
+    END = 277,
+    NEG = 278
   };
 #endif
@@ -78,5 +81,5 @@
   xios::IFilterExprNode* filterNode;
 
-#line 81 "yacc_parser.hpp" /* yacc.c:1909  */
+#line 84 "yacc_parser.hpp" /* yacc.c:1909  */
 };
 # define YYSTYPE_IS_TRIVIAL 1
Index: /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.yacc
===================================================================
--- /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.yacc	(revision 1157)
+++ /XIOS/dev/dev_olga/src/parse_expr/yacc_parser.yacc	(revision 1158)
@@ -42,9 +42,11 @@
 %token <str> VAR ID AVERAGE
 %token PLUS MINUS TIMES DIVIDE POWER
-%token EQ LT GT LE GE
+%token EQ LT GT LE GE NE
 %token LEFT_PARENTHESIS RIGHT_PARENTHESIS
+%token QUESTION_MARK COLON
 %token <str> END
 
-%left EQ LT GT LE GE
+%nonassoc QUESTION_MARK COLON
+%left EQ LT GT LE GE NE
 %left PLUS MINUS
 %left TIMES DIVIDE
@@ -77,4 +79,6 @@
           | Expression LE Expression  { $$ = new CScalarBinaryOpExprNode($1, "le", $3); }
           | Expression GE Expression  { $$ = new CScalarBinaryOpExprNode($1, "ge", $3); }
+          | Expression NE Expression  { $$ = new CScalarBinaryOpExprNode($1, "ne", $3); }
+          | Expression QUESTION_MARK Expression COLON Expression {$$ = new CScalarTernaryOpExprNode($1, "cond", $3, $5);} 
           | LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS    { $$ = $2; }
           | ID LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = new CScalarUnaryOpExprNode(*$1, $3); delete $1; }
@@ -95,5 +99,13 @@
           | Field_expr LE Field_expr { $$ = new CFilterFieldFieldOpExprNode($1, "le", $3); }
           | Field_expr GE Field_expr { $$ = new CFilterFieldFieldOpExprNode($1, "ge", $3); }
+          | Field_expr NE Field_expr { $$ = new CFilterFieldFieldOpExprNode($1, "ne", $3); }
           | LEFT_PARENTHESIS Field_expr RIGHT_PARENTHESIS	{ $$ = $2; }
+          | Expression QUESTION_MARK Expression COLON Field_expr {$$ = new CFilterScalarScalarFieldOpExprNode($1, "cond",$3, $5);}
+          | Expression QUESTION_MARK Field_expr COLON Expression {$$ = new CFilterScalarFieldScalarOpExprNode($1, "cond",$3, $5);}
+          | Expression QUESTION_MARK Field_expr COLON Field_expr {$$ = new CFilterScalarFieldFieldOpExprNode($1, "cond",$3, $5);}
+          | Field_expr QUESTION_MARK Expression COLON Expression {$$ = new CFilterFieldScalarScalarOpExprNode($1, "cond",$3, $5);}
+          | Field_expr QUESTION_MARK Expression COLON Field_expr {$$ = new CFilterFieldScalarFieldOpExprNode($1, "cond",$3, $5);}
+          | Field_expr QUESTION_MARK Field_expr COLON Expression {$$ = new CFilterFieldFieldScalarOpExprNode($1, "cond",$3, $5);}
+          | Field_expr QUESTION_MARK Field_expr COLON Field_expr {$$ = new CFilterFieldFieldFieldOpExprNode($1, "cond",$3, $5);}
           | Field_expr PLUS Expression   { $$ = new CFilterFieldScalarOpExprNode($1, "add", $3); }
           | Expression PLUS Field_expr   { $$ = new CFilterScalarFieldOpExprNode($1, "add", $3); }
@@ -115,4 +127,6 @@
           | Field_expr GE Expression { $$ = new CFilterFieldScalarOpExprNode($1, "ge", $3); }
           | Expression GE Field_expr { $$ = new CFilterScalarFieldOpExprNode($1, "ge", $3); }
+          | Field_expr NE Expression { $$ = new CFilterFieldScalarOpExprNode($1, "ne", $3); }
+          | Expression NE Field_expr { $$ = new CFilterScalarFieldOpExprNode($1, "ne", $3); }
           | ID LEFT_PARENTHESIS Field_expr RIGHT_PARENTHESIS { $$ = new CFilterUnaryOpExprNode(*$1, $3); delete $1; }
           ;
Index: /XIOS/dev/dev_olga/src/server.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/server.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/server.cpp	(revision 1158)
@@ -298,5 +298,4 @@
     void CServer::finalize(void)
     {
-
       CTimer::get("XIOS").suspend() ;
      
@@ -328,4 +327,5 @@
       report(0)<<"Performance report : Time spent in processing events : "<<CTimer::get("Process events").getCumulatedTime()<<endl  ;
       report(0)<<"Performance report : Ratio : "<<CTimer::get("Process events").getCumulatedTime()/CTimer::get("XIOS server").getCumulatedTime()*100.<<"%"<<endl  ;
+      report(100)<<CTimer::getAllCumulatedTime()<<endl ;
     }
 
@@ -352,5 +352,4 @@
          if (finished && contextList.empty()) stop=true ;
          eventScheduler->checkEvent() ;
-
        }
        CTimer::get("XIOS server").suspend() ;
@@ -422,5 +421,5 @@
        MPI_Status status ;
        int flag ;
-       static void* buffer ;
+       static char* buffer ;
        static MPI_Request request ;
        static bool recept=false ;
@@ -438,5 +437,5 @@
            MPI_Get_count(&status,MPI_CHAR,&count) ;
            buffer=new char[count] ;
-           MPI_Irecv(buffer,count,MPI_CHAR,rank,1,CXios::globalComm,&request) ;
+           MPI_Irecv((void*)buffer,count,MPI_CHAR,rank,1,CXios::globalComm,&request) ;
            recept=true ;
          }
@@ -451,6 +450,6 @@
            rank=status.MPI_SOURCE ;
            MPI_Get_count(&status,MPI_CHAR,&count) ;
-           recvContextMessage(buffer,count) ;
-           delete [] buffer;
+           recvContextMessage((void*)buffer,count) ;
+           delete [] buffer ;
            recept=false ;
          }
@@ -540,5 +539,5 @@
            MPI_Get_count(&status,MPI_CHAR,&count) ;
            buffer=new char[count] ;
-           MPI_Irecv(buffer,count,MPI_CHAR,root,2,intraComm,&request) ;
+           MPI_Irecv((void*)buffer,count,MPI_CHAR,root,2,intraComm,&request) ;
            recept=true ;
          }
@@ -552,5 +551,5 @@
            MPI_Get_count(&status,MPI_CHAR,&count) ;
            eventScheduler->registerEvent(nbContexts,hashId);
-//           registerContext(buffer,count) ;
+//           registerContext((void*)buffer,count) ;
 //           delete [] buffer ;
            recept=false ;
@@ -685,13 +684,4 @@
       id = getRank();
 
-//      if (!CXios::usingServer2)
-//        id = getRank();
-//      else
-//      {
-//        if (serverLevel == 1)
-//          id = rank_;
-//        else
-//          id = poolId;
-//      }
       fileNameClient << fileName << "_" << std::setfill('0') << std::setw(numDigit) << id << ext;
       fb->open(fileNameClient.str().c_str(), std::ios::out);
Index: /XIOS/dev/dev_olga/src/test/test_regular.f90
===================================================================
--- /XIOS/dev/dev_olga/src/test/test_regular.f90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/test/test_regular.f90	(revision 1158)
@@ -18,8 +18,8 @@
   INTEGER :: comm  
   INTEGER :: ierr
-  INTEGER :: size, rank
-
-  INTEGER :: nlon = 5 !100 
-  INTEGER :: nlat = 5 !100
+  INTEGER :: sizeComm, rank    ! SIZE is a fortran function
+
+  INTEGER :: nlon = 100 
+  INTEGER :: nlat = 100
   INTEGER :: ncell 
   INTEGER :: ilat, ilon, ind
Index: /XIOS/dev/dev_olga/src/timer.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/timer.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/timer.cpp	(revision 1158)
@@ -3,4 +3,6 @@
 #include <string>
 #include <map>
+#include <iostream>
+#include <sstream>
 #include "tracer.hpp"
 
@@ -57,3 +59,11 @@
     return it->second;
   }
+
+  string CTimer::getAllCumulatedTime(void)
+  {
+    std::ostringstream strOut ;
+    for(std::map<std::string,CTimer>::iterator it=allTimer.begin();it!=allTimer.end();++it)
+      strOut<<"Timer : "<<it->first<<"    -->   cumulated time : "<<it->second.getCumulatedTime()<<std::endl ;
+    return strOut.str() ;
+  }
 }
Index: /XIOS/dev/dev_olga/src/timer.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/timer.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/timer.hpp	(revision 1158)
@@ -23,4 +23,5 @@
       static double getTime(void);
       static CTimer& get(std::string name);
+      static std::string getAllCumulatedTime(void) ;
   };
 }
Index: /XIOS/dev/dev_olga/src/transformation/Functions/average_reduction.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/average_reduction.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/average_reduction.cpp	(revision 1158)
@@ -3,9 +3,10 @@
    \author Ha NGUYEN
    \since 8 Sep 2016
-   \date 8 Sep 2016
+   \date 9 Jan 2017
 
    \brief average reduction
  */
 #include "average_reduction.hpp"
+#include "utils.hpp"
 
 namespace xios {
@@ -29,25 +30,56 @@
                                        const double* dataInput,
                                        CArray<double,1>& dataOut,
-                                       std::vector<bool>& flagInitial)
+                                       std::vector<bool>& flagInitial,                     
+                                       bool ignoreMissingValue)
 {
-  if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; }
+  if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; }  
 
-  int nbLocalIndex = localIndex.size();
-  int currentlocalIndex = 0;
-  double currentWeight  = 0.0;
-  for (int idx = 0; idx < nbLocalIndex; ++idx)
+  if (ignoreMissingValue)
   {
-    currentlocalIndex = localIndex[idx].first;
-    currentWeight     = localIndex[idx].second;
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;
+    double currentWeight  = 0.0;
 
-    if (flagInitial[currentlocalIndex])
+    dataOut=std::numeric_limits<double>::quiet_NaN();
+
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex) = *(dataInput + idx);
-      flagInitial[currentlocalIndex] = false;
+      currentlocalIndex = localIndex[idx].first;
+      currentWeight     = localIndex[idx].second;
+      if (!NumTraits<double>::isnan(*(dataInput + idx)))
+      {
+        if (flagInitial[currentlocalIndex])
+        {
+          dataOut(currentlocalIndex) = *(dataInput + idx);
+          flagInitial[currentlocalIndex] = false;
+        }
+        else
+        {
+          dataOut(currentlocalIndex)  += *(dataInput + idx);
+          weights_(currentlocalIndex) += 1.0;
+        }
+      }
     }
-    else
+  }
+  else
+  {
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;
+    double currentWeight  = 0.0;
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex)  += *(dataInput + idx);
-      weights_(currentlocalIndex) += 1.0;
+      currentlocalIndex = localIndex[idx].first;
+      currentWeight     = localIndex[idx].second;
+
+      if (flagInitial[currentlocalIndex])
+      {
+        dataOut(currentlocalIndex) = *(dataInput + idx);
+        flagInitial[currentlocalIndex] = false;
+      }
+      else
+      {
+        dataOut(currentlocalIndex)  += *(dataInput + idx);
+        weights_(currentlocalIndex) += 1.0;
+      }
     }
   }
Index: /XIOS/dev/dev_olga/src/transformation/Functions/average_reduction.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/average_reduction.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/average_reduction.hpp	(revision 1158)
@@ -26,5 +26,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue);
 
   virtual void updateData(CArray<double,1>& dataOut);
Index: /XIOS/dev/dev_olga/src/transformation/Functions/extract.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/extract.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/extract.cpp	(revision 1158)
@@ -29,5 +29,6 @@
                                        const double* dataInput,
                                        CArray<double,1>& dataOut,
-                                       std::vector<bool>& flagInitial)
+                                       std::vector<bool>& flagInitial,
+                                       bool ignoreMissingValue)
 {
   int nbLocalIndex = localIndex.size();
Index: /XIOS/dev/dev_olga/src/transformation/Functions/extract.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/extract.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/extract.hpp	(revision 1158)
@@ -26,5 +26,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,
+                     bool ignoreMissingValue);
 
   virtual ~CExtractReductionAlgorithm() {}
Index: /XIOS/dev/dev_olga/src/transformation/Functions/max_reduction.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/max_reduction.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/max_reduction.cpp	(revision 1158)
@@ -8,4 +8,5 @@
  */
 #include "max_reduction.hpp"
+#include "utils.hpp"
 
 namespace xios {
@@ -29,21 +30,45 @@
                                    const double* dataInput,
                                    CArray<double,1>& dataOut,
-                                   std::vector<bool>& flagInitial)
-{
-  int nbLocalIndex = localIndex.size();
-  int currentlocalIndex = 0;
-  double currentWeight  = 0.0;
-  for (int idx = 0; idx < nbLocalIndex; ++idx)
+                                   std::vector<bool>& flagInitial,
+                                   bool ignoreMissingValue)
+{ 
+  if (ignoreMissingValue)
   {
-    currentlocalIndex = localIndex[idx].first;
-    currentWeight     = localIndex[idx].second;
-    if (flagInitial[currentlocalIndex])
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;
+    dataOut=std::numeric_limits<double>::quiet_NaN();    
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex) = *(dataInput + idx);
-      flagInitial[currentlocalIndex] = false;
+      currentlocalIndex = localIndex[idx].first;      
+      if (!NumTraits<double>::isnan(*(dataInput + idx)))
+      {
+        if (flagInitial[currentlocalIndex])
+        {
+          dataOut(currentlocalIndex) = *(dataInput + idx);
+          flagInitial[currentlocalIndex] = false;
+        }
+        else
+        {
+          dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex));
+        }
+      }
     }
-    else
+  }
+  else
+  {
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;    
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex));
+      currentlocalIndex = localIndex[idx].first;      
+      if (flagInitial[currentlocalIndex])
+      {
+        dataOut(currentlocalIndex) = *(dataInput + idx);
+        flagInitial[currentlocalIndex] = false;
+      }
+      else
+      {
+        dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex));
+      }
     }
   }
Index: /XIOS/dev/dev_olga/src/transformation/Functions/max_reduction.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/max_reduction.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/max_reduction.hpp	(revision 1158)
@@ -26,5 +26,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,
+                     bool ignoreMissingValue);
 
   virtual ~CMaxReductionAlgorithm() {}
Index: /XIOS/dev/dev_olga/src/transformation/Functions/min_reduction.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/min_reduction.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/min_reduction.cpp	(revision 1158)
@@ -3,9 +3,10 @@
    \author Ha NGUYEN
    \since 27 June 2016
-   \date 27 June 2016
+   \date 9 Jan 2017
 
    \brief min reduction
  */
 #include "min_reduction.hpp"
+#include "utils.hpp"
 
 namespace xios {
@@ -29,19 +30,45 @@
                                    const double* dataInput,
                                    CArray<double,1>& dataOut,
-                                   std::vector<bool>& flagInitial)
+                                   std::vector<bool>& flagInitial,
+                                   bool ignoreMissingValue)
 {
-  int nbLocalIndex = localIndex.size();
-  int currentlocalIndex = 0;
-  for (int idx = 0; idx < nbLocalIndex; ++idx)
+  if (ignoreMissingValue)
   {
-    currentlocalIndex = localIndex[idx].first;
-    if (flagInitial[currentlocalIndex])
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;
+    dataOut=std::numeric_limits<double>::quiet_NaN();
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex) = *(dataInput + idx);
-      flagInitial[currentlocalIndex] = false;
+      currentlocalIndex = localIndex[idx].first;
+      if (!NumTraits<double>::isnan(*(dataInput + idx)))
+      {
+        if (flagInitial[currentlocalIndex])
+        {
+          dataOut(currentlocalIndex) = *(dataInput + idx);
+          flagInitial[currentlocalIndex] = false;
+        }
+        else
+        {
+          dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex));
+        }
+      }
     }
-    else
+  }
+  else
+  {
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex));
+      currentlocalIndex = localIndex[idx].first;
+      if (flagInitial[currentlocalIndex])
+      {
+        dataOut(currentlocalIndex) = *(dataInput + idx);
+        flagInitial[currentlocalIndex] = false;
+      }
+      else
+      {
+        dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex));
+      }
     }
   }
Index: /XIOS/dev/dev_olga/src/transformation/Functions/min_reduction.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/min_reduction.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/min_reduction.hpp	(revision 1158)
@@ -26,5 +26,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue);
 
   virtual ~CMinReductionAlgorithm() {}
Index: /XIOS/dev/dev_olga/src/transformation/Functions/reduction.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/reduction.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/reduction.hpp	(revision 1158)
@@ -45,5 +45,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial) = 0;
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue) = 0;
   /*!
     Update local data 
Index: /XIOS/dev/dev_olga/src/transformation/Functions/sum_reduction.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/sum_reduction.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/sum_reduction.cpp	(revision 1158)
@@ -3,9 +3,10 @@
    \author Ha NGUYEN
    \since 27 June 2016
-   \date 27 June 2016
+   \date 9 Jan 2017
 
    \brief sum reduction
  */
 #include "sum_reduction.hpp"
+#include "utils.hpp"
 
 namespace xios {
@@ -29,21 +30,47 @@
                                    const double* dataInput,
                                    CArray<double,1>& dataOut,
-                                   std::vector<bool>& flagInitial)
+                                   std::vector<bool>& flagInitial,
+                                   bool ignoreMissingValue)
 {
-  int nbLocalIndex = localIndex.size();
-  int currentlocalIndex = 0;
-  double currentWeight  = 0.0;
-  for (int idx = 0; idx < nbLocalIndex; ++idx)
+  if (ignoreMissingValue)
   {
-    currentlocalIndex = localIndex[idx].first;
-    currentWeight     = localIndex[idx].second;
-    if (flagInitial[currentlocalIndex])
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;
+
+    dataOut=std::numeric_limits<double>::quiet_NaN();
+  
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex) = *(dataInput + idx);
-      flagInitial[currentlocalIndex] = false;
-    }
-    else
+      currentlocalIndex = localIndex[idx].first;   
+      if (!NumTraits<double>::isnan(*(dataInput + idx)))
+      {   
+        if (flagInitial[currentlocalIndex])
+        {
+          dataOut(currentlocalIndex) = *(dataInput + idx);
+          flagInitial[currentlocalIndex] = false;
+        }
+        else
+        {
+          dataOut(currentlocalIndex) += *(dataInput + idx);
+        }
+      }
+    }    
+  }
+  else
+  {
+    int nbLocalIndex = localIndex.size();
+    int currentlocalIndex = 0;    
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      dataOut(currentlocalIndex) += *(dataInput + idx);
+      currentlocalIndex = localIndex[idx].first;      
+      if (flagInitial[currentlocalIndex])
+      {
+        dataOut(currentlocalIndex) = *(dataInput + idx);
+        flagInitial[currentlocalIndex] = false;
+      }
+      else
+      {
+        dataOut(currentlocalIndex) += *(dataInput + idx);
+      }
     }
   }
Index: /XIOS/dev/dev_olga/src/transformation/Functions/sum_reduction.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/Functions/sum_reduction.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/Functions/sum_reduction.hpp	(revision 1158)
@@ -26,5 +26,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,
+                     bool ignoreMissingValue);
 
   virtual ~CSumReductionAlgorithm() {}
Index: /XIOS/dev/dev_olga/src/transformation/axis_algorithm_extract_domain.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/axis_algorithm_extract_domain.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/axis_algorithm_extract_domain.cpp	(revision 1158)
@@ -68,8 +68,8 @@
                                         const double* dataInput,
                                         CArray<double,1>& dataOut,
-                                        std::vector<bool>& flagInitial,
-                                        const double& defaultValue)
+                                        std::vector<bool>& flagInitial,                     
+                                        bool ignoreMissingValue)
 {
-  reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
+  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue);
 }
 
Index: /XIOS/dev/dev_olga/src/transformation/axis_algorithm_extract_domain.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/axis_algorithm_extract_domain.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/axis_algorithm_extract_domain.hpp	(revision 1158)
@@ -33,6 +33,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial,
-                     const double& defaultValue);
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue);
 
   virtual ~CAxisAlgorithmExtractDomain();
Index: /XIOS/dev/dev_olga/src/transformation/axis_algorithm_reduce_domain.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/axis_algorithm_reduce_domain.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/axis_algorithm_reduce_domain.cpp	(revision 1158)
@@ -76,8 +76,8 @@
                                        const double* dataInput,
                                        CArray<double,1>& dataOut,
-                                       std::vector<bool>& flagInitial,
-                                       const double& defaultValue)
+                                       std::vector<bool>& flagInitial,                     
+                                       bool ignoreMissingValue)
 {
-  reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
+  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue);
 }
 
Index: /XIOS/dev/dev_olga/src/transformation/axis_algorithm_reduce_domain.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 1158)
@@ -32,6 +32,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial,
-                     const double& defaultValue);
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue);
 
   virtual void updateData(CArray<double,1>& dataOut);
Index: /XIOS/dev/dev_olga/src/transformation/domain_algorithm_expand.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/domain_algorithm_expand.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/domain_algorithm_expand.cpp	(revision 1158)
@@ -45,5 +45,6 @@
                                                CDomain* domainSource,
                                                CExpandDomain* expandDomain)
-: CDomainAlgorithmTransformation(domainDestination, domainSource)
+: CDomainAlgorithmTransformation(domainDestination, domainSource),
+  isXPeriodic_(false), isYPeriodic_(false)
 {
   if (domainDestination == domainSource)
@@ -55,15 +56,11 @@
   }
 
-//  if (!domainDestination->hasRefTo(domainSource))
-//  {
-//    ERROR("CDomainAlgorithmExpand::CDomainAlgorithmExpand(CDomain* domainDestination,CDomain* domainSource, CExpandDomain* expandDomain)",
-//           << "Domain domain destination must refer to domain source (directly or indirectly) by domain_ref " << std::endl
-//           << "Domain source " <<domainSource->getId() << std::endl
-//           << "Domain destination " <<domainDestination->getId() << std::endl);
-//  }
-
   this->type_ = (ELEMENT_MODIFICATION_WITH_DATA);
+  // Make sure domain source have all valid attributes
+  // domainSource->checkAllAttributes();
   expandDomain->checkValid(domainDestination);
-
+  if (!expandDomain->i_periodic.isEmpty()) isXPeriodic_ = expandDomain->i_periodic;
+  if (!expandDomain->j_periodic.isEmpty()) isYPeriodic_ = expandDomain->j_periodic;
+  
   switch (expandDomain->type)
   {
@@ -92,12 +89,18 @@
   CContextClient* client=context->client;
 
+  int type = 1; // For edge
+  CMesh mesh;
   CArray<double,2>& bounds_lon_src = domainSource->bounds_lon_1d;
   CArray<double,2>& bounds_lat_src = domainSource->bounds_lat_1d;
   CArray<int,2> neighborsSrc;
-
-  int type = 1; // For edge
-  CMesh mesh;
-  mesh.getGlobalNghbFaces(type, client->intraComm, domainSource->i_index, bounds_lon_src, bounds_lat_src, neighborsSrc);
-  updateDomainAttributes(domainDestination, domainSource, neighborsSrc);
+  switch (domainSource->type) {
+   case CDomain::type_attr::unstructured:      
+      mesh.getGlobalNghbFaces(type, client->intraComm, domainSource->i_index, bounds_lon_src, bounds_lat_src, neighborsSrc);
+      updateUnstructuredDomainAttributes(domainDestination, domainSource, neighborsSrc);
+      break;
+   default:
+      updateRectilinearDomainAttributes(domainDestination, domainSource, neighborsSrc);
+      break;      
+  }  
 }
 
@@ -113,12 +116,341 @@
   CContextClient* client=context->client;
 
+  int type = 1; // For edge
+  CMesh mesh;
   CArray<double,2>& bounds_lon_src = domainSource->bounds_lon_1d;
   CArray<double,2>& bounds_lat_src = domainSource->bounds_lat_1d;
   CArray<int,2> neighborsSrc;
-
-  int type = 0; // For node
-  CMesh mesh;
-  mesh.getGlobalNghbFaces(type, client->intraComm, domainSource->i_index, bounds_lon_src, bounds_lat_src, neighborsSrc);
-  updateDomainAttributes(domainDestination, domainSource, neighborsSrc);
+  switch (domainSource->type) {
+   case CDomain::type_attr::unstructured:      
+      mesh.getGlobalNghbFaces(type, client->intraComm, domainSource->i_index, bounds_lon_src, bounds_lat_src, neighborsSrc);
+      updateUnstructuredDomainAttributes(domainDestination, domainSource, neighborsSrc);
+      break;
+   default:
+      updateRectilinearDomainAttributes(domainDestination, domainSource, neighborsSrc);
+      break;      
+  }  
+}
+
+/*!
+ *  Extend rectilinear or curvilinear domain destination and update its attributes
+ *  Suppose that domain destination and domain source have the same values for all attributes (by inheritance)
+ *  \param [in/out] domainDestination domain destination
+ *  \param [in] domainSource domain source
+ *  \param [in] neighborsDomainSrc neighbor of domain source. For now, we don't need it for rectilinear
+ */
+void CDomainAlgorithmExpand::updateRectilinearDomainAttributes(CDomain* domainDestination,
+                                                               CDomain* domainSource,
+                                                               CArray<int,2>& neighborsDomainSrc)
+{
+  int index, globalIndex, idx;
+  int iindexDst, jindexDst, globIndexDst;
+  int iindexSrc, jindexSrc, globIndexSrc;
+  CContext* context = CContext::getCurrent();
+  CContextClient* client=context->client;
+
+  // First of all, "copy" all attributes of domain source to domain destination
+  StdString domainDstRef = (!domainDestination->domain_ref.isEmpty()) ? domainDestination->domain_ref.getValue()
+                                                                      : "";
+  if (domainDstRef != domainSource->getId())
+  {
+    domainDestination->domain_ref.setValue(domainSource->getId());
+    domainDestination->solveRefInheritance(true);
+  }
+
+  if (domainDstRef.empty()) domainDestination->domain_ref.reset();
+  else domainDestination->domain_ref.setValue(domainDstRef);
+
+  // Here are attributes of source need tranfering
+  int niGloSrc = domainSource->ni_glo;
+  int njGloSrc = domainSource->nj_glo;
+  int niSrc = domainSource->ni, ibegin = domainSource->ibegin;
+  int njSrc = domainSource->nj, jbegin = domainSource->jbegin;
+  int dataDimSrc = domainSource->data_dim;
+  CArray<bool,1>& mask_1d_src = domainSource->mask_1d;
+  CArray<int,1>& i_index_src = domainSource->i_index;
+  CArray<int,1>& j_index_src = domainSource->j_index;
+  CArray<int,1>& data_i_index_src = domainSource->data_i_index;
+  CArray<int,1>& data_j_index_src = domainSource->data_j_index;
+  int data_i_begin_src = domainSource->data_ibegin;
+  int data_j_begin_src = domainSource->data_jbegin;
+  CArray<double,1>& lon_src = domainSource->lonvalue;
+  CArray<double,1>& lat_src = domainSource->latvalue;
+
+  // We need to generate boundary for longitude and latitude
+  if (domainSource->bounds_lon_1d.isEmpty() || domainSource->bounds_lat_1d.isEmpty())
+  {
+    CArray<double,1> lon = lon_src(Range(0,niSrc-1));
+    CArray<double,1> lat = lat_src(Range(0,lat_src.numElements()-niSrc,niSrc));
+    CArray<double,2>& bounds_lon_src = domainSource->bounds_lon_1d;
+    CArray<double,2>& bounds_lat_src = domainSource->bounds_lat_1d;
+    domainSource->fillInRectilinearBoundLonLat(lon_src, lat_src, bounds_lon_src, bounds_lat_src);
+  }
+
+
+  CArray<double,2>& bounds_lon_src = domainSource->bounds_lon_1d;
+  CArray<double,2>& bounds_lat_src = domainSource->bounds_lat_1d;
+
+  int nVertex       = bounds_lon_src.shape()[0];
+  int oldNbLocal = i_index_src.numElements();
+  // Calculate ni, nj by using i_index and j_index
+  int niSrcByIndex = max(i_index_src) - min(i_index_src) + 1;
+  int njSrcByIndex = max(j_index_src) - min(j_index_src) + 1;  
+  int dataIindexBoundSrc = (1 == dataDimSrc) ? (niSrcByIndex * njSrcByIndex) : niSrcByIndex;
+  int dataJindexBoundSrc = (1 == dataDimSrc) ? (niSrcByIndex * njSrcByIndex) : njSrcByIndex;
+
+  // Uncompress data_i_index, data_j_index
+  CArray<int,1> data_i_index_src_full(oldNbLocal);
+  CArray<int,1> data_j_index_src_full(oldNbLocal);
+  int nbUnMaskedPointOnLocalDomain = 0;
+  data_i_index_src_full = -1; // Suppose all values are masked
+  data_j_index_src_full = -1; // Suppose all values are masked
+  for (idx = 0; idx < data_i_index_src.numElements(); ++idx)
+  {
+    int dataIidx = data_i_index_src(idx) + data_i_begin_src;
+    int dataJidx = data_j_index_src(idx) + data_j_begin_src;
+    if ((0 <= dataIidx) && (dataIidx < dataIindexBoundSrc) &&
+        (0 <= dataJidx) && (dataJidx < dataJindexBoundSrc))
+    {
+      data_i_index_src_full(nbUnMaskedPointOnLocalDomain) = dataIidx;
+      data_j_index_src_full(nbUnMaskedPointOnLocalDomain) = dataJidx;
+      ++nbUnMaskedPointOnLocalDomain;
+    }
+  }
+
+  // Expand domain destination, not only local but also global
+  int niGloDst = niGloSrc + 2;
+  int njGloDst = njGloSrc + 2;
+  int niDst = niSrc + 2;
+  int njDst = njSrc + 2;
+  domainDestination->ni_glo.setValue(niGloDst);
+  domainDestination->nj_glo.setValue(njGloDst);
+  domainDestination->ni.setValue(niDst);
+  domainDestination->nj.setValue(njDst);
+  domainDestination->global_zoom_ni.setValue(domainSource->global_zoom_ni+2);
+  domainDestination->global_zoom_nj.setValue(domainSource->global_zoom_nj+2);
+
+  CArray<bool,1>& mask_1d_dst = domainDestination->mask_1d;
+  CArray<int,1>& i_index_dst  = domainDestination->i_index;
+  CArray<int,1>& j_index_dst  = domainDestination->j_index;  
+  CArray<int,1>& data_i_index_dst  = domainDestination->data_i_index;
+  CArray<int,1>& data_j_index_dst  = domainDestination->data_j_index;
+  
+  // Make sure that we use only lonvalue_client, latvalue_client
+  if (!domainDestination->lonvalue_1d.isEmpty()) domainDestination->lonvalue_1d.reset();
+  if (!domainDestination->latvalue_1d.isEmpty()) domainDestination->latvalue_1d.reset();
+  if (!domainDestination->lonvalue_2d.isEmpty()) domainDestination->lonvalue_2d.reset();
+  if (!domainDestination->latvalue_2d.isEmpty()) domainDestination->latvalue_2d.reset();
+
+  // Recalculate i_index, j_index of extended domain
+  // Should be enough for common case, but if we have arbitrary distribution?
+  int newNbLocalDst = niDst * njDst;     
+
+  mask_1d_dst.resize(newNbLocalDst);
+  i_index_dst.resize(newNbLocalDst);
+  j_index_dst.resize(newNbLocalDst);
+  CArray<int,1> data_i_index_dst_full(newNbLocalDst);
+  CArray<int,1> data_j_index_dst_full(newNbLocalDst);
+
+  domainDestination->lonvalue.resizeAndPreserve(newNbLocalDst);
+  domainDestination->latvalue.resizeAndPreserve(newNbLocalDst);
+  domainDestination->bounds_lon_1d.resizeAndPreserve(nVertex, newNbLocalDst);
+  domainDestination->bounds_lat_1d.resizeAndPreserve(nVertex, newNbLocalDst);
+  CArray<double,1>& lon_dst   = domainDestination->lonvalue;
+  CArray<double,1>& lat_dst   = domainDestination->latvalue;
+  CArray<double,2>& bounds_lon_dst = domainDestination->bounds_lon_1d;
+  CArray<double,2>& bounds_lat_dst = domainDestination->bounds_lat_1d;
+
+  // Update i_index, j_index
+  for (int j = 0; j < njDst; ++j)
+    for (int i = 0; i < niDst; ++i)
+    {
+      idx = j * niDst + i; 
+      i_index_dst(idx) = i + ibegin;
+      j_index_dst(idx) = j + jbegin;
+    }
+ 
+
+  // 1. Fill in array relating to global index (i_index, j_index, transmap, etc, ...)
+  // Global index mapping between destination and source
+  this->transformationMapping_.resize(1);
+  this->transformationWeight_.resize(1);
+  TransformationIndexMap& transMap = this->transformationMapping_[0];
+  TransformationWeightMap& transWeight = this->transformationWeight_[0];
+
+  transMap.rehash(std::ceil(newNbLocalDst/transMap.max_load_factor()));
+  transWeight.rehash(std::ceil(newNbLocalDst/transWeight.max_load_factor()));
+  
+  // Index mapping for local domain
+  // Mapping global index of expanded domain into original one 
+  // (Representing global index of expanded domain in form of global index of original one)
+  CArray<size_t,1> globalIndexSrcOnDstDomain(newNbLocalDst); 
+  for (idx = 0; idx < newNbLocalDst; ++idx)
+  {
+    iindexDst = i_index_dst(idx);
+    jindexDst = j_index_dst(idx);
+    globIndexDst = jindexDst * niGloDst + iindexDst;
+    globIndexSrc = (((jindexDst-1)+njGloSrc) % njGloSrc) * niGloSrc + (((iindexDst-1)+niGloSrc) % niGloSrc) ;
+    globalIndexSrcOnDstDomain(idx) = globIndexSrc;
+
+    transMap[globIndexDst].push_back(globIndexSrc);
+    transWeight[globIndexDst].push_back(1.0); 
+  }
+
+  // 2. Exchange local info among domains (lon,lat,bounds,mask,etc,...)
+  CClientClientDHTDouble::Index2VectorInfoTypeMap localData;
+  localData.rehash(std::ceil(oldNbLocal/localData.max_load_factor()));
+
+  // Information exchanged among domains (attention to their order), number in parentheses presents size of data
+  // lon(1) + lat(1) + bounds_lon(nVertex) + bounds_lat(nVertex) + mask(1) + data_i_index(1)
+  int dataPackageSize =  1 + 1 + // lon + lat
+                         nVertex + nVertex + //bounds_lon + bounds_lat
+                         1 + // mask_1d_dst;
+                         1 + 1; // data_i_index + data_j_index
+  // Initialize database
+  for (int idx = 0; idx < oldNbLocal; ++idx)
+  {
+    index = i_index_src(idx) + j_index_src(idx) * niGloSrc;
+    localData[index].resize(dataPackageSize);
+    std::vector<double>& data = localData[index];
+
+    //Pack data
+    int dataIdx = 0;
+    data[dataIdx] = lon_src(idx);++dataIdx;
+    data[dataIdx] = lat_src(idx);++dataIdx;
+    for (int i = 0; i < nVertex; ++i)
+    {
+      data[dataIdx] = bounds_lon_src(i,idx); ++dataIdx;
+    }
+    for (int i = 0; i < nVertex; ++i)
+    {
+      data[dataIdx] = bounds_lat_src(i,idx); ++dataIdx;
+    }
+    data[dataIdx] = mask_1d_src(idx) ? 1.0 : -1.0; ++dataIdx;
+    data[dataIdx] = data_i_index_src_full(idx);++dataIdx;
+    data[dataIdx] = data_j_index_src_full(idx);
+  }
+
+  CClientClientDHTDouble dhtData(localData,client->intraComm);
+  dhtData.computeIndexInfoMapping(globalIndexSrcOnDstDomain);
+  CClientClientDHTDouble::Index2VectorInfoTypeMap& neighborData = dhtData.getInfoIndexMap();
+  CClientClientDHTDouble::Index2VectorInfoTypeMap::iterator ite = neighborData.end(), it;
+
+  // Ok get all data for destination
+  // If domain is not periodic, then we mask all extended part.
+  int nbUnMaskedPointOnExtendedPart = 0, remainder = 0, dataIIndex, dataJIndex;
+  size_t nIdx;
+  double maskValue = 1.0;
+  for (index = 0; index < newNbLocalDst; ++index)
+  {
+     nIdx = globalIndexSrcOnDstDomain(index);
+     it = neighborData.find(nIdx);
+     if (ite != it)
+     {
+        std::vector<double>& data = it->second;
+        // Unpack data
+        int dataIdx = 0;
+        lon_dst(index) = data[dataIdx]; ++dataIdx;
+        lat_dst(index) = data[dataIdx]; ++dataIdx;
+        for (int i = 0; i < nVertex; ++i)
+        {
+          bounds_lon_dst(i,index) = data[dataIdx]; ++dataIdx;
+        }
+        for (int i = 0; i < nVertex; ++i)
+        {
+          bounds_lat_dst(i,index) = data[dataIdx]; ++dataIdx;
+        }
+        
+        // Check whether we have x periodic. If we don't, we should mask all point at 0 and niGloDst-1
+        maskValue = data[dataIdx];
+        if (!isXPeriodic_) 
+        {
+          remainder = i_index_dst(index) % (niGloDst-1);
+          if (0 == remainder) 
+          {
+            maskValue = -1.0;
+          }
+        }
+
+        if (!isYPeriodic_) 
+        {
+          remainder = j_index_dst(index) % (njGloDst-1);
+          if (0 == remainder) 
+          {
+            maskValue = -1.0;
+          }
+        }
+
+        mask_1d_dst(index) = (1.0 == maskValue) ? true : false; ++dataIdx;
+
+        dataIIndex = (int) data[dataIdx];
+        if (!isXPeriodic_) 
+        {
+          remainder = i_index_dst(index) % (niGloDst-1);
+          if (0 == remainder) 
+          {
+            dataIIndex = -1;
+          }
+        }
+        data_i_index_dst_full(index) = dataIIndex; ++dataIdx;
+        
+        dataJIndex = (int) data[dataIdx];
+        if (!isYPeriodic_) 
+        {
+          remainder = j_index_dst(index) % (njGloDst-1);
+          if (0 == remainder) 
+          {
+            dataJIndex = -1;
+          }
+        }        
+        data_j_index_dst_full(index) = dataJIndex;
+
+        if ((0 <= data_i_index_dst_full(index)) && (0 <= data_j_index_dst_full(index)))
+        {
+          ++nbUnMaskedPointOnExtendedPart;
+        }
+     }
+  }
+
+  
+  // Finally, update data_i_index, data_j_index
+  int dataDstDim = domainDestination->data_dim;
+  data_i_index_dst.resize(nbUnMaskedPointOnExtendedPart);
+  data_j_index_dst.resize(nbUnMaskedPointOnExtendedPart); 
+  int count = 0; 
+  for (idx = 0; idx < newNbLocalDst; ++idx)
+  {
+    dataIIndex = data_i_index_dst_full(idx);
+    dataJIndex = data_j_index_dst_full(idx);
+    if ((0 <= dataIIndex) && (0 <= dataJIndex))
+    {
+      data_i_index_dst(count) = (1 == dataDstDim) ? idx : i_index_dst(idx) - i_index_dst(0);
+      data_j_index_dst(count) = (1 == dataDstDim) ? 0   : j_index_dst(idx) - j_index_dst(0);
+      ++count;
+    }
+  }
+
+  // Update data_ni, data_nj
+  
+  domainDestination->data_ni.setValue((1==dataDstDim) ? niDst * njDst : niDst);
+  domainDestination->data_nj.setValue((1==dataDstDim) ? niDst * njDst : njDst);  
+  domainDestination->data_ibegin.setValue(0);
+  domainDestination->data_jbegin.setValue(0);
+
+  // Update longitude and latitude 
+  if (niSrc == domainSource->lonvalue_1d.numElements() && njSrc == domainSource->latvalue_1d.numElements()) // Ok, we have rectilinear here
+  {
+     domainDestination->lonvalue_1d.resize(niDst);
+     domainDestination->lonvalue_1d = lon_dst(Range(0,niDst-1));
+     domainDestination->latvalue_1d.resize(njDst);
+     domainDestination->latvalue_1d = lat_dst(Range(0,lat_dst.numElements()-niDst,niDst));
+  }
+  else // It should be curvilinear
+  {
+     domainDestination->lonvalue_1d.resize(lon_dst.numElements());
+     domainDestination->lonvalue_1d = lon_dst;
+     domainDestination->latvalue_1d.resize(lat_dst.numElements());
+     domainDestination->latvalue_1d = (lat_dst);
+  }
+
 }
 
@@ -130,8 +462,9 @@
  *  \param [in] neighborsDomainSrc domain extended part
  */
-void CDomainAlgorithmExpand::updateDomainAttributes(CDomain* domainDestination,
-                                                    CDomain* domainSource,
-                                                    CArray<int,2>& neighborsDomainSrc)
-{
+void CDomainAlgorithmExpand::updateUnstructuredDomainAttributes(CDomain* domainDestination,
+                                                                CDomain* domainSource,
+                                                                CArray<int,2>& neighborsDomainSrc)
+{
+
   CContext* context = CContext::getCurrent();
   CContextClient* client=context->client;
@@ -255,5 +588,5 @@
       data[dataIdx] = bounds_lat_src(i,idx); ++dataIdx;
     }
-    data[dataIdx] = mask_1d_src(idx) ? 1.0 : -1; ++dataIdx;
+    data[dataIdx] = mask_1d_src(idx) ? 1.0 : -1.0; ++dataIdx;
     data[dataIdx] = data_i_index_src_full(idx);
   }
@@ -308,5 +641,5 @@
   {
     dataIdx = data_i_index_dst_full(idx);
-    if ((0 <= dataIdx) && (dataIdx < newNbLocalDst))
+    if ((0 <= dataIdx))
     {
       ++count;
@@ -322,5 +655,5 @@
   {
     dataIdx = data_i_index_dst_full(idx);
-    if ((0 <= dataIdx) && (dataIdx < newNbLocalDst))
+    if ((0 <= dataIdx))
     {
       data_i_index_dst(count) = dataIdx;
@@ -331,5 +664,4 @@
   // Update ni
   domainDestination->ni.setValue(newNbLocalDst);
-
 }
 
Index: /XIOS/dev/dev_olga/src/transformation/domain_algorithm_expand.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/domain_algorithm_expand.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/domain_algorithm_expand.hpp	(revision 1158)
@@ -30,9 +30,17 @@
 
 protected:
+  bool isXPeriodic_; // Flag to determine the periodicity of expansion (only for rectilinear)
+  bool isYPeriodic_; // Flag to determine the periodicity of expansion (only for rectilinear)
+
+protected:
   void expandDomainEdgeConnectivity(CDomain* domainDestination, CDomain* domainSource);
   void expandDomainNodeConnectivity(CDomain* domainDestination, CDomain* domainSource);
-  void updateDomainAttributes(CDomain* domainDestination,
-                              CDomain* domainSource,
-                              CArray<int,2>& neighborsDomainSrc);
+  void updateRectilinearDomainAttributes(CDomain* domainDestination,
+                                         CDomain* domainSource,
+                                         CArray<int,2>& neighborsDomainSrc);
+
+  void updateUnstructuredDomainAttributes(CDomain* domainDestination,
+                                          CDomain* domainSource,
+                                          CArray<int,2>& neighborsDomainSrc);
 
 protected:
Index: /XIOS/dev/dev_olga/src/transformation/domain_algorithm_generate_rectilinear.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/domain_algorithm_generate_rectilinear.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/domain_algorithm_generate_rectilinear.cpp	(revision 1158)
@@ -127,5 +127,7 @@
 void CDomainAlgorithmGenerateRectilinear::fillInAttributesDomainDestination()
 {
-  domainDest_->redistribute(nbDomainDistributedPart_);
+  if (!domainDest_->distributionAttributesHaveValue())
+    domainDest_->redistribute(nbDomainDistributedPart_);
+  domainDest_->fillInLonLat();
 }
 
Index: /XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.cpp	(revision 1158)
@@ -100,7 +100,11 @@
   int orderInterp = interpDomain_->order.getValue();
   bool renormalize ;
+  bool quantity ;
 
   if (interpDomain_->renormalize.isEmpty()) renormalize=true;
   else renormalize = interpDomain_->renormalize;
+
+  if (interpDomain_->quantity.isEmpty()) quantity=false;
+  else quantity = interpDomain_->quantity;
 
   const double poleValue = 90.0;
@@ -342,5 +346,5 @@
   mapper.setTargetMesh(boundsLonDestUnmasked.dataFirst(), boundsLatDestUnmasked.dataFirst(), nVertexDest, nDstLocalUnmasked, &dstPole[0], globalDstUnmasked);
 
-  std::vector<double> timings = mapper.computeWeights(orderInterp,renormalize);
+  std::vector<double> timings = mapper.computeWeights(orderInterp,renormalize,quantity);
 
   std::map<int,std::vector<std::pair<int,double> > > interpMapValue;
@@ -677,9 +681,9 @@
 /*! Redefined some functions of CONetCDF4 to make use of them */
 CDomainAlgorithmInterpolate::WriteNetCdf::WriteNetCdf(const StdString& filename, const MPI_Comm comm)
-  : CNc4DataOutput(filename, false, false, true, comm, false, true) {}
+  : CNc4DataOutput(NULL, filename, false, false, true, comm, false, true) {}
 int CDomainAlgorithmInterpolate::WriteNetCdf::addDimensionWrite(const StdString& name, 
                                                                 const StdSize size)
 {
-  CONetCDF4::addDimension(name, size);  
+  return CONetCDF4::addDimension(name, size);  
 }
 
@@ -687,5 +691,10 @@
                                                                const std::vector<StdString>& dim)
 {
-  CONetCDF4::addVariable(name, type, dim);
+  return CONetCDF4::addVariable(name, type, dim);
+}
+
+void CDomainAlgorithmInterpolate::WriteNetCdf::endDefinition()
+{
+  CONetCDF4::definition_end();
 }
 
@@ -751,10 +760,17 @@
   MPI_Scan(&localNbWeight, &startIndex, 1, MPI_LONG, MPI_SUM, client->intraComm);
   
+  if (0 == globalNbWeight)
+  {
+    info << "There is no interpolation weights calculated between "
+         << "domain source: " << domainSrc_->getDomainOutputName()
+         << " and domain destination: " << domainDest_->getDomainOutputName()
+         << std::endl;
+    return;
+  }
+
   std::vector<StdSize> start(1, startIndex - localNbWeight);
   std::vector<StdSize> count(1, localNbWeight);
-
-  WriteNetCdf netCdfWriter(filename, client->intraComm);
-
-  // netCdfWriter = CONetCDF4(filename, false, false, true, client->intraComm, false);
+  
+  WriteNetCdf netCdfWriter(filename, client->intraComm);  
 
   // Define some dimensions
@@ -770,8 +786,14 @@
   netCdfWriter.addVariableWrite("weight", NC_DOUBLE, dims);
 
+  // End of definition
+  netCdfWriter.endDefinition();
+
   // // Write variables
-  netCdfWriter.writeDataIndex(src_idx, "src_idx", true, 0, &start, &count);
-  netCdfWriter.writeDataIndex(dst_idx, "dst_idx", true, 0, &start, &count);
-  netCdfWriter.writeDataIndex(weights, "weight", true, 0, &start, &count);
+  if (0 != localNbWeight)
+  {
+    netCdfWriter.writeDataIndex(src_idx, "src_idx", false, 0, &start, &count);
+    netCdfWriter.writeDataIndex(dst_idx, "dst_idx", false, 0, &start, &count);
+    netCdfWriter.writeDataIndex(weights, "weight", false, 0, &start, &count);
+  }
 
   netCdfWriter.closeFile();
Index: /XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.hpp	(revision 1158)
@@ -59,4 +59,5 @@
     int addVariableWrite(const StdString& name, nc_type type,
                          const std::vector<StdString>& dim);
+    void endDefinition();
     void writeDataIndex(const CArray<int,1>& data, const StdString& name,
                         bool collective, StdSize record,
Index: /XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.cpp	(revision 1158)
@@ -11,4 +11,5 @@
 #include "context_client.hpp"
 #include "client_client_dht_template.hpp"
+#include "utils.hpp"
 
 namespace xios {
@@ -29,13 +30,13 @@
                                             CArray<double,1>& dataOut,
                                             std::vector<bool>& flagInitial,
-                                            const double& defaultValue)
-{
-  int nbLocalIndex = localIndex.size();
-  bool hasMissingValue = (0.0 != defaultValue) ? true : false;
-  if (hasMissingValue)
+                                            bool ignoreMissingValue)
+{
+  int nbLocalIndex = localIndex.size();   
+  double defaultValue = std::numeric_limits<double>::quiet_NaN();
+  if (ignoreMissingValue)
   {
     for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      if (defaultValue == *(dataInput + idx))
+      if (NumTraits<double>::isnan(*(dataInput + idx)))
       {
         flagInitial[localIndex[idx].first] = false;
@@ -47,9 +48,9 @@
     }
 
-    for (int idx = 0; idx < nbLocalIndex; ++idx)
-    {
-      if (!flagInitial[localIndex[idx].first])
-        dataOut(localIndex[idx].first) = defaultValue;
-    }
+    // for (int idx = 0; idx < nbLocalIndex; ++idx)
+    // {
+    //   if (!flagInitial[localIndex[idx].first])
+    //     dataOut(localIndex[idx].first) = defaultValue;
+    // }
   }
   else
Index: /XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.hpp	(revision 1158)
@@ -63,10 +63,11 @@
     \param [in/out] dataOut Array contains local data
     \param [in/out] flagInitial vector of boolean to mark the local index already initialized. True means there is a need for initalization
+    \param [in] ignoreMissingValue don't count missing value in operation if this flag is true
   */
   virtual void apply(const std::vector<std::pair<int,double> >& localIndex,
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial,
-                     const double& defaultValue);
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue);
 
   /*!
Index: /XIOS/dev/dev_olga/src/transformation/grid_transformation.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/grid_transformation.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/grid_transformation.cpp	(revision 1158)
@@ -236,6 +236,5 @@
   }
 
-  tmpGridDestination_ = CGrid::createGrid(domainDst, axisDst, scalarDst, elementOrder);
-  tmpGridDestination_->computeGridGlobalDimension(domainDst, axisDst, scalarDst, elementOrder);
+  tmpGridDestination_ = CGrid::createGrid(domainDst, axisDst, scalarDst, elementOrder);  
   tempGridDests_.push_back(tmpGridDestination_);
 }
@@ -322,6 +321,5 @@
   }
 
-  gridSource_ = CGrid::createGrid(domainSrc, axisSrc, scalarSrc, tmpGridDestination_->axis_domain_order);
-  gridSource_->computeGridGlobalDimension(domainSrc, axisSrc, scalarSrc, tmpGridDestination_->axis_domain_order);
+  gridSource_ = CGrid::createGrid(domainSrc, axisSrc, scalarSrc, tmpGridDestination_->axis_domain_order);  
 
   tempGridSrcs_.push_back(gridSource_);
Index: /XIOS/dev/dev_olga/src/transformation/grid_transformation_selector.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/grid_transformation_selector.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/grid_transformation_selector.cpp	(revision 1158)
@@ -202,6 +202,7 @@
 
     // If source and destination grid share the same scalar
-    if ((-1 != scalarDstPos) && (-1 != scalarSrcPos) &&
-        (scalarListDestP[scalarDstPos] == scalarListSrcP[scalarSrcPos]) && !isSameGrid_) return;
+    if ((-1 != scalarDstPos) && (-1 != scalarSrcPos)  && !isSameGrid_ &&
+        ((scalarListDestP[scalarDstPos] == scalarListSrcP[scalarSrcPos]) ||
+         (scalarListDestP[scalarDstPos]->isEqual(scalarListSrcP[scalarSrcPos])))) return;
 
     if (scalarListDestP[scalarDstPos]->hasTransformation())
@@ -242,6 +243,7 @@
 
     // If source and destination grid share the same axis
-    if ((-1 != axisDstPos) && (-1 != axisSrcPos) &&
-        (axisListDestP[axisDstPos] == axisListSrcP[axisSrcPos]) && !isSameGrid_) return;
+    if ((-1 != axisDstPos) && (-1 != axisSrcPos) && !isSameGrid_ &&
+        ((axisListDestP[axisDstPos] == axisListSrcP[axisSrcPos]) ||
+         (axisListDestP[axisDstPos]->isEqual(axisListSrcP[axisSrcPos]))) ) return;
 
     if (axisListDestP[axisDstPos]->hasTransformation())
@@ -281,6 +283,7 @@
 
     // If source and destination grid share the same domain
-    if ((-1 != domDstPos) && (-1 != domSrcPos) &&
-        (domListDestP[domDstPos] == domListSrcP[domSrcPos]) && !isSameGrid_) return;
+    if ((-1 != domDstPos) && (-1 != domSrcPos) && !isSameGrid_ &&
+        ((domListDestP[domDstPos] == domListSrcP[domSrcPos]) ||
+         (domListDestP[domDstPos]->isEqual(domListSrcP[domSrcPos])))) return;
 
     if (domListDestP[domDstPos]->hasTransformation())
Index: /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_extract_axis.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_extract_axis.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_extract_axis.cpp	(revision 1158)
@@ -55,8 +55,8 @@
                                          const double* dataInput,
                                          CArray<double,1>& dataOut,
-                                         std::vector<bool>& flagInitial,
-                                         const double& defaultValue)
+                                         std::vector<bool>& flagInitial,                     
+                                         bool ignoreMissingValue)
 {
-  reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
+  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue);
 }
 
Index: /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_extract_axis.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_extract_axis.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_extract_axis.hpp	(revision 1158)
@@ -32,6 +32,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial,
-                     const double& defaultValue);
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue);
 
   virtual ~CScalarAlgorithmExtractAxis();
Index: /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_axis.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_axis.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_axis.cpp	(revision 1158)
@@ -88,7 +88,7 @@
                                          CArray<double,1>& dataOut,
                                          std::vector<bool>& flagInitial,
-                                         const double& defaultValue)
+				       bool ignoreMissingValue)
 {
-  reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
+  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue);
 }
 
Index: /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_axis.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_axis.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_axis.hpp	(revision 1158)
@@ -33,5 +33,5 @@
                      CArray<double,1>& dataOut,
                      std::vector<bool>& flagInitial,
-                     const double& defaultValue);
+                     bool ignoreMissingValue);
 
   virtual void updateData(CArray<double,1>& dataOut);
Index: /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_domain.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_domain.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_domain.cpp	(revision 1158)
@@ -81,8 +81,8 @@
                                          const double* dataInput,
                                          CArray<double,1>& dataOut,
-                                         std::vector<bool>& flagInitial,
-                                         const double& defaultValue)
+                                         std::vector<bool>& flagInitial,                     
+                                         bool ignoreMissingValue)
 {
-  reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
+  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue);
 }
 
Index: /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_domain.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_domain.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/transformation/scalar_algorithm_reduce_domain.hpp	(revision 1158)
@@ -32,6 +32,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial,
-                     const double& defaultValue);
+                     std::vector<bool>& flagInitial,                     
+                     bool ignoreMissingValue);
 
   virtual void updateData(CArray<double,1>& dataOut);
Index: /XIOS/dev/dev_olga/src/type/enum.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/enum.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/enum.hpp	(revision 1158)
@@ -100,5 +100,5 @@
     __INLINE__ const CEnum_ref& operator = (const CEnum_ref& val) const;
     __INLINE__ operator T_enum&() const;
-    bool operator == (const CEnum_ref &other) {return this->get()==other.get() ;}
+    
 
     inline virtual CBaseType* clone(void) const   { return _clone(); }
@@ -134,4 +134,13 @@
   } ;
   
+  template <typename T> bool operator== (const CEnum<T>& lhs, const typename T::t_enum& rhs);
+  template <typename T> bool operator== (const typename T::t_enum& lhs, const CEnum<T>& rhs);
+  template <typename T> bool operator== (const CEnum<T>& lhs, const CEnum<T>& rhs);  
+  template <typename T> bool operator== (const CEnum_ref<T>& lhs, const CEnum_ref<T>& rhs);
+  template <typename T> bool operator== (const CEnum_ref<T>& lhs, const typename T::t_enum& rhs);
+  template <typename T> bool operator== (const typename T::t_enum& lhs, const CEnum_ref<T>& rhs);
+  template <typename T> bool operator== (const CEnum<T>& lhs, const CEnum_ref<T>& rhs) {return (lhs.get() == rhs.get());}
+  template <typename T> bool operator== (const CEnum_ref<T>& lhs, const CEnum<T>& rhs) {return (rhs == lhs); }
+
   template <typename T> __INLINE__ CBufferOut& operator<<(CBufferOut& buffer, const CEnum<T>& type) ;
   template <typename T> __INLINE__ CBufferOut& operator<<(CBufferOut& buffer, const typename T::t_enum & type) ;  
Index: /XIOS/dev/dev_olga/src/type/enum_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/enum_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/enum_impl.hpp	(revision 1158)
@@ -249,6 +249,27 @@
                      << "Enum is not initialized.");
   }  
-
-  
+  
+  template <typename T> 
+  bool operator== (const CEnum<T>& lhs, const typename T::t_enum& rhs)
+  {
+     if (lhs.isEmpty()) return false;
+     return (lhs.get() == rhs);
+  }
+
+  template <typename T> 
+  bool operator== (const typename T::t_enum& lhs, const CEnum<T>& rhs)
+  {
+    return rhs == lhs;
+  }
+
+  template <typename T> 
+  bool operator== (const CEnum<T>& lhs, const CEnum<T>& rhs)
+  {
+    if ((lhs.isEmpty() && !rhs.isEmpty()) || (!lhs.isEmpty() && rhs.isEmpty())) return false;
+    if (lhs.isEmpty() && rhs.isEmpty()) return true;
+    return (lhs.get() == rhs.get());
+  }
+
+
   template <typename T>
   CBufferOut& operator<<(CBufferOut& buffer, const CEnum<T>& type)
Index: /XIOS/dev/dev_olga/src/type/enum_ref_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/enum_ref_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/enum_ref_impl.hpp	(revision 1158)
@@ -263,5 +263,24 @@
   }
                      
-
+  template <typename T> 
+  bool operator== (const CEnum_ref<T>& lhs, const typename T::t_enum& rhs)
+  {
+     if (lhs.isEmpty()) return false;
+     return (lhs.get() == rhs);
+  }
+
+  template <typename T> 
+  bool operator== (const typename T::t_enum& lhs, const CEnum_ref<T>& rhs)
+  {
+    return rhs == lhs;
+  }
+
+  template <typename T> 
+  bool operator== (const CEnum_ref<T>& lhs, const CEnum_ref<T>& rhs)
+  {
+    if ((lhs.isEmpty() && !rhs.isEmpty()) || (!lhs.isEmpty() && rhs.isEmpty())) return false;
+    if (lhs.isEmpty() && rhs.isEmpty()) return true;
+    return (lhs.get() == rhs.get());
+  }
   
   template <typename T>
Index: /XIOS/dev/dev_olga/src/type/message.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/message.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/message.cpp	(revision 1158)
@@ -27,6 +27,5 @@
      size_t retSize=0 ;
      
-     for(it=typeList.begin();it!=typeList.end();it++)
-    	 retSize+=(*it)->size() ;
+     for(it=typeList.begin();it!=typeList.end();it++) retSize+=(*it)->size() ;
      return retSize ;
    }
Index: /XIOS/dev/dev_olga/src/type/type.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/type.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/type.hpp	(revision 1158)
@@ -94,5 +94,5 @@
     const CType_ref& operator = (CType<T>& val) const ;
     const CType_ref& operator = (const CType_ref& val) const;
-    operator T&() const;
+    operator T&() const;    
 
     inline virtual CBaseType* clone(void) const   { return _clone(); }
@@ -127,4 +127,25 @@
     size_t _size(void) const ;
   } ;
+
+  template <typename T> bool operator==(const CType<T>& lhs, const T& rhs);   
+  template <typename T> bool operator==(const T& lhs, const CType<T>& rhs);   
+  template <typename T> bool operator==(const CType_ref<T>& lhs, const T& rhs);   
+  template <typename T> bool operator==(const T& lhs, const CType_ref<T>& rhs); 
+  template <typename T> bool operator==(const CType<T>& lhs, const CType<T>& rhs); 
+  template <typename T> bool operator==(const CType_ref<T>& lhs, const CType_ref<T>& rhs); 
+
+  template <typename T>
+  bool operator==(const CType_ref<T>& lhs, const CType<T>& rhs)
+  {
+    if ((lhs.isEmpty() && !rhs.isEmpty()) || (!lhs.isEmpty() && rhs.isEmpty())) return false;
+    if (lhs.isEmpty() && rhs.isEmpty()) return true;
+    return (*lhs.ptrValue == *rhs.ptrValue);
+  } 
+
+  template <typename T>
+  bool operator==(const CType<T>& lhs, const CType_ref<T>& rhs)
+  {
+    return (rhs == lhs);
+  }
 
 
Index: /XIOS/dev/dev_olga/src/type/type_decl.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/type_decl.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/type_decl.cpp	(revision 1158)
@@ -12,15 +12,23 @@
   template class CType<decl_type> ; \
   template class CType_ref<decl_type> ; \
-  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, const CType<decl_type>& type) ; \
-  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, const CType_ref<decl_type>& type) ; \
-  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, decl_type& type) ; \
-  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, const decl_type& type) ; \
-  template CBufferIn& operator>> <decl_type> (CBufferIn& buffer, CType<decl_type>& type) ; \
-  template CBufferIn& operator>> <decl_type> (CBufferIn& buffer, const CType_ref<decl_type>& type) ; \
-  template CBufferIn& operator>> <decl_type> (CBufferIn& buffer, decl_type& type) ; \
-/*  template CMessage& operator<< <decl_type> (CMessage& msg, const CType<decl_type>& type) ;*/ \
-/*  template CMessage& operator<< <decl_type> (CMessage& msg, const CType_ref<decl_type>& type) ;*/ \
-  template CMessage& operator<< <decl_type> (CMessage& msg, const decl_type& type) ; \
-  template CMessage& operator<< <decl_type> (CMessage& msg, decl_type& type) ;
+  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, const CType<decl_type>& type) ;       \
+  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, const CType_ref<decl_type>& type) ;   \
+  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, decl_type& type) ;                    \
+  template CBufferOut& operator<< <decl_type> (CBufferOut& buffer, const decl_type& type) ;              \
+  template CBufferIn& operator>> <decl_type> (CBufferIn& buffer, CType<decl_type>& type) ;               \
+  template CBufferIn& operator>> <decl_type> (CBufferIn& buffer, const CType_ref<decl_type>& type) ;     \
+  template CBufferIn& operator>> <decl_type> (CBufferIn& buffer, decl_type& type) ;                      \
+/*  template CMessage& operator<< <decl_type> (CMessage& msg, const CType<decl_type>& type) ;*/          \
+/*  template CMessage& operator<< <decl_type> (CMessage& msg, const CType_ref<decl_type>& type) ;*/      \
+  template CMessage& operator<< <decl_type> (CMessage& msg, const decl_type& type) ;                     \
+  template CMessage& operator<< <decl_type> (CMessage& msg, decl_type& type) ;                           \
+  template bool operator==(const CType<decl_type>& lhs, const decl_type& rhs);                           \
+  template bool operator==(const decl_type& lhs, const CType<decl_type>& rhs);                           \
+  template bool operator==(const CType_ref<decl_type>& lhs, const decl_type& rhs);                       \
+  template bool operator==(const decl_type& lhs, const CType_ref<decl_type>& rhs);                       \
+  template bool operator==(const CType_ref<decl_type>& lhs, const CType<decl_type>& rhs);                \
+  template bool operator==(const CType<decl_type>& lhs, const CType_ref<decl_type>& rhs);                \
+  template bool operator==(const CType<decl_type>& lhs, const CType<decl_type>& rhs);                    \
+  template bool operator==(const CType_ref<decl_type>& lhs, const CType_ref<decl_type>& rhs);    
   
   macro(string)
Index: /XIOS/dev/dev_olga/src/type/type_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/type_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/type_impl.hpp	(revision 1158)
@@ -211,4 +211,25 @@
   }
 
+  template <typename T>
+  bool operator==(const CType<T>& lhs, const T& rhs)
+  {
+    if (lhs.isEmpty()) return false;
+    return (*lhs.ptrValue == rhs);    
+  }
+
+  template <typename T>
+  bool operator==(const T& lhs, const CType<T>& rhs)
+  {
+    return (rhs == lhs);
+  }
+
+  template <typename T>
+  bool operator==(const CType<T>& lhs, const CType<T>& rhs)
+  {
+    if ((lhs.isEmpty() && !rhs.isEmpty()) || (!lhs.isEmpty() && rhs.isEmpty())) return false;
+    if (lhs.isEmpty() && rhs.isEmpty()) return true;
+    
+    return (*lhs.ptrValue == *rhs.ptrValue);
+  }
 
   template <typename T>
Index: /XIOS/dev/dev_olga/src/type/type_ref_impl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/type/type_ref_impl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/type/type_ref_impl.hpp	(revision 1158)
@@ -201,5 +201,25 @@
   }
                      
-
+  template <typename T>
+  bool operator==(const CType_ref<T>& lhs, const T& rhs)
+  {
+    if (lhs.isEmpty()) return false;
+    return (*lhs.ptrValue == rhs);    
+  }
+
+  template <typename T>
+  bool operator==(const T& lhs, const CType_ref<T>& rhs)
+  {
+    return (rhs == lhs);
+  }
+
+  template <typename T>
+  bool operator==(const CType_ref<T>& lhs, const CType_ref<T>& rhs)
+  {
+    if ((lhs.isEmpty() && !rhs.isEmpty()) || (!lhs.isEmpty() && rhs.isEmpty())) return false;
+    if (lhs.isEmpty() && rhs.isEmpty()) return true;
+    
+    return (*lhs.ptrValue == *rhs.ptrValue);
+  }
   
   template <typename T>
Index: /XIOS/dev/dev_olga/src/utils.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/utils.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/utils.hpp	(revision 1158)
@@ -257,4 +257,7 @@
     return 1e-12;
   }
+  static inline bool isnan(const Scalar& v) {
+    return (v != v);
+  }
 };
 
Index: /XIOS/dev/dev_olga/src/xios_server.f90
===================================================================
--- /XIOS/dev/dev_olga/src/xios_server.f90	(revision 1157)
+++ /XIOS/dev/dev_olga/src/xios_server.f90	(revision 1158)
@@ -4,6 +4,6 @@
   INCLUDE "mpif.h"
   INTEGER :: ierr
+  
+    CALL xios_init_server
 
-  CALL xios_init_server
-
-END PROGRAM server_main
+  END PROGRAM server_main
Index: /XIOS/dev/dev_olga/src/xios_spl.hpp
===================================================================
--- /XIOS/dev/dev_olga/src/xios_spl.hpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/xios_spl.hpp	(revision 1158)
@@ -52,4 +52,6 @@
 typedef  unsigned long int    ulong;
 
+const size_t stringArrayLen=255 ;
+
 /// XIOS headers ///
 #include "configure.hpp"
Index: /XIOS/dev/dev_olga/src/xml_parser.cpp
===================================================================
--- /XIOS/dev/dev_olga/src/xml_parser.cpp	(revision 1157)
+++ /XIOS/dev/dev_olga/src/xml_parser.cpp	(revision 1158)
@@ -70,16 +70,8 @@
                   CContext::setCurrent(attributes["id"]) ;
 
-                  bool hasctxt = CContext::has(attributes["id"]);
-
-                  if(hasctxt)
-                  {
-                     DEBUG("The context will not be processed because it exist an other context with the same id" );
-                     continue;
-                  }
 
                   if (isParseAll)
                   {
                     CContext* context = CContext::create(attributes["id"]);
-//                  if (!hasctxt)  group_context->addChild(context);
                     context->parse(node);
 
@@ -92,5 +84,4 @@
                     {
                       CContext* context = CContext::create(*it);
-  //                  if (!hasctxt)  group_context->addChild(context);
                       context->parse(node);
 
