diff --git a/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx b/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx
index 919ae74770943040289a24058ce93b8713011dab..6fd1fa60dc78e6a805325456dda092a02be894b3 100644
--- a/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx
+++ b/Applications/DisparityMap/otbPixelWiseBlockMatching.cxx
@@ -108,10 +108,15 @@ private:
     AddParameter(ParameterType_OutputImage, "io.out", "The output disparity map");
     SetParameterDescription("io.out","An image containing the estimated disparities as well as the metric values if the option is used");
 
-    AddParameter(ParameterType_OutputImage, "io.outmask", "The output mask corresponding to all criterions");
-    SetParameterDescription("io.outmask","A mask image corresponding to all citerions (see masking parameters). Only required if variance threshold or nodata criterions are set.");
-    DisableParameter("io.outmask");
-    MandatoryOff("io.outmask");
+    AddParameter(ParameterType_OutputImage, "io.outmaskleft", "The left output mask corresponding to all criterions");
+    SetParameterDescription("io.outmaskleft","A left mask image corresponding to all citerions (see masking parameters). Only required if variance threshold or nodata criterions are set.");
+    DisableParameter("io.outmaskleft");
+    MandatoryOff("io.outmaskleft");
+    
+    AddParameter(ParameterType_OutputImage, "io.outmaskright", "The right output mask corresponding to all criterions");
+    SetParameterDescription("io.outmaskright","A right mask image corresponding to all citerions (see masking parameters). Only required if variance threshold or nodata criterions are set.");
+    DisableParameter("io.outmaskright");
+    MandatoryOff("io.outmaskright");
 
     AddParameter(ParameterType_Empty,"io.outmetric","Output optimal metric values as well");
     SetParameterDescription("io.outmetric","If used, the output image will have a second component with metric optimal values");
@@ -119,12 +124,16 @@ private:
     AddParameter(ParameterType_Group,"mask","Image masking parameters");
     SetParameterDescription("mask","This group of parameters allows to determine the masking parameters to prevent disparities estimation for some pixels of the left image");
     
-    AddParameter(ParameterType_InputImage,"mask.in","Discard pixels from mask image");
-    SetParameterDescription("mask.in","This parameter allows to provide a custom mask");
-    MandatoryOff("mask.in");
+    AddParameter(ParameterType_InputImage,"mask.inleft","Discard left pixels from mask image");
+    SetParameterDescription("mask.inleft","This parameter allows to provide a custom mask for the left image");
+    MandatoryOff("mask.inleft");
+    
+    AddParameter(ParameterType_InputImage,"mask.inright","Discard right pixels from mask image");
+    SetParameterDescription("mask.inright","This parameter allows to provide a custom mask for the right image");
+    MandatoryOff("mask.inright");
 
     AddParameter(ParameterType_Float,"mask.nodata","Discard pixels with no-data value");
-    SetParameterDescription("mask.in","This parameter allows to discard pixels whose value is equal to the user-defined no-data value.");
+    SetParameterDescription("mask.nodata","This parameter allows to discard pixels whose value is equal to the user-defined no-data value.");
     MandatoryOff("mask.nodata");
     SetDefaultParameterFloat("mask.nodata",0.);
     DisableParameter("mask.nodata");
@@ -223,11 +232,13 @@ private:
   {
     if(IsParameterEnabled("mask.variancet") || IsParameterEnabled("mask.nodata"))
       {
-      EnableParameter("io.outmask");
+      EnableParameter("io.outmaskleft");
+      EnableParameter("io.outmaskright");
       }
     else
       {
-      DisableParameter("io.outmask");
+      DisableParameter("io.outmaskleft");
+      DisableParameter("io.outmaskright");
       }
     // enforce positive radii
     if (GetParameterInt("bm.radius") < 1)
@@ -273,9 +284,9 @@ private:
     bool useInitialDispMap = false;
 
     // Handle input mask if present
-    if(IsParameterEnabled("mask.in"))
+    if(IsParameterEnabled("mask.inleft"))
       {
-      leftmask = GetParameterFloatImage("mask.in");
+      leftmask = GetParameterFloatImage("mask.inleft");
       m_BandMathFilter->SetNthInput(inputId,leftmask,"inmask");
       masking = true;
       ++inputId;
@@ -332,7 +343,7 @@ private:
     // Initial disparity map case
     if (GetParameterInt("bm.initdisp") == 2)
       {
-      if (GetParameterInt("bm.initdisp.map.hrad") > 0 && GetParameterInt("bm.initdisp.map.vrad") > 0)
+      if (GetParameterInt("bm.initdisp.maps.hrad") > 0 && GetParameterInt("bm.initdisp.maps.vrad") > 0)
         {
         useInitialDispMap = true;
         }
@@ -352,9 +363,10 @@ private:
       m_SSDBlockMatcher->SetMaximumHorizontalDisparity(maxhdisp);
       m_SSDBlockMatcher->SetMinimumVerticalDisparity(minvdisp);
       m_SSDBlockMatcher->SetMaximumVerticalDisparity(maxvdisp);
+      AddProcess(m_SSDBlockMatcher,"SSD block matching");
       if(masking)
         {
-        m_SSDBlockMatcher->SetMaskInput(m_BandMathFilter->GetOutput());
+        m_SSDBlockMatcher->SetLeftMaskInput(m_BandMathFilter->GetOutput());
         }
       if(useInitialDispUniform)
         {
@@ -390,10 +402,11 @@ private:
       m_NCCBlockMatcher->SetMinimumVerticalDisparity(minvdisp);
       m_NCCBlockMatcher->SetMaximumVerticalDisparity(maxvdisp);
       m_NCCBlockMatcher->MinimizeOff();
+      AddProcess(m_NCCBlockMatcher,"NCC block matching");
 
       if(masking)
         {
-        m_NCCBlockMatcher->SetMaskInput(m_BandMathFilter->GetOutput());
+        m_NCCBlockMatcher->SetLeftMaskInput(m_BandMathFilter->GetOutput());
         }
       if(useInitialDispUniform)
         {
@@ -407,11 +420,11 @@ private:
       if(useInitialDispMap)
         {
         FloatImageType::SizeType expRadius;
-        expRadius[0] = GetParameterInt("bm.initdisp.map.hrad");
-        expRadius[1] = GetParameterInt("bm.initdisp.map.vrad");
+        expRadius[0] = GetParameterInt("bm.initdisp.maps.hrad");
+        expRadius[1] = GetParameterInt("bm.initdisp.maps.vrad");
         m_NCCBlockMatcher->SetExplorationRadius(expRadius);
-        m_NCCBlockMatcher->SetHorizontalDisparityInput(GetParameterFloatImage("bm.initdisp.map.hmap"));
-        m_NCCBlockMatcher->SetVerticalDisparityInput(GetParameterFloatImage("bm.initdisp.map.vmap"));
+        m_NCCBlockMatcher->SetHorizontalDisparityInput(GetParameterFloatImage("bm.initdisp.maps.hmap"));
+        m_NCCBlockMatcher->SetVerticalDisparityInput(GetParameterFloatImage("bm.initdisp.maps.vmap"));
         }
 
       hdispImage = m_NCCBlockMatcher->GetHorizontalDisparityOutput();
@@ -434,9 +447,9 @@ private:
     
     SetParameterOutputImage("io.out",m_ImageListFilter->GetOutput());
 
-    if(IsParameterEnabled("io.outmask"))
+    if(IsParameterEnabled("io.outmaskleft"))
       {
-      SetParameterOutputImage("io.outmask",m_BandMathFilter->GetOutput());
+      SetParameterOutputImage("io.outmaskleft",m_BandMathFilter->GetOutput());
       }
   }
 
diff --git a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h
index 35b3ad05145151020c67b67ef4bdf0f3ae987bdc..14eb653bde1564c73017c5ba48e123d6d3a91395 100644
--- a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h
+++ b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.h
@@ -201,12 +201,16 @@ public:
   void SetRightInput( const TInputImage * image);
 
   /** Set mask input (optional) */
-  void SetMaskInput(const TMaskImage * image);
+  void SetLeftMaskInput(const TMaskImage * image);
+  
+  /** Set right mask input (optional) */
+  void SetRightMaskInput(const TMaskImage * image);
 
   /** Get the inputs */
   const TInputImage * GetLeftInput() const;
   const TInputImage * GetRightInput() const;
-  const TMaskImage  * GetMaskInput() const;
+  const TMaskImage  * GetLeftMaskInput() const;
+  const TMaskImage  * GetRightMaskInput() const;
 
   /** Get the metric output */
   const TOutputMetricImage * GetMetricOutput() const;
diff --git a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx
index 87421374400bf2c85ad384b13d924b62f1ab71f4..6010e1dca66150f9ac3705f9c5f29ee9b32e95f4 100644
--- a/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx
+++ b/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.txx
@@ -33,7 +33,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
 ::PixelWiseBlockMatchingImageFilter()
 {
   // Set the number of inputs
-  this->SetNumberOfInputs(5);
+  this->SetNumberOfInputs(6);
   this->SetNumberOfRequiredInputs(2);
 
   // Set the outputs
@@ -98,12 +98,23 @@ class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor>
 void
 PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage,
 TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
-::SetMaskInput(const TMaskImage * image)
+::SetLeftMaskInput(const TMaskImage * image)
 {
 // Process object is not const-correct so the const casting is required.
   this->SetNthInput(2, const_cast<TMaskImage *>( image ));
 }
 
+template <class TInputImage, class TOutputMetricImage,
+class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor>
+void
+PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage,
+TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
+::SetRightMaskInput(const TMaskImage * image)
+{
+// Process object is not const-correct so the const casting is required.
+  this->SetNthInput(3, const_cast<TMaskImage *>( image ));
+}
+
 template <class TInputImage, class TOutputMetricImage,
 class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor>
 const TInputImage *
@@ -137,7 +148,7 @@ class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor>
 const TMaskImage *
 PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage,
 TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
-::GetMaskInput() const
+::GetLeftMaskInput() const
 {
   if(this->GetNumberOfInputs()<3)
     {
@@ -146,6 +157,20 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
   return static_cast<const TMaskImage *>(this->itk::ProcessObject::GetInput(2));
 }
 
+template <class TInputImage, class TOutputMetricImage,
+class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor>
+const TMaskImage *
+PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage,
+TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
+::GetRightMaskInput() const
+{
+  if(this->GetNumberOfInputs()<4)
+    {
+    return 0;
+    }
+  return static_cast<const TMaskImage *>(this->itk::ProcessObject::GetInput(3));
+}
+
 template <class TInputImage, class TOutputMetricImage,
 class TOutputDisparityImage, class TMaskImage, class TBlockMatchingFunctor>
 const TOutputMetricImage *
@@ -239,7 +264,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
 ::SetHorizontalDisparityInput( const TOutputDisparityImage * hfield)
 {
   // Process object is not const-correct so the const casting is required.
-  this->SetNthInput(3, const_cast<TOutputDisparityImage *>( hfield ));
+  this->SetNthInput(4, const_cast<TOutputDisparityImage *>( hfield ));
 }
 
 template <class TInputImage, class TOutputMetricImage,
@@ -250,7 +275,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
 ::SetVerticalDisparityInput( const TOutputDisparityImage * vfield)
 {
   // Process object is not const-correct so the const casting is required.
-  this->SetNthInput(4, const_cast<TOutputDisparityImage *>( vfield ));
+  this->SetNthInput(5, const_cast<TOutputDisparityImage *>( vfield ));
 }
 
 template <class TInputImage, class TOutputMetricImage,
@@ -260,11 +285,11 @@ PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage,
 TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
 ::GetHorizontalDisparityInput() const
 {
-  if(this->GetNumberOfInputs()<4)
+  if(this->GetNumberOfInputs()<5)
     {
     return 0;
     }
-  return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(3));
+  return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(4));
 }
 
 template <class TInputImage, class TOutputMetricImage,
@@ -274,11 +299,11 @@ PixelWiseBlockMatchingImageFilter<TInputImage,TOutputMetricImage,
 TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
 ::GetVerticalDisparityInput() const
 {
-  if(this->GetNumberOfInputs()<5)
+  if(this->GetNumberOfInputs()<6)
     {
     return 0;
     }
-  return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(4));
+  return static_cast<const TOutputDisparityImage *>(this->itk::ProcessObject::GetInput(5));
 }
 
 
@@ -295,7 +320,8 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
   // Retrieve input pointers
   TInputImage * inLeftPtr  = const_cast<TInputImage *>(this->GetLeftInput());
   TInputImage * inRightPtr = const_cast<TInputImage *>(this->GetRightInput());
-  TMaskImage *  inMaskPtr  = const_cast<TMaskImage * >(this->GetMaskInput());
+  TMaskImage *  inLeftMaskPtr  = const_cast<TMaskImage * >(this->GetLeftMaskInput());
+  TMaskImage *  inRightMaskPtr  = const_cast<TMaskImage * >(this->GetRightMaskInput());
   TOutputDisparityImage * inHDispPtr = const_cast<TOutputDisparityImage * >(this->GetHorizontalDisparityInput());
   TOutputDisparityImage * inVDispPtr = const_cast<TOutputDisparityImage * >(this->GetVerticalDisparityInput());
 
@@ -316,10 +342,16 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
     itkExceptionMacro(<<"Left and right images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<", right largest region: "<<inRightPtr->GetLargestPossibleRegion());
     }
 
-  // We also check that mask image has same size if present
-  if(inMaskPtr && inLeftPtr->GetLargestPossibleRegion() != inMaskPtr->GetLargestPossibleRegion())
+  // We also check that left mask image has same size if present
+  if(inLeftMaskPtr && inLeftPtr->GetLargestPossibleRegion() != inLeftMaskPtr->GetLargestPossibleRegion())
+    {
+    itkExceptionMacro(<<"Left and mask images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<", mask largest region: "<<inLeftMaskPtr->GetLargestPossibleRegion());
+    }
+  
+  // We also check that right mask image has same size if present
+  if(inRightMaskPtr && inRightPtr->GetLargestPossibleRegion() != inRightMaskPtr->GetLargestPossibleRegion())
     {
-    itkExceptionMacro(<<"Left and mask images do not have the same size ! Left largest region: "<<inLeftPtr->GetLargestPossibleRegion()<<", mask largest region: "<<inMaskPtr->GetLargestPossibleRegion());
+    itkExceptionMacro(<<"Right and mask images do not have the same size ! Right largest region: "<<inRightPtr->GetLargestPossibleRegion()<<", mask largest region: "<<inRightMaskPtr->GetLargestPossibleRegion());
     }
   
   // We check that the input initial disparity maps have the same size if present
@@ -400,30 +432,16 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
     throw e;
     }
 
-  if(inMaskPtr)
+  if(inLeftMaskPtr)
     {
-    // crop the mask region at the mask's largest possible region
-    if ( inputLeftRegion.Crop(inMaskPtr->GetLargestPossibleRegion()))
-      {
-      inMaskPtr->SetRequestedRegion( inputLeftRegion );
-      }
-    else
-      {
-      // Couldn't crop the region (requested region is outside the largest
-      // possible region).  Throw an exception.
-      // store what we tried to request (prior to trying to crop)
-      inMaskPtr->SetRequestedRegion( inputLeftRegion );
-      
-      // build an exception
-      itk::InvalidRequestedRegionError e(__FILE__, __LINE__);
-      std::ostringstream msg;
-      msg << this->GetNameOfClass()
-          << "::GenerateInputRequestedRegion()";
-      e.SetLocation(msg.str().c_str());
-      e.SetDescription("Requested region is (at least partially) outside the largest possible region of mask image.");
-      e.SetDataObject(inMaskPtr);
-      throw e;
-      }
+    // no need to crop the mask region : left mask and left image have same largest possible region
+    inLeftMaskPtr->SetRequestedRegion( inputLeftRegion );
+    }
+  
+  if(inRightMaskPtr)
+    {
+    // no need to crop the mask region : right mask and right image have same largest possible region
+    inRightMaskPtr->SetRequestedRegion( inputRightRegion );
     }
     
   if (inHDispPtr && inVDispPtr)
@@ -460,7 +478,8 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
   // Retrieve pointers
   const TInputImage *     inLeftPtr    = this->GetLeftInput();
   const TInputImage *     inRightPtr   = this->GetRightInput();
-  const TMaskImage  *     inMaskPtr    = this->GetMaskInput();
+  const TMaskImage  *     inLeftMaskPtr    = this->GetLeftMaskInput();
+  const TMaskImage  *     inRightMaskPtr    = this->GetRightMaskInput();
   const TOutputDisparityImage * inHDispPtr = this->GetHorizontalDisparityInput();
   const TOutputDisparityImage * inVDispPtr = this->GetVerticalDisparityInput();
   TOutputMetricImage    * outMetricPtr = this->GetMetricOutput();
@@ -469,7 +488,7 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
 
   // Set-up progress reporting (this is not exact, since we do not
   // account for pixels that are out of range for a given disparity
-  itk::ProgressReporter progress(this, threadId, (m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity + 1)*(m_MaximumVerticalDisparity - m_MinimumVerticalDisparity + 1));
+  itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels()*(m_MaximumHorizontalDisparity - m_MinimumHorizontalDisparity + 1)*(m_MaximumVerticalDisparity - m_MinimumVerticalDisparity + 1),100);
 
   
   // Check if we use initial disparities and exploration radius
@@ -518,7 +537,8 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
     itk::ImageRegionIterator<TOutputMetricImage>    outMetricIt(outMetricPtr,inputLeftRegion);
     itk::ImageRegionIterator<TOutputDisparityImage> outHDispIt(outHDispPtr,inputLeftRegion);
     itk::ImageRegionIterator<TOutputDisparityImage> outVDispIt(outVDispPtr,inputLeftRegion);
-    itk::ImageRegionConstIterator<TMaskImage>       inMaskIt;
+    itk::ImageRegionConstIterator<TMaskImage>       inLeftMaskIt;
+    itk::ImageRegionConstIterator<TMaskImage>       inRightMaskIt;
     itk::ImageRegionConstIterator<TOutputDisparityImage>       inHDispIt;
     itk::ImageRegionConstIterator<TOutputDisparityImage>       inVDispIt;
 
@@ -529,10 +549,15 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
     rightIt.OverrideBoundaryCondition(&nbc2);
 
     // If we have a mask, define the iterator
-    if(inMaskPtr)
+    if(inLeftMaskPtr)
       {
-      inMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inMaskPtr,inputLeftRegion);
-      inMaskIt.GoToBegin();
+      inLeftMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inLeftMaskPtr,inputLeftRegion);
+      inLeftMaskIt.GoToBegin();
+      }
+    if(inRightMaskPtr)
+      {
+      inRightMaskIt = itk::ImageRegionConstIterator<TMaskImage>(inRightMaskPtr,inputRightRegion);
+      inRightMaskIt.GoToBegin();
       }
     
     // If we use initial disparity maps, define the iterators
@@ -560,64 +585,67 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
       {
       
       // If the mask is present and valid
-      if(!inMaskPtr || (inMaskPtr && inMaskIt.Get() > 0) )
+      if(!inLeftMaskPtr || (inLeftMaskPtr && inLeftMaskIt.Get() > 0) )
         {
-        int estimatedMinHDisp = m_MinimumHorizontalDisparity;
-        int estimatedMinVDisp = m_MinimumVerticalDisparity;
-        int estimatedMaxHDisp = m_MaximumHorizontalDisparity;
-        int estimatedMaxVDisp = m_MaximumVerticalDisparity;
-        if (useExplorationRadius)
+        if(!inRightMaskPtr || (inRightMaskPtr && inRightMaskIt.Get() > 0) )
           {
-          // compute disparity bounds from initial position and exploration radius
-          if (useInitDispMaps)
-            {
-            estimatedMinHDisp = inHDispIt.Get() - m_ExplorationRadius[0];
-            estimatedMinVDisp = inVDispIt.Get() - m_ExplorationRadius[1];
-            estimatedMaxHDisp = inHDispIt.Get() + m_ExplorationRadius[0];
-            estimatedMaxVDisp = inVDispIt.Get() + m_ExplorationRadius[1];
-            }
-          else
+          int estimatedMinHDisp = m_MinimumHorizontalDisparity;
+          int estimatedMinVDisp = m_MinimumVerticalDisparity;
+          int estimatedMaxHDisp = m_MaximumHorizontalDisparity;
+          int estimatedMaxVDisp = m_MaximumVerticalDisparity;
+          if (useExplorationRadius)
             {
-            estimatedMinHDisp = m_InitHorizontalDisparity - m_ExplorationRadius[0];
-            estimatedMinVDisp = m_InitVerticalDisparity - m_ExplorationRadius[1];
-            estimatedMaxHDisp = m_InitHorizontalDisparity + m_ExplorationRadius[0];
-            estimatedMaxVDisp = m_InitVerticalDisparity + m_ExplorationRadius[1];
+            // compute disparity bounds from initial position and exploration radius
+            if (useInitDispMaps)
+              {
+              estimatedMinHDisp = inHDispIt.Get() - m_ExplorationRadius[0];
+              estimatedMinVDisp = inVDispIt.Get() - m_ExplorationRadius[1];
+              estimatedMaxHDisp = inHDispIt.Get() + m_ExplorationRadius[0];
+              estimatedMaxVDisp = inVDispIt.Get() + m_ExplorationRadius[1];
+              }
+            else
+              {
+              estimatedMinHDisp = m_InitHorizontalDisparity - m_ExplorationRadius[0];
+              estimatedMinVDisp = m_InitVerticalDisparity - m_ExplorationRadius[1];
+              estimatedMaxHDisp = m_InitHorizontalDisparity + m_ExplorationRadius[0];
+              estimatedMaxVDisp = m_InitVerticalDisparity + m_ExplorationRadius[1];
+              }
+            // clamp to the minimum disparities
+            if (estimatedMinHDisp < m_MinimumHorizontalDisparity)
+              {
+              estimatedMinHDisp = m_MinimumHorizontalDisparity;
+              }
+            if (estimatedMinVDisp < m_MinimumVerticalDisparity)
+              {
+              estimatedMinVDisp = m_MinimumVerticalDisparity;
+              }
             }
-          // clamp to the minimum disparities
-          if (estimatedMinHDisp < m_MinimumHorizontalDisparity)
+          
+          if (vdisparity >= estimatedMinVDisp && vdisparity <= estimatedMaxVDisp &&
+              hdisparity >= estimatedMinHDisp && hdisparity <= estimatedMaxHDisp)
             {
-            estimatedMinHDisp = m_MinimumHorizontalDisparity;
-            }
-          if (estimatedMinVDisp < m_MinimumVerticalDisparity)
-            {
-            estimatedMinVDisp = m_MinimumVerticalDisparity;
-            }
-          }
-        
-        if (vdisparity >= estimatedMinVDisp && vdisparity <= estimatedMaxVDisp &&
-            hdisparity >= estimatedMinHDisp && hdisparity <= estimatedMaxHDisp)
-          {
-          // Compute the block matching value
-        double metric = m_Functor(leftIt,rightIt);
-  
-          // If we are at first loop, fill both outputs
-          if(vdisparity == estimatedMinVDisp && hdisparity == estimatedMinHDisp)
-            {
-            outHDispIt.Set(hdisparity);
-            outVDispIt.Set(vdisparity);
-            outMetricIt.Set(metric);
-            }
-          else if(m_Minimize && metric < outMetricIt.Get())
-            {
-            outHDispIt.Set(hdisparity);
-            outVDispIt.Set(vdisparity);
-            outMetricIt.Set(metric);
-            }
-          else if(!m_Minimize && metric > outMetricIt.Get())
-            {
-            outHDispIt.Set(hdisparity);
-            outVDispIt.Set(vdisparity);
-            outMetricIt.Set(metric);
+            // Compute the block matching value
+          double metric = bmFunctor(leftIt,rightIt);
+    
+            // If we are at first loop, fill both outputs
+            if(vdisparity == estimatedMinVDisp && hdisparity == estimatedMinHDisp)
+              {
+              outHDispIt.Set(hdisparity);
+              outVDispIt.Set(vdisparity);
+              outMetricIt.Set(metric);
+              }
+            else if(m_Minimize && metric < outMetricIt.Get())
+              {
+              outHDispIt.Set(hdisparity);
+              outVDispIt.Set(vdisparity);
+              outMetricIt.Set(metric);
+              }
+            else if(!m_Minimize && metric > outMetricIt.Get())
+              {
+              outHDispIt.Set(hdisparity);
+              outVDispIt.Set(vdisparity);
+              outMetricIt.Set(metric);
+              }
             }
           }
         }
@@ -627,9 +655,14 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
       ++outHDispIt;
       ++outVDispIt;
 
-      if(inMaskPtr)
+      if(inLeftMaskPtr)
         {
-        ++inMaskIt;
+        ++inLeftMaskIt;
+        }
+      
+      if(inRightMaskPtr)
+        {
+        ++inRightMaskIt;
         }
       
       if(useInitDispMaps)
@@ -637,9 +670,9 @@ TOutputDisparityImage,TMaskImage,TBlockMatchingFunctor>
         ++inHDispIt;
         ++inVDispIt;
         }
-      
+        progress.CompletedPixel();
       }
-      progress.CompletedPixel();
+      
     }
     }
 }
diff --git a/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx b/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx
index 1dab53f8e2ec722bbce3ef4e07f546d6e83d8b02..8beac5f50fb4b10322d3e5da6f0e22a3644cde1c 100644
--- a/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx
+++ b/Testing/Code/DisparityMap/otbPixelWiseBlockMatchingImageFilter.cxx
@@ -60,7 +60,7 @@ int otbPixelWiseBlockMatchingImageFilter(int argc, char * argv[])
   if(argc > 8)
     {
     maskReader->SetFileName(argv[8]);
-    bmFilter->SetMaskInput(maskReader->GetOutput());
+    bmFilter->SetLeftMaskInput(maskReader->GetOutput());
     }
 
   FloatWriterType::Pointer dispWriter = FloatWriterType::New();
@@ -104,7 +104,7 @@ int otbPixelWiseBlockMatchingImageFilterNCC(int argc, char * argv[])
   if(argc > 8)
     {
     maskReader->SetFileName(argv[8]);
-    bmFilter->SetMaskInput(maskReader->GetOutput());
+    bmFilter->SetLeftMaskInput(maskReader->GetOutput());
     }
 
   FloatWriterType::Pointer dispWriter = FloatWriterType::New();