diff --git a/Testing/Code/BasicFilters/CMakeLists.txt b/Testing/Code/BasicFilters/CMakeLists.txt
index 0114e5e871d1a6b8c2ee09ee59422ca9cf591a4b..988ad5903374c2925337a99013700f89a0586137 100644
--- a/Testing/Code/BasicFilters/CMakeLists.txt
+++ b/Testing/Code/BasicFilters/CMakeLists.txt
@@ -1451,7 +1451,7 @@ ADD_TEST(bfTvListSampleToHistogramListGenerator ${BASICFILTERS_TESTS11}
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 # -------     otbEdgeDetectorImageFilter   ----------------------------
-ADD_TEST(bfTvEdgeDetectorImageFilterNew ${BASICFILTERS_TESTS12}
+ADD_TEST(bfTuEdgeDetectorImageFilterNew ${BASICFILTERS_TESTS12}
 	 otbEdgeDetectorImageFilterNew
 	 )
 
@@ -1466,6 +1466,23 @@ ADD_TEST(bfTvEdgeDetectorImageFilter ${BASICFILTERS_TESTS12}
 	 255 # upper  threshold
 )
 
+# -------     otbChangeLabelImageFilter   ----------------------------
+ADD_TEST(bfTuChangeLabelImageFilterNew ${BASICFILTERS_TESTS12}
+   otbChangeLabelImageFilterNew
+   )
+
+ADD_TEST(bfTvChangeLabelImageFilter ${BASICFILTERS_TESTS12}
+--compare-image ${TOL}
+      ${BASELINE}/bfChangeLabelImageFilter.tif
+      ${TEMP}/bfChangeLabelImageFilter.tif
+   otbChangeLabelImageFilter
+ ${INPUTDATA}/QB_Toulouse_Ortho_PAN.tif
+ #  ${INPUTDATA}/poupees_sub_c1.png
+  ${TEMP}/bfChangeLabelImageFilter.tif
+  255   # Mask value
+  100   # lower threshold
+  200   # upper  threshold
+)
 
 
 
@@ -1662,6 +1679,8 @@ otbListSampleToHistogramListGenerator.cxx
 SET(BasicFilters_SRCS12
 otbEdgeDetectorImageFilter.cxx
 otbEdgeDetectorImageFilterNew.cxx
+otbChangeLabelImageFilterNew.cxx
+otbChangeLabelImageFilter.cxx
 )
 
 INCLUDE_DIRECTORIES("${OTBTesting_BINARY_DIR}")
diff --git a/Testing/Code/BasicFilters/otbBasicFiltersTests12.cxx b/Testing/Code/BasicFilters/otbBasicFiltersTests12.cxx
index 7818a2bfbe4c5fe8196cf13f2e5654d5d7b56c4c..7b2c8d9093c0b0cf3244e8f4e13c831e3a65da69 100644
--- a/Testing/Code/BasicFilters/otbBasicFiltersTests12.cxx
+++ b/Testing/Code/BasicFilters/otbBasicFiltersTests12.cxx
@@ -29,4 +29,6 @@ void RegisterTests()
 {
 REGISTER_TEST(otbEdgeDetectorImageFilter);
 REGISTER_TEST(otbEdgeDetectorImageFilterNew);
+REGISTER_TEST(otbChangeLabelImageFilterNew);
+REGISTER_TEST(otbChangeLabelImageFilter);
 }
diff --git a/Testing/Code/BasicFilters/otbChangeLabelImageFilter.cxx b/Testing/Code/BasicFilters/otbChangeLabelImageFilter.cxx
index ad1ddd47d9d25b652a8239b6bb1498efb67611f9..1036c0a6c4096a8d3d94412a344e452eb9aa70ef 100644
--- a/Testing/Code/BasicFilters/otbChangeLabelImageFilter.cxx
+++ b/Testing/Code/BasicFilters/otbChangeLabelImageFilter.cxx
@@ -22,101 +22,54 @@
 #include "itkRandomImageSource.h"
 #include "otbChangeLabelImageFilter.h"
 #include "itkImageRegionIteratorWithIndex.h"
+#include "otbImageFileWriter.h"
+#include "otbImageFileReader.h"
 
-int otbChangeLabelImageFilterTest(int argc, char * argv[])
+int otbChangeLabelImageFilter(int argc, char * argv[])
 {
-  const unsigned int ImageDimension = 3;
-
-  typedef otb::Image<unsigned short, ImageDimension>                   InputImageType;
-  typedef otb::VectorImage<unsigned char, ImageDimension>              OutputImageType;
+  const unsigned int ImageDimension = 2;
+  const char * inputFilename(argv[1]);
+  const char * outFilename(argv[2]);
+  typedef unsigned short PixelType;
+  typedef otb::Image<PixelType, ImageDimension>                   InputImageType;
+  typedef otb::VectorImage<PixelType, ImageDimension>             OutputImageType;
   typedef InputImageType::PixelType                                    InputPixelType;
   typedef OutputImageType::PixelType                                   OutputPixelType;
   typedef itk::ImageRegionIteratorWithIndex<InputImageType>            InputIteratorType;
   typedef itk::ImageRegionIteratorWithIndex<OutputImageType>           OutputIteratorType;
   typedef itk::RandomImageSource<InputImageType>                       SourceType;
   typedef otb::ChangeLabelImageFilter<InputImageType, OutputImageType> FilterType;
+  typedef otb::ImageFileWriter<OutputImageType> WriterType;
+  typedef otb::ImageFileReader<InputImageType> ReaderType;
 
   SourceType::Pointer source = SourceType::New();
   FilterType::Pointer filter = FilterType::New();
   InputImageType::Pointer  vectImage  = InputImageType::New();
 
-  unsigned long sizeArray[ImageDimension] = { 3,3,3 };
+  WriterType::Pointer writer = WriterType::New();
+  ReaderType::Pointer reader = ReaderType::New();
 
-  InputPixelType upper = 10;
-  source->SetMin( itk::NumericTraits<InputPixelType>::Zero );
-  source->SetMax( upper );
-  source->SetSize( sizeArray );
-  source->SetNumberOfThreads(1);
 
-  filter->SetNumberOfComponentsPerPixel(5);
+  reader->SetFileName( inputFilename  );
+  writer->SetFileName( outFilename );
+  PixelType maskValue =  static_cast<PixelType>(atoi(argv[3]));
+  InputPixelType lower = static_cast<PixelType>(atoi(argv[4]));
+  InputPixelType upper = static_cast<PixelType>(atoi(argv[5]));
 
-  // Eliminate most labels
+  filter->SetNumberOfComponentsPerPixel(3);
   OutputPixelType background;
   background.SetSize( filter->GetNumberOfComponentsPerPixel() );
-  background.Fill(1);
-  InputPixelType maxRemainingLabel = 2;
-  for (InputPixelType i = maxRemainingLabel; i <= upper; i++)
-  {
-    filter->SetChange( i, background );
-  }
+  background.Fill(maskValue);
 
-  filter->Print( std::cout );
-  filter->SetInput( source->GetOutput() );
-
-  OutputImageType::Pointer outputImage = filter->GetOutput();
-
-  // Execute the filter
-  try
-  {
-    filter->Update();
-    filter->SetFunctor(filter->GetFunctor());
-  }
-  catch (...)
+  filter->SetChange( 0,0 );
+  for (InputPixelType i = lower; i <= upper; i++)
   {
-    std::cerr << "Caught an unexpected exception. " << std::endl;
-    std::cerr << "Test failed. " << std::endl;
-    return EXIT_FAILURE;
+    filter->SetChange( i, background );
   }
 
-  // Create an iterator for going through the image output
-  InputIteratorType  it( source->GetOutput(), source->GetOutput()->GetRequestedRegion() );
-  OutputIteratorType ot(outputImage, outputImage->GetRequestedRegion());
-
-  bool pass = true;
-
-  //  Check the content of the result image
-  std::cout << "Verification of the output " << std::endl;
-
-  ot.GoToBegin();
-  it.GoToBegin();
-  while ( !ot.IsAtEnd() )
-  {
-    const InputPixelType  input  = it.Get();
-    const OutputPixelType output = ot.Get();
-    std::cout <<  (double) input<<": ";
-    for (unsigned int j=0; j<filter->GetNumberOfComponentsPerPixel(); j++)
-    {
-      std::cout<< " " << (double)output[j];
-      if ( (double)output[j] > (double)maxRemainingLabel )
-      {
-        pass = false;
-      }
-    }
-    std::cout<<std::endl;
-
-    if ( !pass )
-    {
-      std::cerr << "Error in otbChangeLabelImageFilterTest " << std::endl;
-      std::cerr << " input = " << input;
-      std::cerr << " output = " << output;
-      std::cerr << std::endl;
-
-      return EXIT_FAILURE;
-    }
-
-    ++ot;
-    ++it;
-  }
+  filter->SetInput( reader->GetOutput() );
+  writer->SetInput(filter->GetOutput());
+  writer->Update();
 
   return EXIT_SUCCESS;
 }