diff --git a/app/otbFillSegmentationHoles.cxx b/app/otbFillSegmentationHoles.cxx
index e660527ddf1447a4c4ca94bd0c7f2e0e8595050a..c9009d36949a915e740d0a9adfb39e25ebac04ec 100644
--- a/app/otbFillSegmentationHoles.cxx
+++ b/app/otbFillSegmentationHoles.cxx
@@ -78,37 +78,50 @@ private:
   void DoExecute() override
   {
    
+    LabelImageType::Pointer maskIn;
+    LabelImageType::Pointer maskedIn;
     LabelImageType::Pointer labelIn = GetParameterUInt32Image("in");
+
+	m_MaskFilter = BandMathFilterType::New();
+    if (HasValue("mask")) {
+		maskIn = GetParameterUInt32Image("mask");
+		m_MaskFilter->SetNthInput(0, labelIn);	
+		m_MaskFilter->SetNthInput(1, maskIn);
+		m_MaskFilter->SetExpression("b2!=0 ? b1 : 0");
+		maskedIn = m_MaskFilter->GetOutput();
+	} 
+	else maskedIn = labelIn;
     
     m_StatsFilter = StatsFilterType::New();
-    m_StatsFilter->SetInput(labelIn);
+    m_StatsFilter->SetInput(maskedIn);
     m_StatsFilter->Update();
     long unsigned M = m_StatsFilter->GetMaximum();
     std::cout << "Hole numbering starts at : " << 1 + M << std::endl;
     
     m_BandMathFilter = BandMathFilterType::New();
-    m_BandMathFilter->SetNthInput(0, labelIn);
+    m_BandMathFilter->SetNthInput(0, maskedIn);
     if (HasValue("mask")) {
-		LabelImageType::Pointer maskIn = GetParameterUInt32Image("mask");
 		m_BandMathFilter->SetNthInput(1, maskIn);
 		m_BandMathFilter->SetExpression("b1==0 && b2!=0");
-	}
-	else {
-		m_BandMathFilter->SetExpression("b1==0");
-	}
+	} else m_BandMathFilter->SetExpression("b1==0");
     
     m_CCLFilter = CCLFIlterType::New();
     m_CCLFilter->SetInput(m_BandMathFilter->GetOutput());
     
     m_OutBandMathFilter = BandMathFilterType::New();
-    m_OutBandMathFilter->SetNthInput(0, labelIn);
+    m_OutBandMathFilter->SetNthInput(0, maskedIn);
     m_OutBandMathFilter->SetNthInput(1, m_CCLFilter->GetOutput());
-    std::string expr = "b1==0 ? " + std::to_string(M) + " + b2 : b1";
+    std::string expr;
+    if (HasValue("mask")) {
+		m_OutBandMathFilter->SetNthInput(2, maskIn);
+		expr = "b1==0 && b3!=0 ? " + std::to_string(M) + " + b2 : b1";
+	} else expr = "b1==0 ? " + std::to_string(M) + " + b2 : b1";
     m_OutBandMathFilter->SetExpression(expr);
     SetParameterOutputImage("out", m_OutBandMathFilter->GetOutput());
     
   }
   
+  BandMathFilterType::Pointer m_MaskFilter;
   CCLFIlterType::Pointer m_CCLFilter;
   BandMathFilterType::Pointer m_BandMathFilter;
   StatsFilterType::Pointer m_StatsFilter;