diff --git a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
index d8782e61ecffe00f06f38642f25fde1dbb36f327..834a6d3da072adf5c4dbc385d46db7931132de97 100644
--- a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
+++ b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
@@ -623,6 +623,11 @@ otb_add_test(NAME bfTvClampImageFilterTest COMMAND otbImageManipulationTestDrive
   ${TEMP}/bfTvClampImageFilterTest_Output.tif
   )
 
+otb_add_test(NAME bfTvClampImageFilterConversionTest COMMAND otbImageManipulationTestDriver
+  otbClampImageFilterConversionTest
+  ${INPUTDATA}/veryverySmallFSATSW.tif
+  )
+
 otb_add_test(NAME coTvConcatenateVectorImageFilter COMMAND otbImageManipulationTestDriver
   --compare-image ${NOTOL}
   ${BASELINE}/coConcatenateVectorImageFilterOutput1.hdr
diff --git a/Modules/Filtering/ImageManipulation/test/otbClampImageFilter.cxx b/Modules/Filtering/ImageManipulation/test/otbClampImageFilter.cxx
index 82deca5f4fc74917e5e3bc5d78bf1acf5e0a41c6..fa48af6d6ec69b0451d5240647a98713a6106802 100644
--- a/Modules/Filtering/ImageManipulation/test/otbClampImageFilter.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbClampImageFilter.cxx
@@ -21,10 +21,14 @@
 
 #include "otbClampImageFilter.h"
 #include "otbImage.h"
+#include "otbVectorImage.h"
+#include <limits>
 
 #include "otbImageFileReader.h"
 #include "otbImageFileWriter.h"
 
+#include "itkImageRegionConstIterator.h"
+
 /** Pixel typedefs */
 typedef double                                      InputPixelType;
 typedef unsigned int                                OutputPixelType;
@@ -65,3 +69,208 @@ int otbClampImageFilterTest(int itkNotUsed(argc), char* argv[])
 
   return EXIT_SUCCESS;
 }
+
+template < class InImageType , class OutImageType >
+typename OutImageType::Pointer
+Cross ( std::string const & inputFileName )
+{
+  typedef otb::ImageFileReader< InImageType > ReaderType;
+  typedef otb::ClampImageFilter< InImageType , OutImageType > ClampFilter;
+  typename ReaderType::Pointer reader ( ReaderType::New() );
+  reader->SetFileName( inputFileName );
+  typename ClampFilter::Pointer clamp ( ClampFilter::New() );
+  clamp->SetInput( reader->GetOutput() );
+  clamp->Update();
+  return clamp->GetOutput();
+}
+
+typedef otb::VectorImage<double> ImageRefType;
+
+template <class ImageType >
+bool
+CompareImageReal( const ImageRefType::Pointer imRef , 
+                  const ImageType * im )
+{
+  typedef typename ImageType::PixelType RealPixelType;
+
+  RealPixelType min = std::numeric_limits< RealPixelType >::lowest();
+  RealPixelType max = std::numeric_limits< RealPixelType >::max();
+  auto itRef = itk::ImageRegionConstIterator< ImageRefType >( imRef , 
+    imRef->GetLargestPossibleRegion() );
+  auto it = itk::ImageRegionConstIterator< ImageType >( im , 
+    im->GetLargestPossibleRegion() );
+  itRef.GoToBegin();
+  it.GoToBegin();
+  RealPixelType val;
+  double ref;
+  while ( !it.IsAtEnd() )
+    {
+    val = it.Get();
+    ref = itRef.Get()[0];
+    if ( ref > static_cast<double>( max ) && val != max ) 
+      {
+      return false;
+      }
+    else if ( ref < static_cast<double>( min ) && val != min ) 
+      {
+      return false;
+      }
+    else if ( ref != static_cast<double>( val ) )
+      {
+      return false;
+      }
+    ++it;
+    ++itRef;
+    }
+    return true;
+}
+
+template <class ImageType >
+bool
+CompareVectorReal( const ImageRefType::Pointer imRef , 
+                   const ImageType * im)
+{
+  typedef typename ImageType::InternalPixelType RealPixelType;
+  RealPixelType min = std::numeric_limits< RealPixelType >::lowest();
+  RealPixelType max = std::numeric_limits< RealPixelType >::max();
+  auto itRef = itk::ImageRegionConstIterator< ImageRefType >( imRef , 
+    imRef->GetLargestPossibleRegion() );
+  auto it = itk::ImageRegionConstIterator< ImageType >( im , 
+    im->GetLargestPossibleRegion() );
+  itRef.GoToBegin();
+  it.GoToBegin();
+  unsigned int nbChanel = im->GetNumberOfComponentsPerPixel ();
+  RealPixelType val;
+  double ref;
+  while ( !it.IsAtEnd() )
+    {
+    for ( unsigned int i = 0 ; i < nbChanel ; i++ )
+      {
+      val = it.Get()[i];
+      ref = itRef.Get()[i];
+      if ( ref > static_cast<double>( max ) && val != max ) 
+        {
+        return false;
+        }
+      else if ( ref < static_cast<double>( min ) && val != min ) 
+        {
+        return false;
+        }
+      else if ( ref != static_cast<double>( val ) )
+        {
+        return false;
+        }
+      }
+    ++it;
+    ++itRef;
+    }
+  return true;
+}
+
+template <class ImageType >
+bool
+CompareImageComplex( const ImageRefType::Pointer imageRef , 
+                     const ImageType * im )
+{
+  typedef typename ImageType::PixelType ComplexType;
+  typedef typename ComplexType::value_type RealType;
+
+  RealType min = std::numeric_limits< RealType >::lowest();
+  RealType max = std::numeric_limits< RealType >::max();
+  auto itRef = itk::ImageRegionConstIterator< ImageRefType >( imageRef , 
+    imageRef->GetLargestPossibleRegion() );
+  auto it = itk::ImageRegionConstIterator< ImageType >( im , 
+    im->GetLargestPossibleRegion() );
+  itRef.GoToBegin();
+  it.GoToBegin();
+  ComplexType val;
+  double reRef , imRef;
+  while ( !it.IsAtEnd() )
+    {
+    val = it.Get();
+    reRef = itRef.Get()[0];
+    imRef = itRef.Get()[1];
+    if ( ( reRef > static_cast<double>( max ) && val.real != max )
+      || ( imRef > static_cast<double>( max ) && val.imag != max ) ) 
+      {
+      return false;
+      }
+    else if ( ( reRef < static_cast<double>( min ) && val.real != min )
+           || ( imRef < static_cast<double>( min ) && val.imag != min ) ) 
+      {
+      return false;
+      }
+    else if ( reRef != static_cast<double>( val.real )
+           || imRef != static_cast<double>( val.imag ) )
+      {
+      return false;
+      }
+    ++it;
+    ++itRef;
+    }
+    return true;
+}
+
+template <class ImageType >
+bool
+CompareVectorComplex( const ImageRefType::Pointer imageRef , 
+                     const ImageType * im )
+{
+  typedef typename ImageType::InternalPixelType ComplexType;
+  typedef typename ComplexType::value_type RealType;
+
+  RealType min = std::numeric_limits< RealType >::lowest();
+  RealType max = std::numeric_limits< RealType >::max();
+  auto itRef = itk::ImageRegionConstIterator< ImageRefType >( imageRef , 
+    imageRef->GetLargestPossibleRegion() );
+  auto it = itk::ImageRegionConstIterator< ImageType >( im , 
+    im->GetLargestPossibleRegion() );
+  itRef.GoToBegin();
+  it.GoToBegin();
+  unsigned int nbChanel = im->GetNumberOfComponentsPerPixel ();
+  ComplexType val;
+  double reRef , imRef;
+  while ( !it.IsAtEnd() )
+    {
+    
+    for (unsigned int i = 0 ; i < nbChanel ; i++ )
+      {
+      val = it.Get()[i];
+      reRef = itRef.Get()[ 2 * i ];
+      imRef = itRef.Get()[ 2 * i + 1 ];
+      if ( ( reRef > static_cast<double>( max ) && val.real != max )
+        || ( imRef > static_cast<double>( max ) && val.imag != max ) ) 
+        {
+        return false;
+        }
+      else if ( ( reRef < static_cast<double>( min ) && val.real != min )
+             || ( imRef < static_cast<double>( min ) && val.imag != min ) ) 
+        {
+        return false;
+        }
+      else if ( reRef != static_cast<double>( val.real )
+             || imRef != static_cast<double>( val.imag ) )
+        {
+        return false;
+        }
+      }
+    ++it;
+    ++itRef;
+    }
+    return true;
+}
+
+int otbClampImageFilterConversionTest(int itkNotUsed(argc), char* argv[])
+{
+  typedef otb::ImageFileReader< ImageRefType > ReaderType;
+  ReaderType::Pointer reader ( ReaderType::New() );
+  reader->SetFileName( argv[1] );
+  reader->Update();
+  ImageRefType::Pointer imageRef = reader->GetOutput();
+  otb::VectorImage<int>::Pointer image = 
+    Cross < otb::VectorImage< std::complex<float> >  , otb::VectorImage<int> > ( argv[1] );
+  bool test = CompareVectorReal < otb::VectorImage<int> >( imageRef , image );
+  if (test)
+    return EXIT_SUCCESS;
+  return 42;
+}
diff --git a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
index e35453dde081e4f4d1ecf4c8618518fbce0c364d..c5b59f8ef2d62eb790adf085e5c9121db5f28d4a 100644
--- a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
@@ -85,6 +85,7 @@ void RegisterTests()
   REGISTER_TEST(otbMultiplyByScalarImageFilterTest);
   REGISTER_TEST(otbClampImageFilterNew);
   REGISTER_TEST(otbClampImageFilterTest);
+  REGISTER_TEST(otbClampImageFilterConversionTest);
   REGISTER_TEST(otbConcatenateVectorImageFilter);
   REGISTER_TEST(otbBinaryImageMinimalBoundingRegionCalculatorNew);
   REGISTER_TEST(otbVectorRescaleIntensityImageFilterNew);