Index: XIOS/trunk/src/transformation/axis_algorithm_extract_domain.cpp
===================================================================
--- XIOS/trunk/src/transformation/axis_algorithm_extract_domain.cpp	(revision 915)
+++ XIOS/trunk/src/transformation/axis_algorithm_extract_domain.cpp	(revision 918)
@@ -30,5 +30,6 @@
                                         const double* dataInput,
                                         CArray<double,1>& dataOut,
-                                        std::vector<bool>& flagInitial)
+                                        std::vector<bool>& flagInitial,
+                                        const double& defaultValue)
 {
   reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
Index: XIOS/trunk/src/transformation/axis_algorithm_extract_domain.hpp
===================================================================
--- XIOS/trunk/src/transformation/axis_algorithm_extract_domain.hpp	(revision 915)
+++ XIOS/trunk/src/transformation/axis_algorithm_extract_domain.hpp	(revision 918)
@@ -31,5 +31,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,
+                     const double& defaultValue);
 
   virtual ~CAxisAlgorithmExtractDomain();
Index: XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp
===================================================================
--- XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp	(revision 915)
+++ XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp	(revision 918)
@@ -69,5 +69,5 @@
 {
   std::vector<double>::const_iterator itb = axisValue.begin(), ite = axisValue.end();
-  std::vector<double>::const_iterator itLowerBound, itUpperBound, it;
+  std::vector<double>::const_iterator itLowerBound, itUpperBound, it, iteRange;
   const double sfmax = NumTraits<double>::sfmax();
 
@@ -79,23 +79,28 @@
   for (int idx = 0; idx < numValue; ++idx)
   {
+    bool outOfRange = false;
     double destValue = axisDestValue(idx);
+    if (destValue < *itb) outOfRange = true;
+
     itLowerBound = std::lower_bound(itb, ite, destValue);
     itUpperBound = std::upper_bound(itb, ite, destValue);
     if ((ite != itUpperBound) && (sfmax == *itUpperBound)) itUpperBound = ite;
 
+    if ((ite == itLowerBound) || (ite == itUpperBound)) outOfRange = true;
     // If the value is not in the range, that means we'll do extra-polation
-    if (ite == itLowerBound) // extra-polation
-    {
-      itLowerBound = itb;
-      itUpperBound = itb + order_+1;
-    }
-    else if (ite == itUpperBound) // extra-polation
-    {
-      itLowerBound = itUpperBound - order_-1;
-    }
-    else
-    {
-      if (itb != itLowerBound) --itLowerBound;
-      if (ite != itUpperBound) ++itUpperBound;
+//    if (ite == itLowerBound) // extra-polation
+//    {
+//      itLowerBound = itb;
+//      itUpperBound = itb + order_+1;
+//    }
+//    else if (ite == itUpperBound) // extra-polation
+//    {
+//      itLowerBound = itUpperBound - order_-1;
+//    }
+//else
+    // We don't do extrapolation FOR NOW, maybe in the future
+    if (!outOfRange)
+    {
+      if ((itLowerBound == itUpperBound) && (itb != itLowerBound)) --itLowerBound;
       int order = (order_ + 1) - 2;
       bool down = true;
@@ -114,10 +119,12 @@
         }
       }
-    }
-
-    for (it = itLowerBound; it != itUpperBound; ++it)
-    {
-      int index = std::distance(itb, it);
-      interpolatingIndexValues[idx+ibegin].push_back(make_pair(indexVec[index],*it));
+
+
+      iteRange = (ite == itUpperBound) ? itUpperBound : itUpperBound + 1;
+      for (it = itLowerBound; it != iteRange; ++it)
+      {
+        int index = std::distance(itb, it);
+        interpolatingIndexValues[idx+ibegin].push_back(make_pair(indexVec[index],*it));
+      }
     }
   }
@@ -163,4 +170,7 @@
     }
   }
+  if (!transPosition_.empty() && this->transformationPosition_[transPos].empty())
+    (this->transformationPosition_[transPos])[0] = transPosition_[transPos];
+
 }
 
Index: XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.cpp
===================================================================
--- XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.cpp	(revision 915)
+++ XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.cpp	(revision 918)
@@ -27,7 +27,8 @@
 
 void CAxisAlgorithmReduceDomain::apply(const std::vector<std::pair<int,double> >& localIndex,
-                                         const double* dataInput,
-                                         CArray<double,1>& dataOut,
-                                         std::vector<bool>& flagInitial)
+                                       const double* dataInput,
+                                       CArray<double,1>& dataOut,
+                                       std::vector<bool>& flagInitial,
+                                       const double& defaultValue)
 {
   reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
Index: XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.hpp
===================================================================
--- XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 915)
+++ XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 918)
@@ -31,5 +31,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,
+                     const double& defaultValue);
 
   virtual ~CAxisAlgorithmReduceDomain();
Index: XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp
===================================================================
--- XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp	(revision 915)
+++ XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp	(revision 918)
@@ -22,10 +22,35 @@
                                             const double* dataInput,
                                             CArray<double,1>& dataOut,
-                                            std::vector<bool>& flagInitial)
+                                            std::vector<bool>& flagInitial,
+                                            const double& defaultValue)
 {
   int nbLocalIndex = localIndex.size();
-  for (int idx = 0; idx < nbLocalIndex; ++idx)
-  {
-    dataOut(localIndex[idx].first) += *(dataInput + idx) * localIndex[idx].second;
+  bool hasMissingValue = (0.0 != defaultValue) ? true : false;
+  if (hasMissingValue)
+  {
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
+    {
+      if (defaultValue == *(dataInput + idx))
+      {
+        flagInitial[localIndex[idx].first] = false;
+      }
+      else
+      {
+        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;
+    }
+  }
+  else
+  {
+    for (int idx = 0; idx < nbLocalIndex; ++idx)
+    {
+      dataOut(localIndex[idx].first) += *(dataInput + idx) * localIndex[idx].second;
+    }
   }
 }
Index: XIOS/trunk/src/transformation/generic_algorithm_transformation.hpp
===================================================================
--- XIOS/trunk/src/transformation/generic_algorithm_transformation.hpp	(revision 915)
+++ XIOS/trunk/src/transformation/generic_algorithm_transformation.hpp	(revision 918)
@@ -63,5 +63,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,
+                     const double& defaultValue);
 
   std::vector<StdString> getIdAuxInputs();
Index: XIOS/trunk/src/transformation/scalar_algorithm_reduce_axis.cpp
===================================================================
--- XIOS/trunk/src/transformation/scalar_algorithm_reduce_axis.cpp	(revision 915)
+++ XIOS/trunk/src/transformation/scalar_algorithm_reduce_axis.cpp	(revision 918)
@@ -37,5 +37,6 @@
                                          const double* dataInput,
                                          CArray<double,1>& dataOut,
-                                         std::vector<bool>& flagInitial)
+                                         std::vector<bool>& flagInitial,
+                                         const double& defaultValue)
 {
   reduction_->apply(localIndex, dataInput, dataOut, flagInitial);
Index: XIOS/trunk/src/transformation/scalar_algorithm_reduce_axis.hpp
===================================================================
--- XIOS/trunk/src/transformation/scalar_algorithm_reduce_axis.hpp	(revision 915)
+++ XIOS/trunk/src/transformation/scalar_algorithm_reduce_axis.hpp	(revision 918)
@@ -31,5 +31,6 @@
                      const double* dataInput,
                      CArray<double,1>& dataOut,
-                     std::vector<bool>& flagInitial);
+                     std::vector<bool>& flagInitial,
+                     const double& defaultValue);
 
   virtual ~CScalarAlgorithmReduceScalar();
