Index: XIOS/trunk/src/node/axis.cpp
===================================================================
--- XIOS/trunk/src/node/axis.cpp	(revision 1105)
+++ XIOS/trunk/src/node/axis.cpp	(revision 1106)
@@ -977,4 +977,33 @@
   }
 
+  /*!
+    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)
+  {
+    bool objEqual = SuperClass::isEqual(obj);
+    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)
   {
@@ -996,18 +1025,4 @@
   {
     return transformationMap_;
-  }
-
-  /*!
-    Check the validity of all transformations applied on axis
-  This functions is called AFTER all inherited attributes are solved
-  */
-  void CAxis::checkTransformations()
-  {
-    TransMapTypes::const_iterator itb = transformationMap_.begin(), it,
-                                  ite = transformationMap_.end();
-//    for (it = itb; it != ite; ++it)
-//    {
-//      (it->second)->checkValid(this);
-//    }
   }
 
Index: XIOS/trunk/src/node/axis.hpp
===================================================================
--- XIOS/trunk/src/node/axis.hpp	(revision 1105)
+++ XIOS/trunk/src/node/axis.hpp	(revision 1106)
@@ -117,4 +117,5 @@
          void duplicateTransformation(CAxis*);
          CTransformation<CAxis>* addTransformation(ETranformationType transType, const StdString& id="");
+         bool isEqual(CAxis* axis);
 
       public:
@@ -131,6 +132,5 @@
          void checkZoom();
          void checkBounds();
-         void checkLabel();
-         void checkTransformations();
+         void checkLabel();         
          void sendValue();
          void computeConnectedServer(const std::vector<int>& globalDim, int orderPositionInGrid,
Index: XIOS/trunk/src/node/domain.cpp
===================================================================
--- XIOS/trunk/src/node/domain.cpp	(revision 1105)
+++ XIOS/trunk/src/node/domain.cpp	(revision 1106)
@@ -2238,4 +2238,33 @@
   }
 
+  /*!
+    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)
+  {
+    bool objEqual = SuperClass::isEqual(obj);
+    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<CDomain>* CDomain::addTransformation(ETranformationType transType, const StdString& id)
   {
@@ -2269,18 +2298,4 @@
   {
     return transformationMap_;
-  }
-
-  /*!
-    Check the validity of all transformations applied on domain
-  This functions is called AFTER all inherited attributes are solved
-  */
-  void CDomain::checkTransformations()
-  {
-    TransMapTypes::const_iterator itb = transformationMap_.begin(), it,
-                                  ite = transformationMap_.end();
-//    for (it = itb; it != ite; ++it)
-//    {
-//      (it->second)->checkValid(this);
-//    }
   }
 
Index: XIOS/trunk/src/node/domain.hpp
===================================================================
--- XIOS/trunk/src/node/domain.hpp	(revision 1105)
+++ XIOS/trunk/src/node/domain.hpp	(revision 1106)
@@ -124,4 +124,5 @@
 
          std::vector<int> getNbGlob();
+         bool isEqual(CDomain* domain);
       public:
          /// Mutateur ///
@@ -132,5 +133,6 @@
          void sendLonLatArea(void);
          void computeConnectedServer(void) ;
-
+         void computeLocalMask(void) ;
+         
          void AllgatherRectilinearLonLat(CArray<double,1>& lon, CArray<double,1>& lat,
                                          CArray<double,1>& lon_g, CArray<double,1>& lat_g);
@@ -181,8 +183,6 @@
          void checkArea(void);
          void checkLonLat();
-         void checkZoom(void);
-         void computeLocalMask(void) ;
-
-         void checkTransformations();
+         void checkZoom(void);    
+         
          void setTransformations(const TransMapTypes&);
          void computeNGlobDomain();
Index: XIOS/trunk/src/node/scalar.cpp
===================================================================
--- XIOS/trunk/src/node/scalar.cpp	(revision 1105)
+++ XIOS/trunk/src/node/scalar.cpp	(revision 1106)
@@ -65,4 +65,33 @@
   }
 
+  /*!
+    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)
+  {
+    bool objEqual = SuperClass::isEqual(obj);
+    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<CScalar>* CScalar::addTransformation(ETranformationType transType, const StdString& id)
   {
@@ -84,18 +113,4 @@
   {
     return transformationMap_;
-  }
-
-  /*!
-    Check the validity of all transformations applied on scalar
-  This functions is called AFTER all inherited attributes are solved
-  */
-  void CScalar::checkTransformations()
-  {
-    TransMapTypes::const_iterator itb = transformationMap_.begin(), it,
-                                  ite = transformationMap_.end();
-//    for (it = itb; it != ite; ++it)
-//    {
-//      (it->second)->checkValid(this);
-//    }
   }
 
Index: XIOS/trunk/src/node/scalar.hpp
===================================================================
--- XIOS/trunk/src/node/scalar.hpp	(revision 1105)
+++ XIOS/trunk/src/node/scalar.hpp	(revision 1106)
@@ -76,11 +76,11 @@
            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 checkTransformations();
+         private:           
             void setTransformations(const TransMapTypes&);
 
Index: XIOS/trunk/src/transformation/grid_transformation_selector.cpp
===================================================================
--- XIOS/trunk/src/transformation/grid_transformation_selector.cpp	(revision 1105)
+++ XIOS/trunk/src/transformation/grid_transformation_selector.cpp	(revision 1106)
@@ -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())
