diff --git a/Testing/Code/Common/CMakeLists.txt b/Testing/Code/Common/CMakeLists.txt
index c3fa7fffde9e7ec8bd5c73d99c7d1e321f5fb4bb..44b414dda2f5566b40314308070ea7776bfdf168 100644
--- a/Testing/Code/Common/CMakeLists.txt
+++ b/Testing/Code/Common/CMakeLists.txt
@@ -318,7 +318,7 @@ ADD_TEST(coTvMultiChannelExtractROI_Romania ${COMMON_TESTS2}
 
 ADD_TEST(coTuMultiToMonoROINew ${COMMON_TESTS3}
          otbMultiToMonoChannelExtractROINew)
-
+         
 ADD_TEST(coTvMultiToMonoROI_RGB2NG_PNG ${COMMON_TESTS3}
   --compare-image ${NOTOL}   ${BASELINE}/coMultiToMonoChannelExtractROI_RGB2NG_PNG_300_10_250_50_channel_1.png
                            ${TEMP}/coMultiToMonoChannelExtractROI_RGB2NG_PNG_300_10_250_50_channel_1.png
@@ -372,6 +372,25 @@ ADD_TEST(coTuPathListToHistogramGenerator ${COMMON_TESTS3}
 ADD_TEST(coTuLineSpatialObjectListToPointSetFilter ${COMMON_TESTS3}
          otbLineSpatialObjectListToPointSetFilterNew)
 
+
+# -------  Compare region propagation of ExtractROI filters  ------------------------------
+ADD_TEST(coTuITKExtractImageFilterTestRegion ${COMMON_TESTS3}
+         otbITKExtractImageFilterROITestRegion)
+  
+ADD_TEST(coTuITKVectorIndexSelectionCastTestRegion ${COMMON_TESTS3}
+         otbITKVectorIndexSelectionCastTestRegion)
+         
+ADD_TEST(coTuMultiToMonoChannelExtractROITestRegion ${COMMON_TESTS3}
+         otbMultiToMonoChannelExtractROITestRegion)
+       
+ADD_TEST(coTuMultiChannelExtractROITestRegion ${COMMON_TESTS3}
+         otbMultiChannelExtractROITestRegion)
+         
+ADD_TEST(coTuExtractROITestRegion ${COMMON_TESTS3}
+         otbExtractROITestRegion)
+
+         
+
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ otbCommonTests4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1071,6 +1090,7 @@ otbVectorDataExtractROI.cxx
 )
 SET(BasicCommon_SRCS3
 otbCommonTests3.cxx
+otbExtractROICompareRegionsImplementations.cxx
 otbMultiToMonoChannelExtractROI.cxx
 otbMultiToMonoChannelExtractROINew.cxx
 otbPointSetSourceTest.cxx
diff --git a/Testing/Code/Common/otbCommonTests3.cxx b/Testing/Code/Common/otbCommonTests3.cxx
index 24c99402bf877722461dc610abbb31eb1249e670..50df8936240ae3f2a974f545e28908129974027c 100644
--- a/Testing/Code/Common/otbCommonTests3.cxx
+++ b/Testing/Code/Common/otbCommonTests3.cxx
@@ -26,6 +26,8 @@ void RegisterTests()
 {
   REGISTER_TEST(otbMultiToMonoChannelExtractROI);
   REGISTER_TEST(otbMultiToMonoChannelExtractROINew);
+  REGISTER_TEST(otbITKExtractImageFilterROITestRegion);
+  REGISTER_TEST(otbMultiChannelExtractROITestRegion);
   REGISTER_TEST(otbPointSetSourceTest);
   REGISTER_TEST(otbDrawLineSpatialObjectNew);
   REGISTER_TEST(otbDrawLineSpatialObject);
@@ -35,4 +37,9 @@ void RegisterTests()
   REGISTER_TEST(otbPathListToHistogramGeneratorNew);
   REGISTER_TEST(otbPathListToHistogramGenerator);
   REGISTER_TEST(otbLineSpatialObjectListToPointSetFilterNew);
+  REGISTER_TEST(otbITKExtractImageFilterROITestRegion);
+  REGISTER_TEST(otbITKVectorIndexSelectionCastTestRegion);
+  REGISTER_TEST(otbMultiToMonoChannelExtractROITestRegion);
+  REGISTER_TEST(otbMultiChannelExtractROITestRegion);
+  REGISTER_TEST(otbExtractROITestRegion);
 }
diff --git a/Testing/Code/Common/otbExtractROICompareRegionsImplementations.cxx b/Testing/Code/Common/otbExtractROICompareRegionsImplementations.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..60f3cbff90277211a68c1c2e99e3a8d4bdf04ce8
--- /dev/null
+++ b/Testing/Code/Common/otbExtractROICompareRegionsImplementations.cxx
@@ -0,0 +1,339 @@
+/*=========================================================================
+
+  Program:   ORFEO Toolbox
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+
+  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+  See OTBCopyright.txt for details.
+
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+
+#include "otbImage.h"
+#include "otbVectorImage.h"
+
+#include "itkExtractImageFilter.h"
+#include "itkVectorIndexSelectionCastImageFilter.h"
+#include "otbExtractROI.h"
+#include "otbMultiChannelExtractROI.h"
+#include "otbMultiToMonoChannelExtractROI.h"
+
+
+typedef unsigned char PixelType;
+
+typedef otb::Image<PixelType>  ImageType;
+typedef otb::VectorImage<PixelType> VectorImageType;
+
+typedef ImageType::RegionType      RegionType;
+typedef ImageType::IndexType       IndexType;
+typedef IndexType::IndexValueType  IndexValueType;
+typedef ImageType::SizeType        SizeType;
+typedef SizeType::SizeValueType    SizeValueType;
+
+// ITK filters
+typedef itk::ExtractImageFilter<ImageType, ImageType>
+  ExtractImageFilterType;
+typedef itk::VectorIndexSelectionCastImageFilter<VectorImageType, ImageType>
+  VectorIndexSelectionCastImageFilterType;
+
+// OTB filters
+typedef otb::ExtractROI<PixelType, PixelType>
+  ExtractROIType;
+typedef otb::MultiChannelExtractROI<PixelType, PixelType>
+  MultiChannelExtractROIType;
+typedef otb::MultiToMonoChannelExtractROI<PixelType, PixelType>
+  MultiToMonoChannelExtractROIType;
+
+
+ImageType::Pointer makeImage(IndexValueType startX, IndexValueType startY, SizeValueType sizeX, SizeValueType sizeY)
+{
+  ImageType::Pointer im = ImageType::New();
+
+  RegionType region;
+
+  region.SetIndex(0, startX);
+  region.SetIndex(1, startY);
+  region.SetSize(0, sizeX);
+  region.SetSize(0, sizeY);
+
+  im->SetRegions(region);
+  im->Allocate();
+
+  return im;
+}
+
+VectorImageType::Pointer makeVectorImage(IndexValueType startX, IndexValueType startY, SizeValueType sizeX, SizeValueType sizeY, int nbChannel = 3)
+{
+  VectorImageType::Pointer im = VectorImageType::New();
+
+  RegionType region;
+
+  region.SetIndex(0, startX);
+  region.SetIndex(1, startY);
+  region.SetSize(0, sizeX);
+  region.SetSize(0, sizeY);
+
+  im->SetRegions(region);
+  im->SetNumberOfComponentsPerPixel(nbChannel);
+  im->Allocate();
+
+  return im;
+}
+
+int otbITKExtractImageFilterROITestRegion(int argc, char * argv[])
+{
+  ImageType::Pointer in;
+  RegionType extractionRegion;
+  ExtractImageFilterType::Pointer extract;
+
+  in = makeImage(0,0,100,100);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = ExtractImageFilterType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  in = makeImage(20,20,100,100);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = ExtractImageFilterType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
+
+
+int otbITKVectorIndexSelectionCastTestRegion(int argc, char * argv[])
+{
+  VectorImageType::Pointer in;
+  RegionType extractionRegion;
+  VectorIndexSelectionCastImageFilterType::Pointer extract;
+
+  in = makeVectorImage(0,0,100,100,3);
+
+  extract = VectorIndexSelectionCastImageFilterType::New();
+  extract->SetInput(in);
+  extract->SetIndex(1);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != in->GetLargestPossibleRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  in = makeVectorImage(50,50,100,100,3);
+
+  extract = VectorIndexSelectionCastImageFilterType::New();
+  extract->SetInput(in);
+  extract->SetIndex(1);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != in->GetLargestPossibleRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
+
+
+int otbMultiToMonoChannelExtractROITestRegion(int argc, char * argv[])
+{
+  VectorImageType::Pointer in;
+  RegionType extractionRegion;
+  MultiToMonoChannelExtractROIType::Pointer extract;
+
+  in = makeVectorImage(0,0,100,100,3);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = MultiToMonoChannelExtractROIType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  in = makeVectorImage(20,20,100,100,3);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = MultiToMonoChannelExtractROIType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
+
+
+
+int otbMultiChannelExtractROITestRegion(int argc, char * argv[])
+{
+  VectorImageType::Pointer in;
+  RegionType extractionRegion;
+  MultiChannelExtractROIType::Pointer extract;
+
+  in = makeVectorImage(0,0,100,100,3);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = MultiChannelExtractROIType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  in = makeVectorImage(20,20,100,100,3);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = MultiChannelExtractROIType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
+
+
+int otbExtractROITestRegion(int argc, char * argv[])
+{
+  ImageType::Pointer in;
+  RegionType extractionRegion;
+  ExtractROIType::Pointer extract;
+
+  in = makeImage(0,0,100,100);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = ExtractROIType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  in = makeImage(20,20,100,100);
+
+  extractionRegion.SetIndex(0, 50);
+  extractionRegion.SetIndex(1, 50);
+  extractionRegion.SetSize(0, 10);
+  extractionRegion.SetSize(1, 10);
+
+  extract = ExtractROIType::New();
+  extract->SetInput(in);
+  extract->SetExtractionRegion(extractionRegion);
+  extract->UpdateOutputInformation();
+
+  std::cout << "Input LargestPossibleRegion : " << in->GetLargestPossibleRegion() << std::endl;
+  std::cout << "ExtractionRegion : " << extract->GetExtractionRegion() << std::endl;
+  std::cout << "Output LargestPossibleRegion : " << extract->GetOutput()->GetLargestPossibleRegion() << std::endl;
+
+  if (extract->GetOutput()->GetLargestPossibleRegion() != extract->GetExtractionRegion())
+    {
+    return EXIT_FAILURE;
+    }
+
+  return EXIT_SUCCESS;
+}
+
+