Index: XIOS/dev/dev_olga/src/node/domain.cpp
===================================================================
--- XIOS/dev/dev_olga/src/node/domain.cpp	(revision 1168)
+++ XIOS/dev/dev_olga/src/node/domain.cpp	(revision 1173)
@@ -2463,8 +2463,7 @@
     }
     
+    globalLocalIndexMap_.rehash(std::ceil(nbIndGlob/globalLocalIndexMap_.max_load_factor()));
     i_index.resize(nbIndGlob);
-    j_index.resize(nbIndGlob);
-
-    globalLocalIndexMap_.rehash(std::ceil(nbIndGlob/globalLocalIndexMap_.max_load_factor()));
+    j_index.resize(nbIndGlob);    
     nbIndGlob = 0;
     for (i = 0; i < nbReceived; ++i)
@@ -2474,10 +2473,16 @@
       {
          index = tmp(ind);
-         i_index(nbIndGlob) = index % ni_glo;
-         j_index(nbIndGlob) = index / ni_glo;
-         globalLocalIndexMap_[index] = nbIndGlob;  
-         ++nbIndGlob;
+         if (0 == globalLocalIndexMap_.count(index))
+         {
+           i_index(nbIndGlob) = index % ni_glo;
+           j_index(nbIndGlob) = index / ni_glo;
+           globalLocalIndexMap_[index] = nbIndGlob;  
+           ++nbIndGlob;
+         } 
       } 
     } 
+
+    i_index.resizeAndPreserve(nbIndGlob);
+    j_index.resizeAndPreserve(nbIndGlob);
   }
 
@@ -2630,7 +2635,7 @@
   void CDomain::recvMask(std::map<int, CBufferIn*>& rankBuffers)
   {
-    int nbReceived = rankBuffers.size(), i, ind, index;
+    int nbReceived = rankBuffers.size(), i, ind, index, lInd;
     if (nbReceived != recvClientRanks_.size())
-      ERROR("void CDomain::recvArea(std::map<int, CBufferIn*>& rankBuffers)",
+      ERROR("void CDomain::recvMask(std::map<int, CBufferIn*>& rankBuffers)",
            << "The number of sending clients is not correct."
            << "Expected number: " << recvClientRanks_.size() << " but received " << nbReceived);
@@ -2650,13 +2655,19 @@
     }
   
+    if (nbMaskInd != globalLocalIndexMap_.size())
+      info (0) << "If the domain " << this->getDomainOutputName() <<" does not have overlapped region between processes."
+               << "Something shouble be wrong with mask index "<< std::endl;
+
+    nbMaskInd = globalLocalIndexMap_.size();
     mask_1d.resize(nbMaskInd);
-    nbMaskInd = 0;
+    
     for (i = 0; i < nbReceived; ++i)
     {
+      CArray<int,1>& tmpInd = indGlob_[recvClientRanks_[i]];
       CArray<bool,1>& tmp = recvMaskValue[i];
       for (ind = 0; ind < tmp.numElements(); ++ind)
       {
-        mask_1d(nbMaskInd) = tmp(ind);      
-        ++nbMaskInd;
+        lInd = globalLocalIndexMap_[size_t(tmpInd(ind))];
+        mask_1d(lInd) = tmp(ind);
       }
     }    
@@ -2717,6 +2728,8 @@
     
       if (nbLonInd != globalLocalIndexMap_.size())
-        info (0) << "Something wrong with longitude index "<< std::endl;
-
+        info (0) << "If the domain " << this->getDomainOutputName() <<" does not have overlapped region between processes."
+                 << "Something shouble be wrong with longitude index "<< std::endl;
+
+      nbLonInd = globalLocalIndexMap_.size();
       lonvalue.resize(nbLonInd);
       if (hasBounds)
@@ -2799,6 +2812,8 @@
     
       if (nbLatInd != globalLocalIndexMap_.size())
-        info (0) << "Something wrong with latitude index "<< std::endl;
-
+        info (0) << "If the domain " << this->getDomainOutputName() <<" does not have overlapped region between processes."
+                << "Something shouble be wrong with latitude index "<< std::endl;
+
+      nbLatInd = globalLocalIndexMap_.size();
       latvalue.resize(nbLatInd);
       if (hasBounds)
@@ -2870,15 +2885,17 @@
     }
 
-    int nbAreaInd = 0;
-    for (i = 0; i < nbReceived; ++i)
-    {      
-      nbAreaInd += recvAreaValue[i].numElements();
-    }
-  
-    if (nbAreaInd != globalLocalIndexMap_.size())
-      info (0) << "Something wrong with latitude index "<< std::endl;
-
     if (hasArea)
     {
+      int nbAreaInd = 0;
+      for (i = 0; i < nbReceived; ++i)
+      {      
+        nbAreaInd += recvAreaValue[i].numElements();
+      }
+
+      if (nbAreaInd != globalLocalIndexMap_.size())
+        info (0) << "If the domain " << this->getDomainOutputName() <<" does not have overlapped region between processes."
+                 << "Something shouble be wrong with area index "<< std::endl;
+
+      nbAreaInd = globalLocalIndexMap_.size();
       areavalue.resize(nbAreaInd);
       nbAreaInd = 0;      
@@ -2988,6 +3005,6 @@
       {
          lInd = globalLocalIndexMap_[size_t(tmpInd(ind))];
-         dataIIndex(lInd) = tmpI(ind);
-         dataJIndex(lInd) = tmpJ(ind);         
+         dataIIndex(lInd) = (-1 == dataIIndex(lInd)) ? tmpI(ind) : dataIIndex(lInd); // Only fill in dataIndex if there is no data
+         dataJIndex(lInd) = (-1 == dataJIndex(lInd)) ? tmpJ(ind) : dataJIndex(lInd);         
       } 
     }
Index: XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.cpp
===================================================================
--- XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.cpp	(revision 1168)
+++ XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.cpp	(revision 1173)
@@ -388,7 +388,7 @@
   }
 
-  if (writeToFile_ && !readFromFile_)
-     writeRemapInfo(interpMapValue);
-  exchangeRemapInfo(interpMapValue);
+  if (writeToFile_ && !readFromFile_) writeRemapInfo(interpMapValue);
+//  exchangeRemapInfo(interpMapValue);
+  convertRemapInfo(interpMapValue) ;
 
   delete [] globalSrc;
@@ -494,4 +494,29 @@
 }
 
+void CDomainAlgorithmInterpolate::convertRemapInfo(std::map<int,std::vector<std::pair<int,double> > >& interpMapValue)
+{
+  CContext* context = CContext::getCurrent();
+  CContextClient* client=context->client;
+  int clientRank = client->clientRank;
+
+  this->transformationMapping_.resize(1);
+  this->transformationWeight_.resize(1);
+
+  TransformationIndexMap& transMap = this->transformationMapping_[0];
+  TransformationWeightMap& transWeight = this->transformationWeight_[0];
+
+  std::map<int,std::vector<std::pair<int,double> > >::const_iterator itb = interpMapValue.begin(), it,
+                                                                     ite = interpMapValue.end();
+  
+  for (it = itb; it != ite; ++it)
+  {    
+    const std::vector<std::pair<int,double> >& tmp = it->second;
+    for (int i = 0; i < tmp.size(); ++i)
+    {
+      transMap[it->first].push_back(tmp[i].first);
+      transWeight[it->first].push_back(tmp[i].second);
+    }      
+  }      
+}
 
 /*!
Index: XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.hpp
===================================================================
--- XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.hpp	(revision 1168)
+++ XIOS/dev/dev_olga/src/transformation/domain_algorithm_interpolate.hpp	(revision 1173)
@@ -44,4 +44,5 @@
   void writeRemapInfo(std::map<int,std::vector<std::pair<int,double> > >&);
   void exchangeRemapInfo(std::map<int,std::vector<std::pair<int,double> > >& interpMapValue);
+  void convertRemapInfo(std::map<int,std::vector<std::pair<int,double> > >& interpMapValue);
 
 private:
Index: XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.cpp
===================================================================
--- XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.cpp	(revision 1168)
+++ XIOS/dev/dev_olga/src/transformation/generic_algorithm_transformation.cpp	(revision 1173)
@@ -45,12 +45,13 @@
       {
         dataOut(localIndex[idx].first) += *(dataInput + idx) * localIndex[idx].second;
-      }
-    }
-
-    // for (int idx = 0; idx < nbLocalIndex; ++idx)
-    // {
-    //   if (!flagInitial[localIndex[idx].first])
-    //     dataOut(localIndex[idx].first) = defaultValue;
-    // }
+        flagInitial[localIndex[idx].first] = true; // Reset flag to indicate not all data source are nan
+      }
+    }
+
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
+    {
+      if (!flagInitial[localIndex[idx].first])
+        dataOut(localIndex[idx].first) = defaultValue;
+    }
   }
   else
Index: XIOS/dev/dev_olga/src/uuid.cpp
===================================================================
--- XIOS/dev/dev_olga/src/uuid.cpp	(revision 1168)
+++ 	(revision )
@@ -1,30 +1,0 @@
-#include <boost/uuid/uuid.hpp>
-#include <boost/uuid/uuid_generators.hpp>
-#include <boost/uuid/uuid_io.hpp>
-
-namespace xios
-{
-  
-  std::string getUuidStr(void)
-  {
-    boost::uuids::random_generator gen;
-    boost::uuids::uuid u = gen();
-    return boost::uuids::to_string(u) ;
-  }
-  
-  std::string getUuidStr(const std::string& format)
-  {
-    size_t pos ;
-    std::string retStr(format) ;
-    std::string uuid(getUuidStr()) ;
-    std::string id("%uuid%");
-    pos=retStr.find(id) ;
-    while(pos!=std::string::npos)
-    {
-      retStr.replace(pos,id.size(),uuid) ;
-      pos=retStr.find(id) ;
-    }
-    return retStr;
-  }
-}
-
Index: XIOS/dev/dev_olga/src/uuid.hpp
===================================================================
--- XIOS/dev/dev_olga/src/uuid.hpp	(revision 1168)
+++ 	(revision )
@@ -1,12 +1,0 @@
-#ifndef __UUID_HPP__
-#define __UUID_HPP__
-
-#include <string>
-
-namespace xios
-{
-  std::string getUuidStr(void) ;
-  std::string getUuidStr(const std::string& format) ;
-}
-
-#endif
