Index: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_interpolate.cpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_interpolate.cpp	(revision 1479)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_interpolate.cpp	(revision 1480)
@@ -912,9 +912,15 @@
      }
 
+    if (firstPass)
+    {
+      allMissing.resize(dataOut.numElements()) ;
+      allMissing=true ;
+    }
+
     for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
       if (NumTraits<double>::isNan(*(dataInput + idx)))
       {
-        flagInitial[localIndex[idx].first] = false;
+        allMissing(localIndex[idx].first) = allMissing(localIndex[idx].first) && true;
         if (renormalize) renormalizationFactor(localIndex[idx].first)-=localIndex[idx].second ;
       }
@@ -922,19 +928,13 @@
       {
         dataOut(localIndex[idx].first) += *(dataInput + idx) * localIndex[idx].second;
-        flagInitial[localIndex[idx].first] = true; // Reset flag to indicate not all data source are nan
+        allMissing(localIndex[idx].first) = allMissing(localIndex[idx].first) && false; // Reset flag to indicate not all data source are nan
       }
     }
 
-    // If all data source are nan then data destination must be nan
+  }
+  else
+  {
     for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      if (!flagInitial[localIndex[idx].first])
-        dataOut(localIndex[idx].first) = defaultValue;
-    }
-  }
-  else
-  {
-    for (int idx = 0; idx < nbLocalIndex; ++idx)
-    {
       dataOut(localIndex[idx].first) += *(dataInput + idx) * localIndex[idx].second;
     }
@@ -944,10 +944,21 @@
 void CDomainAlgorithmInterpolate::updateData(CArray<double,1>& dataOut)
 {
-  if (detectMissingValue && renormalize)
-  {
-    if (renormalizationFactor.numElements()>0) dataOut/=renormalizationFactor ; // In some case, process doesn't received any data for interpolation (mask)
-                                                                                // so renormalizationFactor is not initialized
-  }
-}
-
-}
+  if (detectMissingValue)
+  {
+    double defaultValue = std::numeric_limits<double>::quiet_NaN();
+    size_t nbIndex=dataOut.numElements() ; 
+
+    for (int idx = 0; idx < nbIndex; ++idx)
+    {
+      if (allMissing(idx)) dataOut(idx) = defaultValue; // If all data source are nan then data destination must be nan
+    }
+    
+    if (renormalize)
+    {
+      if (renormalizationFactor.numElements()>0) dataOut/=renormalizationFactor ; // In some case, process doesn't received any data for interpolation (mask)
+                                                                                 // so renormalizationFactor is not initialized
+    }
+  }
+}
+
+}
Index: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_interpolate.hpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_interpolate.hpp	(revision 1479)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_interpolate.hpp	(revision 1480)
@@ -55,4 +55,5 @@
 private:
   CArray<double,1> renormalizationFactor ;
+  CArray<bool,1> allMissing ;
   bool detectMissingValue ;
   bool renormalize ;
Index: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.cpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.cpp	(revision 1479)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.cpp	(revision 1480)
@@ -37,25 +37,19 @@
   int nbLocalIndex = localIndex.size();   
   double defaultValue = std::numeric_limits<double>::quiet_NaN();
+    
   if (ignoreMissingValue)
   {
+    if (firstPass) dataOut=defaultValue ;
+    
     for (int idx = 0; idx < nbLocalIndex; ++idx)
     {
-      if (NumTraits<double>::isNan(*(dataInput + idx)))
-      {
-        flagInitial[localIndex[idx].first] = false;
-      }
-      else
-      {
-        dataOut(localIndex[idx].first) += *(dataInput + idx) * localIndex[idx].second;
-        flagInitial[localIndex[idx].first] = true; // Reset flag to indicate not all data source are nan
-      }
-    }
-
-    // If all data source are nan then data destination must be nan
-    for (int idx = 0; idx < nbLocalIndex; ++idx)
-    {
-      if (!flagInitial[localIndex[idx].first])
-        dataOut(localIndex[idx].first) = defaultValue;
-    }
+      if (! NumTraits<double>::isNan(*(dataInput + idx)))
+      {
+        if (flagInitial[localIndex[idx].first]) dataOut(localIndex[idx].first) = *(dataInput + idx) * localIndex[idx].second;
+        else dataOut(localIndex[idx].first) += *(dataInput + idx) * localIndex[idx].second;
+        flagInitial[localIndex[idx].first] = false; // Reset flag to indicate not all data source are nan
+      }
+    }
+
   }
   else
