diff --git a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
index ff4f4b01e4be8c30476b4aef78dadaf9819e606f..4a35145462f48ac18220bafc08c5ab2998426f35 100644
--- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
+++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx
@@ -76,7 +76,7 @@ private:
     SetDocName("Polygon Class Statistics");
     SetDocLongDescription("The application processes a set of geometries "
       "intended for training (they should have a field giving the associated "
-      "class). The geometries are analysed against a support image to compute "
+      "class). The geometries are analyzed against a support image to compute "
       "statistics : \n"
       "  - number of samples per class\n"
       "  - number of samples per geometry\n"
@@ -92,17 +92,17 @@ private:
 
     AddDocTag(Tags::Learning);
 
-    AddParameter(ParameterType_InputImage,  "in",   "InputImage");
+    AddParameter(ParameterType_InputImage,  "in",   "Input image");
     SetParameterDescription("in", "Support image that will be classified");
 
-    AddParameter(ParameterType_InputImage,  "mask",   "InputMask");
+    AddParameter(ParameterType_InputImage,  "mask",   "Input validity mask");
     SetParameterDescription("mask", "Validity mask (only pixels corresponding to a mask value greater than 0 will be used for statistics)");
     MandatoryOff("mask");
     
     AddParameter(ParameterType_InputFilename, "vec", "Input vectors");
-    SetParameterDescription("vec","Input geometries to analyse");
+    SetParameterDescription("vec","Input geometries to analyze");
     
-    AddParameter(ParameterType_OutputFilename, "out", "Output Statistics");
+    AddParameter(ParameterType_OutputFilename, "out", "Output XML statistics file");
     SetParameterDescription("out","Output file to store statistics (XML format)");
 
     AddParameter(ParameterType_ListView, "field", "Field Name");
@@ -155,6 +155,22 @@ private:
           }
         }
       }
+
+     // Check that the extension of the output parameter is XML (mandatory for
+     // StatisticsXMLFileWriter)
+     // Check it here to trigger the error before polygons analysis
+     
+     if ( HasValue("out") )
+       {
+       // Store filename extension
+       // Check that the right extension is given : expected .xml
+       const std::string extension = itksys::SystemTools::GetFilenameLastExtension(this->GetParameterString("out"));
+
+       if (itksys::SystemTools::LowerCase(extension) != ".xml")
+         {
+         otbAppLogFATAL( << extension << " is a wrong extension for parameter \"out\": Expected .xml" );
+         }
+       }
   }
 
   void DoExecute() ITK_OVERRIDE
@@ -223,7 +239,7 @@ private:
   filter->SetLayerIndex(this->GetParameterInt("layer"));
   filter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
 
-  AddProcess(filter->GetStreamer(),"Analyse polygons...");
+  AddProcess(filter->GetStreamer(),"Analyze polygons...");
   filter->Update();
   
   FilterType::ClassCountMapType &classCount = filter->GetClassCountOutput()->Get();
diff --git a/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
index dbe4c4bce0bfea5e15ed9636d0c65dc8606f1540..76c111e85879eb6064d7e7a7d09977c3baa848a8 100644
--- a/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
+++ b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
@@ -264,7 +264,7 @@ private:
       {
       // fft ttransform
       bool shift = GetParameterInt( "mode.fft.shift");
-      typedef otb::Image< std::complex<OutputPixelType> >          ComplexOutputImageType;
+      typedef otb::Image< std::complex<OutputPixelType> > ComplexOutputImageType;
 
       if (dir == 0 )
         {
diff --git a/Modules/Applications/AppImageUtils/test/CMakeLists.txt b/Modules/Applications/AppImageUtils/test/CMakeLists.txt
index d2852f4d46be0c1a130e293c101fdd1934e60aae..d428cc87bbeae493384dbbc4be46fb87b0807cc7 100644
--- a/Modules/Applications/AppImageUtils/test/CMakeLists.txt
+++ b/Modules/Applications/AppImageUtils/test/CMakeLists.txt
@@ -173,6 +173,14 @@ otb_test_application(NAME apTvUtExtractROIRightInputFile
                              ${INPUTDATA}/couleurs_extrait.png
                              ${TEMP}/apTvUtExtractROIRightInputFile.tif)
 
+otb_test_application(NAME apTvUtExtractROIComplexInputFile
+                     APP  ExtractROI
+                     OPTIONS -in ${INPUTDATA}/complexInputCfloat.tif
+                             -out ${TEMP}/apTvUtExtractROIComplexInputFile.tif cfloat
+                     VALID   --compare-image ${NOTOL}
+                             ${INPUTDATA}/complexInputCfloat.tif
+                             ${TEMP}/apTvUtExtractROIComplexInputFile.tif)
+
 
 #----------- Rescale TESTS ----------------
 otb_test_application(NAME  apTvUtRescaleTest
@@ -207,6 +215,11 @@ otb_test_application(NAME apTuUtReadImageInfoExtendedFilename_reader
                      OPTIONS -in ${INPUTDATA}/ToulouseExtract_WithGeom.tif?&skipgeom=true&skipcarto=true
                      )
 
+otb_test_application(NAME apTuUtReadComplexImageInfoFilename_reader
+                     APP  ReadImageInfo
+                     OPTIONS -in ${INPUTDATA}/complexInputCfloat.tif
+                     )
+
 
 set(TESTNAME
 "gd-pleiades-1" #LARGEINPUT{PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2}
diff --git a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
index 7b7e5ef1e232e9b9e041689abf81b961f80dae51..2f279a3565e5e5d9e551017de4dcaebbfe17326c 100644
--- a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
+++ b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx
@@ -29,7 +29,7 @@
 #include "otbReflectanceToRadianceImageFilter.h"
 #include "otbReflectanceToSurfaceReflectanceImageFilter.h"
 #include "itkMultiplyImageFilter.h"
-#include "otbClampVectorImageFilter.h"
+#include "otbClampImageFilter.h"
 #include "otbSurfaceAdjacencyEffectCorrectionSchemeFilter.h"
 #include "otbGroundSpacingImageFunction.h"
 #include "vnl/vnl_random.h"
@@ -92,7 +92,7 @@ public:
 
   typedef itk::MultiplyImageFilter<DoubleVectorImageType,DoubleImageType,DoubleVectorImageType>         ScaleFilterOutDoubleType;
 
-  typedef otb::ClampVectorImageFilter<DoubleVectorImageType,
+  typedef otb::ClampImageFilter<DoubleVectorImageType,
                                       DoubleVectorImageType>              ClampFilterType;
 
   typedef ReflectanceToSurfaceReflectanceImageFilter<DoubleVectorImageType,
diff --git a/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx b/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx
index 07f4e0dadce61579cef63c40012c0190bdf1a6cf..0709ad8007ff37fd6dafd0d3fa6b9a00d59ce738 100644
--- a/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx
+++ b/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx
@@ -60,7 +60,7 @@ private:
     AddDocTag(Tags::Calibration);
     AddDocTag(Tags::SAR);
 
-    AddParameter(ParameterType_ComplexInputImage,  "in", "Input Image");
+    AddParameter(ParameterType_InputImage,  "in", "Input Image");
     SetParameterDescription("in", "Input complex image");
 
     AddParameter(ParameterType_OutputImage,  "out", "Output Image");
diff --git a/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx b/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx
index 155795417f8c78b96317cd7676e4ed1294be90b4..796d3f4e26a9fd34b7e7891f81846dab6fa95c2a 100644
--- a/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx
+++ b/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx
@@ -31,7 +31,7 @@
 #include "otbSinclairToReciprocalCoherencyMatrixFunctor.h"
 #include "otbPerBandVectorImageFilter.h"
 #include "itkMeanImageFilter.h"
-#include "otbNRIBandImagesToOneNComplexBandsImage.h"
+// #include "otbNRIBandImagesToOneNComplexBandsImage.h"
 #include "otbImageListToVectorImageFilter.h"
 #include "otbImageList.h"
 
@@ -109,21 +109,21 @@ private:
 
     AddDocTag(Tags::SAR);
 
-    AddParameter(ParameterType_ComplexInputImage,  "inhh",   "Input Image");
+    AddParameter(ParameterType_InputImage,  "inhh",   "Input Image");
     SetParameterDescription("inhh", "Input image (HH)");
     
-    AddParameter(ParameterType_ComplexInputImage,  "inhv",   "Input Image");
+    AddParameter(ParameterType_InputImage,  "inhv",   "Input Image");
     SetParameterDescription("inhv", "Input image (HV)");
     MandatoryOff("inhv");
     
-    AddParameter(ParameterType_ComplexInputImage,  "invh",   "Input Image");
+    AddParameter(ParameterType_InputImage,  "invh",   "Input Image");
     SetParameterDescription("invh", "Input image (VH)");
     MandatoryOff("invh");
     
-    AddParameter(ParameterType_ComplexInputImage,  "invv",   "Input Image");
+    AddParameter(ParameterType_InputImage,  "invv",   "Input Image");
     SetParameterDescription("invv", "Input image (VV)");
     
-    AddParameter(ParameterType_ComplexOutputImage, "out",  "Output Image");
+    AddParameter(ParameterType_OutputImage, "out",  "Output Image");
     SetParameterDescription("out", "Output image");
     
     AddParameter(ParameterType_Choice, "decomp", "Decompositions");
@@ -201,7 +201,7 @@ private:
 		
 		m_MeanFilter->SetInput(m_SRFilter->GetOutput());
 		m_HAFilter->SetInput(m_MeanFilter->GetOutput());
-		SetParameterComplexOutputImage("out", m_HAFilter->GetOutput() );
+		SetParameterOutputImage("out", m_HAFilter->GetOutput() );
     
 		break;
         
@@ -220,7 +220,7 @@ private:
 		
 		m_MeanFilter->SetInput(m_SRFilter->GetOutput());
 		m_BarnesFilter->SetInput(m_MeanFilter->GetOutput());
-		SetParameterComplexOutputImage("out", m_BarnesFilter->GetOutput() );
+		SetParameterOutputImage("out", m_BarnesFilter->GetOutput() );
     
 		break;
         
@@ -239,7 +239,7 @@ private:
 		
 		m_MeanFilter->SetInput(m_SRFilter->GetOutput());
 		m_HuynenFilter->SetInput(m_MeanFilter->GetOutput());
-		SetParameterComplexOutputImage("out", m_HuynenFilter->GetOutput() );
+		SetParameterOutputImage("out", m_HuynenFilter->GetOutput() );
     
 		break;
         
@@ -257,7 +257,7 @@ private:
         m_Concatener->SetInput( m_ImageList );        
         m_PauliFilter->SetInput(m_Concatener->GetOutput());
         
-		SetParameterComplexOutputImage("out", m_PauliFilter->GetOutput() );
+		SetParameterOutputImage("out", m_PauliFilter->GetOutput() );
     
 		break;
 	  }
diff --git a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
index 9c8c06211234eef4f9f8207c1762e6f10fbe88fb..657643541d477617e13a196a4a2853f76920f569 100644
--- a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
+++ b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx
@@ -232,7 +232,7 @@ private:
 
     AddDocTag(Tags::SAR);
 
-    AddParameter(ParameterType_ComplexInputImage,  "inc",   "Input : multi-band complex image");
+    AddParameter(ParameterType_InputImage,  "inc",   "Input : multi-band complex image");
     SetParameterDescription("inc", "Input : multi-band complex image");
     MandatoryOff("inc");
     
@@ -241,23 +241,23 @@ private:
     MandatoryOff("inf");
 
 
-    AddParameter(ParameterType_ComplexInputImage,  "inhh",   "Input : one-band complex image (HH)");
+    AddParameter(ParameterType_InputImage,  "inhh",   "Input : one-band complex image (HH)");
     SetParameterDescription("inhh", "Input : one-band complex image (HH)");
     MandatoryOff("inhh");
     
-    AddParameter(ParameterType_ComplexInputImage,  "inhv",   "Input : one-band complex image (HV)");
+    AddParameter(ParameterType_InputImage,  "inhv",   "Input : one-band complex image (HV)");
     SetParameterDescription("inhv", "Input : one-band complex image (HV)");
     MandatoryOff("inhv");
     
-    AddParameter(ParameterType_ComplexInputImage,  "invh",   "Input : one-band complex image (VH)");
+    AddParameter(ParameterType_InputImage,  "invh",   "Input : one-band complex image (VH)");
     SetParameterDescription("invh", "Input : one-band complex image (VH)");
     MandatoryOff("invh");
     
-    AddParameter(ParameterType_ComplexInputImage,  "invv",   "Input : one-band complex image (VV)");
+    AddParameter(ParameterType_InputImage,  "invv",   "Input : one-band complex image (VV)");
     SetParameterDescription("invv", "Input : one-band complex image (VV)");
     MandatoryOff("invv");
     
-    AddParameter(ParameterType_ComplexOutputImage, "outc",  "Output Complex Image");
+    AddParameter(ParameterType_OutputImage, "outc",  "Output Complex Image");
     SetParameterDescription("outc", "Output Complex image.");
     MandatoryOff("outc");
     
@@ -509,7 +509,7 @@ private:
 		m_RCohSRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
 		m_RCohSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
 		
-		SetParameterComplexOutputImage("outc", m_RCohSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output :  6 complex channels
+		SetParameterOutputImage("outc", m_RCohSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output :  6 complex channels
 		
 		break;
 
@@ -526,7 +526,7 @@ private:
 		m_RCovSRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
 		m_RCovSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
 		
-		SetParameterComplexOutputImage("outc", m_RCovSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output :  6 complex channels
+		SetParameterOutputImage("outc", m_RCovSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output :  6 complex channels
 		
 		break;
 		
@@ -544,7 +544,7 @@ private:
 		m_RCCSRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
 		m_RCCSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
 		
-		SetParameterComplexOutputImage("outc", m_RCCSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output :  6 complex channels
+		SetParameterOutputImage("outc", m_RCCSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output :  6 complex channels
 		
 		break;
 		
@@ -565,7 +565,7 @@ private:
 		m_RCCDFilter = RCCDFilterType::New();
 		m_RCCDFilter->SetInput(GetParameterComplexDoubleVectorImage("inc"));
 		
-		SetParameterComplexOutputImage("outc", m_RCCDFilter->GetOutput() ); // input : 6 complex channels | 3 complex channels
+		SetParameterOutputImage("outc", m_RCCDFilter->GetOutput() ); // input : 6 complex channels | 3 complex channels
 		
 		break;
 
@@ -575,7 +575,7 @@ private:
 		m_RCRCFilter = RCRCFilterType::New();
 		m_RCRCFilter->SetInput(GetParameterComplexDoubleVectorImage("inc"));
 		
-		SetParameterComplexOutputImage("outc", m_RCRCFilter->GetOutput() ); // input : 6 complex channels | 6 complex channels
+		SetParameterOutputImage("outc", m_RCRCFilter->GetOutput() ); // input : 6 complex channels | 6 complex channels
 		
 		break;
 		
@@ -586,7 +586,7 @@ private:
 		m_RLCRCCFilter = RLCRCCFilterType::New();
 		m_RLCRCCFilter->SetInput(GetParameterComplexDoubleVectorImage("inc"));
 		
-		SetParameterComplexOutputImage("outc", m_RLCRCCFilter->GetOutput() ); // input : 6 complex channels | output : 6 complex channels
+		SetParameterOutputImage("outc", m_RLCRCCFilter->GetOutput() ); // input : 6 complex channels | output : 6 complex channels
 		
 		break;
 		
@@ -597,7 +597,7 @@ private:
 		
 		m_MRCFilter->SetInput(GetParameterDoubleVectorImage("inf"));
 		
-		SetParameterComplexOutputImage("outc", m_MRCFilter->GetOutput() ); // input : 16 real channels | output : 6 complex channels
+		SetParameterOutputImage("outc", m_MRCFilter->GetOutput() ); // input : 16 real channels | output : 6 complex channels
 		
 		break;
 		
@@ -615,7 +615,7 @@ private:
 		m_CohSRFilter->SetInputVH(GetParameterComplexDoubleImage("invh"));
 		m_CohSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
 		
-		SetParameterComplexOutputImage("outc", m_CohSRFilter->GetOutput() ); // input : 4 x 1 complex channel | 10 complex channels
+		SetParameterOutputImage("outc", m_CohSRFilter->GetOutput() ); // input : 4 x 1 complex channel | 10 complex channels
 		
 		break;
 		
@@ -630,7 +630,7 @@ private:
 		m_CovSRFilter->SetInputVH(GetParameterComplexDoubleImage("invh"));
 		m_CovSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
 		
-		SetParameterComplexOutputImage("outc", m_CovSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
+		SetParameterOutputImage("outc", m_CovSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
 		
 		break;
 		
@@ -644,7 +644,7 @@ private:
 		m_CCSRFilter->SetInputVH(GetParameterComplexDoubleImage("invh"));
 		m_CCSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
 		
-		SetParameterComplexOutputImage("outc", m_CCSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
+		SetParameterOutputImage("outc", m_CCSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
 		
 		break;
 		
diff --git a/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx b/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx
index 236ac0789fa1e8e2077e9903bcc5c4c0e8aa9733..3db956847e1dba701365e3c1823e8d5370525063 100644
--- a/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx
+++ b/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx
@@ -86,7 +86,7 @@ private:
 
     AddDocTag(Tags::SAR);
 
-    AddParameter(ParameterType_ComplexInputImage,  "in",   "Input Image");
+    AddParameter(ParameterType_InputImage,  "in",   "Input Image");
     SetParameterDescription("in", "Input image.");
     AddParameter(ParameterType_OutputImage, "out",  "Output Image");
     SetParameterDescription("out", "Output image.");
diff --git a/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx b/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx
index 39db311e799737b730973d68c5156d273366896b..ec91b7e53b6c04b398a1e3d854475758d1f9d21e 100644
--- a/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx
+++ b/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx
@@ -75,7 +75,7 @@ private:
     AddDocTag(Tags::SAR);
     AddDocTag(Tags::Manip);
     // Input images
-    AddParameter(ParameterType_ComplexInputImage,  "in",   "Input Image");
+    AddParameter(ParameterType_InputImage,  "in",   "Input Image");
     SetParameterDescription("in", "Input image (complex single band)");
 
     // Outputs
@@ -110,7 +110,7 @@ private:
     m_Modulus = ModulusFilterType::New();
     m_Phase = PhaseFilterType::New();
 
-    ComplexFloatVectorImageType::Pointer inImage = GetParameterComplexImage("in");
+    ComplexFloatVectorImageType::Pointer inImage = GetParameterComplexFloatVectorImage("in");
 
     if (inImage->GetNumberOfComponentsPerPixel() != 1)
     {
diff --git a/Modules/Core/ImageBase/include/otbDefaultConvertPixelTraits.h b/Modules/Core/ImageBase/include/otbDefaultConvertPixelTraits.h
index 3339a54a1a39b6be9d8ddd5dc17a757289a87213..be11633e7b98a62cded643e040e26aa76abd5d4c 100644
--- a/Modules/Core/ImageBase/include/otbDefaultConvertPixelTraits.h
+++ b/Modules/Core/ImageBase/include/otbDefaultConvertPixelTraits.h
@@ -1,5 +1,4 @@
 /*
- * Copyright (C) 1999-2011 Insight Software Consortium
  * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
  *
  * This file is part of Orfeo Toolbox
@@ -19,322 +18,67 @@
  * limitations under the License.
  */
 
-
 #ifndef otbDefaultConvertPixelTraits_h
 #define otbDefaultConvertPixelTraits_h
 
-#include "itkOffset.h"
-#include "itkVector.h"
-#include "itkMatrix.h"
+#include "itkDefaultConvertPixelTraits.h"
 
-namespace otb
+namespace otb 
 {
 
-/** \class DefaultConvertPixelTraits
- *  \brief Traits class used to by ConvertPixels to convert blocks of pixels.
- *
- *  TOutputPixelType is the destination type. The input type is inferred
- *  by the templated static function Convert.
- *
- *  This implementation does a simple assignment operator, so if you are
- *  going from a higher bit representation to a lower bit one (int to
- *  char), you may want to specialize and add some sort of transfer function.
- *
- * \ingroup OTBImageBase
- */
-template<typename PixelType>
-class DefaultConvertPixelTraits
+
+template < typename PixelType>
+class DefaultConvertPixelTraits 
+: public itk::DefaultConvertPixelTraits < PixelType >
 {
 public:
-  /** Determine the pixel data type. */
-  typedef typename PixelType::ComponentType ComponentType;
-
-  /** Return the number of components per pixel. */
-  static unsigned int GetNumberOfComponents()
-  { return PixelType::GetNumberOfComponents(); }
-
-  /** Return the nth component of the pixel. */
-  static ComponentType GetNthComponent(int c, const PixelType& pixel)
-  { return pixel.GetNthComponent(c); }
-
-  /** Set the nth component of the pixel. */
-  static void SetNthComponent(int c, PixelType& pixel, const ComponentType& v)
-  { pixel.SetNthComponent(c, v); }
-  static void SetNthComponent(int itkNotUsed(c), PixelType & pixel, const PixelType& v)
-  { pixel = v; }
+  typedef itk::DefaultConvertPixelTraits < PixelType > SuperClass;
+  using typename SuperClass::ComponentType;
 
-  /** Return a single scalar value from this pixel. */
-  static ComponentType GetScalarValue(const PixelType& pixel)
-  { return pixel.GetScalarValue(); }
+  using SuperClass::SetNthComponent;
 
+  static void SetNthComponent(int , PixelType & pixel, const PixelType & v)
+    {
+      pixel = v;
+    }  
 };
 
-#define OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(type)                    \
-template<>                                                               \
-class DefaultConvertPixelTraits<type>                                    \
-{                                                                        \
-public:                                                                  \
-  typedef type ComponentType;                                            \
-  static unsigned int GetNumberOfComponents()                            \
-    {                                                                    \
-      return 1;                                                          \
-    }                                                                    \
-  static void SetNthComponent(int , type& pixel, const ComponentType& v) \
-    {                                                                    \
-      pixel = v;                                                         \
-    }                                                                    \
-  static type GetScalarValue(const type& pixel)                          \
-    {                                                                    \
-      return pixel;                                                      \
-    }                                                                    \
-};
-
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(float)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(double)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(int)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(char)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(short)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned int)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(signed char)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned char)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned short)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(long)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned long)
-OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(bool)
-
-#undef OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL
-
-//
-//  Default traits for the Offset<> pixel type
-//
+template < typename T >
+class DefaultConvertPixelTraits < ::std::complex < T > > 
+: public itk::DefaultConvertPixelTraits < ::std::complex < T > >
+{
+public:
 
-#define OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(dimension)                  \
-template<>                                                               \
-class DefaultConvertPixelTraits< itk::Offset<dimension> >                \
-{                                                                        \
-public:                                                                  \
-  typedef itk::Offset<dimension>  TargetType;                            \
-  typedef TargetType::OffsetValueType  ComponentType;                    \
-  static unsigned int GetNumberOfComponents()                            \
-    {                                                                    \
-      return dimension;                                                  \
-    }                                                                    \
-  static void SetNthComponent(int i, TargetType & pixel, const ComponentType& v)   \
-    {                                                                    \
-      pixel[i] = v;                                                      \
-    }                                                                    \
-  static void SetNthComponent(int , TargetType & pixel, const TargetType& v)   \
-    {                                                                    \
-      pixel = v;                                                         \
-    }                                                                    \
-  static ComponentType GetScalarValue(const TargetType& pixel)           \
-    {                                                                    \
-      return pixel[0];                                                   \
-    }                                                                    \
+  typedef itk::DefaultConvertPixelTraits < ::std::complex < T > > SuperClass;
+  using typename SuperClass::TargetType ;
+  using typename SuperClass::ComponentType ;
+
+  using SuperClass::SetNthComponent ;
+
+  static void SetNthComponent(int , TargetType & pixel, const TargetType & v)
+    {
+      pixel = v;
+    }
+
+  static TargetType GetNthComponent ( int , const TargetType & pixel )
+    {
+    return pixel;
+    }
+
+  static ComponentType GetScalarValue(const TargetType& pixel)
+    {
+       /*
+       * This seems to be dead code, since the complex to scalar
+       * conversion is done by ConvertPixelBuffer
+       *
+       * Historically, it was returning std::norm, which causes
+       * compilation error on MacOSX 10.9.
+       * Now returns the equivalent implementation of std::norm.
+       */
+      return static_cast<ComponentType>( pixel.real()*pixel.real()
+                                         + pixel.imag()*pixel.imag() );
+    }
 };
 
-
-// Define traits for Offset<> from dimensions 1 to 5
-  OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(1)
-  OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(2)
-  OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(3)
-  OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(4)
-  OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(5)
-
-//
-//  Default traits for the pixel types deriving from FixedArray<>
-//
-
-#define OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(type,componenttype, dimension) \
-template<>                                                               \
-class DefaultConvertPixelTraits< type< componenttype, dimension> >       \
-{                                                                        \
-public:                                                                  \
-  typedef type< componenttype, dimension >  TargetType;                  \
-  typedef componenttype                     ComponentType;               \
-  static unsigned int GetNumberOfComponents()                            \
-    {                                                                    \
-      return dimension;                                                  \
-    }                                                                    \
-  static void SetNthComponent(int i, TargetType & pixel, const ComponentType& v)   \
-    {                                                                    \
-      pixel[i] = v;                                                      \
-    }                                                                    \
-  static void SetNthComponent(int , TargetType & pixel, const TargetType& v)   \
-    {                                                                    \
-      pixel = v;                                                      \
-    }                                                                    \
-  static ComponentType GetScalarValue(const TargetType& pixel)           \
-    {                                                                    \
-      return pixel[0];                                                   \
-    }                                                                    \
-};                                                                       \
-
-//
-//
-// Define traits for Classed deriving from FixedArray from dimensions 1 to 6
-// These classes include: Vector, CovariantVector and Point.
-//
-//
-#define OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, Type) \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,1) \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,2) \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,3) \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,4) \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,5) \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,6)
-
-#define OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_TYPES_MACRO(ArrayType) \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, char); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, signed char); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, unsigned char); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, short); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, unsigned short); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, int); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, unsigned int); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, long); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, unsigned long); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, float); \
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, double);
-
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_TYPES_MACRO(itk::Vector);
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_TYPES_MACRO(itk::CovariantVector);
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_TYPES_MACRO(itk::Point);
-  OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_TYPES_MACRO(itk::FixedArray);
-
-//
-//  End of Traits for the classes deriving from FixedArray.
-//
-//
-
-
-//
-//  Default traits for the pixel types deriving from Matrix<>
-//
-
-#define OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE(type,componenttype,rows,cols) \
-template<>                                                               \
-class DefaultConvertPixelTraits< type< componenttype, rows, cols > >     \
-{                                                                        \
-public:                                                                  \
-  typedef type< componenttype, rows, cols >  TargetType;                 \
-  typedef componenttype                     ComponentType;               \
-  static unsigned int GetNumberOfComponents()                            \
-    {                                                                    \
-      return rows * cols;                                                \
-    }                                                                    \
-  static void SetNthComponent(int i, TargetType & pixel, const ComponentType& v)   \
-    {                                                                    \
-      const unsigned int row = i / cols;                                 \
-      const unsigned int col = i % cols;                                 \
-      pixel[row][col] = v;                                               \
-    }                                                                    \
-  static void SetNthComponent(int , TargetType & pixel, const TargetType& v)   \
-    {                                                                    \
-      pixel = v;                                               \
-    }                                                                    \
-  static ComponentType GetScalarValue(const TargetType& pixel)           \
-    {                                                                    \
-      return pixel[0][0];                                                \
-    }                                                                    \
-};                                                                       \
-
-//
-//
-// Define traits for Classed deriving from Matrix from dimensions 1 to 6
-//
-//
-#define OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, Type) \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE(ArrayType,Type,1,1) \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE(ArrayType,Type,2,2) \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE(ArrayType,Type,3,3) \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE(ArrayType,Type,4,4) \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE(ArrayType,Type,5,5) \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE(ArrayType,Type,6,6)
-
-#define OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_TYPES_MACRO(ArrayType) \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, char); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, signed char); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, unsigned char); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, short); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, unsigned short); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, int); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, unsigned int); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, long); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, unsigned long); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, float); \
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_MACRO(ArrayType, double);
-
-//
-// Add here other classes that derive from Matrix or that have the same API
-//
-  OTB_DEFAULTCONVERTTRAITS_MATRIX_TYPE_ALL_TYPES_MACRO(itk::Matrix);
-
-//
-//  End of Traits for the classes deriving from Matrix.
-//
-//
-
-
-//
-//  Default traits for the pixel types deriving from std::complex<>
-//
-
-#define OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE( componenttype )                   \
-template<>                                                                       \
-class DefaultConvertPixelTraits< ::std::complex< componenttype > >               \
-{                                                                                \
-public:                                                                          \
-  typedef ::std::complex< componenttype>  TargetType;                            \
-  typedef componenttype                     ComponentType;                       \
-  static unsigned int GetNumberOfComponents()                                    \
-    {                                                                            \
-    return 2;                                                                    \
-    }                                                                            \
-  static void SetNthComponent(int i, TargetType & pixel, const ComponentType& v) \
-    {                                                                            \
-    if( i == 0 )                                                                 \
-      {                                                                          \
-      pixel = TargetType( v, pixel.imag() );                                     \
-      }                                                                          \
-    else                                                                         \
-      {                                                                          \
-      pixel = TargetType( pixel.real(), v );                                     \
-      }                                                                          \
-    }                                                                            \
-  static void SetNthComponent(int , TargetType & pixel, const TargetType& v)     \
-    {                                                                            \
-      pixel = v;                                                                 \
-    }                                                                            \
-  static ComponentType GetScalarValue(const TargetType& pixel)                   \
-    {                                                                            \
-      /*                                                                         \
-       * This seems to be dead code, since the complex to scalar                 \
-       * conversion is done by ConvertPixelBuffer                                \
-       *                                                                         \
-       * Historically, it was returning std::norm, which causes                  \
-       * compilation error on MacOSX 10.9.                                       \
-       * Now returns the equivalent implementation of std::norm.                 \
-       */                                                                        \
-      return static_cast<ComponentType>( pixel.real()*pixel.real()               \
-                                         + pixel.imag()*pixel.imag() );          \
-    }                                                                            \
-};                                                                               \
-
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(float);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(double);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(signed int);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(unsigned int);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(short int);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(signed char);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(unsigned char);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(signed long);
-OTB_DEFAULTCONVERTTRAITS_COMPLEX_TYPE(unsigned long);
-
-//
-//  End of Traits for the classes deriving from std::complex.
-//
-//
-
-} // end namespace otb
+} // end namespace
 #endif
diff --git a/Modules/Core/ObjectList/include/otbImageList.h b/Modules/Core/ObjectList/include/otbImageList.h
index 611d84a47a18efdb93a79085fa4a764968338ddf..4cb77bddec306437bccb05b45b81bdf71c9b9610 100644
--- a/Modules/Core/ObjectList/include/otbImageList.h
+++ b/Modules/Core/ObjectList/include/otbImageList.h
@@ -68,6 +68,8 @@ public:
     throw (itk::InvalidRequestedRegionError) ITK_OVERRIDE;
   void UpdateOutputData(void) ITK_OVERRIDE;
 
+  void SetRequestedRegion(const itk::DataObject * source);
+  
 protected:
   /** Constructor */
   ImageList() {};
diff --git a/Modules/Core/ObjectList/include/otbImageList.txx b/Modules/Core/ObjectList/include/otbImageList.txx
index dc0cbc9b6fef35e3430891fb9cd08a7e4324aefd..dec0ab8b3e5ce3a834ee5a6dc9a247831d432f5b 100644
--- a/Modules/Core/ObjectList/include/otbImageList.txx
+++ b/Modules/Core/ObjectList/include/otbImageList.txx
@@ -39,10 +39,32 @@ ImageList<TImage>
         || it.Get()->GetDataReleased()
         || it.Get()->RequestedRegionIsOutsideOfTheBufferedRegion())
       {
+      if(it.Get()->GetSource())
+        {
+        it.Get()->GetSource()->UpdateOutputData(it.Get());
+        }
+      }
+    }
+}
+
+template <class TImage>
+void
+ImageList<TImage>
+::PropagateRequestedRegion() throw (itk::InvalidRequestedRegionError)
+  {
+  Superclass::PropagateRequestedRegion();
+
+  for (ConstIterator it = this->Begin(); it != this->End(); ++it)
+    {
+    if (it.Get()->GetUpdateMTime() < it.Get()->GetPipelineMTime()
+        || it.Get()->GetDataReleased()
+        || it.Get()->RequestedRegionIsOutsideOfTheBufferedRegion())
+      {
+
       if (it.Get()->GetSource())
         {
         it.Get()->GetSource()->PropagateRequestedRegion(it.Get());
-
+        
         // Check that the requested region lies within the largest possible region
         if (!it.Get()->VerifyRequestedRegion())
           {
@@ -51,23 +73,24 @@ ImageList<TImage>
           e.SetLocation(ITK_LOCATION);
           e.SetDataObject(it.Get());
           e.SetDescription("Requested region is (at least partially) outside the largest possible region.");
-
+          
           throw e;
           }
-
-        it.Get()->GetSource()->UpdateOutputData(it.Get());
         }
       }
     }
-}
+  }
 
-template <class TImage>
+template<class TImage>
 void
 ImageList<TImage>
-::PropagateRequestedRegion() throw (itk::InvalidRequestedRegionError)
-  {
-  Superclass::PropagateRequestedRegion();
-  }
+::SetRequestedRegion(const itk::DataObject * source)
+{
+  for (ConstIterator it = this->Begin(); it != this->End(); ++it)
+    {
+    it.Get()->SetRequestedRegion(source);
+    }
+}
 
 template <class TImage>
 void
diff --git a/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h b/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h
index 826478711d24b2c9ab3ac7e75d4e8586354c8afb..41fe7808e9d84a0d0ae3017996e417ea0cd97c3a 100644
--- a/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h
+++ b/Modules/Core/Streaming/include/otbPipelineMemoryPrintCalculator.h
@@ -121,7 +121,7 @@ public:
   static const double MegabyteToByte;
 
   /** Evaluate the print (in bytes) of a single data object */
-  MemoryPrintType EvaluateDataObjectPrint(DataObjectType * data) const;
+  MemoryPrintType EvaluateDataObjectPrint(DataObjectType * data);
 
 protected:
   /** Constructor */
diff --git a/Modules/Core/Streaming/src/otbPipelineMemoryPrintCalculator.cxx b/Modules/Core/Streaming/src/otbPipelineMemoryPrintCalculator.cxx
index 033c58bc379fed6aba092e28e346b1d58ab35b84..d7d62e8c88cd6a779425feb92d5c9eeea7a71497 100644
--- a/Modules/Core/Streaming/src/otbPipelineMemoryPrintCalculator.cxx
+++ b/Modules/Core/Streaming/src/otbPipelineMemoryPrintCalculator.cxx
@@ -162,7 +162,7 @@ PipelineMemoryPrintCalculator
 
 PipelineMemoryPrintCalculator::MemoryPrintType
 PipelineMemoryPrintCalculator
-::EvaluateDataObjectPrint(DataObjectType * data) const
+::EvaluateDataObjectPrint(DataObjectType * data)
 {
   otbMsgDevMacro(<< "EvaluateMemoryPrint for " << data->GetNameOfClass() << " (" << data << ")")
 
@@ -183,11 +183,13 @@ PipelineMemoryPrintCalculator
     {                                                                   \
     ImageList<Image<type, 2> > * imageList = dynamic_cast<otb::ImageList<otb::Image<type, 2> > *>(data); \
     MemoryPrintType print(0);                                         \
-    for(ImageList<Image<type, 2> >::ConstIterator it = imageList->Begin(); \
+    for(ImageList<Image<type, 2> >::Iterator it = imageList->Begin(); \
        it != imageList->End(); ++it)                                    \
        {                                                             \
-       print += it.Get()->GetRequestedRegion().GetNumberOfPixels()   \
-       * it.Get()->GetNumberOfComponentsPerPixel() * sizeof(type); \
+       if(it.Get()->GetSource())                                        \
+         print += this->EvaluateProcessObjectPrintRecursive(it.Get()->GetSource());\
+       else                                                             \
+         print += this->EvaluateDataObjectPrint(it.Get());              \
        }                                                           \
     return print;                                                  \
     }                                                              \
@@ -198,8 +200,10 @@ PipelineMemoryPrintCalculator
     for(ImageList<VectorImage<type, 2> >::ConstIterator it = imageList->Begin(); \
        it != imageList->End(); ++it)                                    \
        {                                                             \
-       print += it.Get()->GetRequestedRegion().GetNumberOfPixels()   \
-       * it.Get()->GetNumberOfComponentsPerPixel() * sizeof(type); \
+       if(it.Get()->GetSource())                                        \
+         print += this->EvaluateProcessObjectPrintRecursive(it.Get()->GetSource());\
+       else                                                             \
+         print += this->EvaluateDataObjectPrint(it.Get());              \
        }                                                           \
     return print;                                                  \
     }                                                              \
diff --git a/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.h
index 6fdd16e955a3b7a754779b6d1acd76de60e711d8..478eb952220a8cf08eed6b8550114d2053ba2ccd 100644
--- a/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.h
@@ -21,121 +21,104 @@
 #ifndef otbClampImageFilter_h
 #define otbClampImageFilter_h
 
-#include "itkImageToImageFilter.h"
+#include "otbConvertTypeFunctor.h"
+#include "itkUnaryFunctorImageFilter.h"
 
 namespace otb
 {
 
 /** \class ClampImageFilter
- * \brief Set image values to a user-specified value if they are below,
- * above, or between simple threshold values.
+ * \brief Clamp image values to be below, over, or between threhold values.
  *
  * ClampImageFilter  clamp image values to be between an upper
  * and lower value. Values lower than m_Lower values are set to lower,
  * and values greater than upper threshold are set to upper threshold
  * value.
+ * This filter can also be used to cast any type of image into any other type
+ * as long as those types are arithmetics or complex.
  *
  * By default lower and upper thresholds are set to the maximum and
- * minimum bounds of the image pixel type.
- *
- * The pixels must support the operators >= and <=.
+ * minimum bounds of the image internal pixel value.
  *
  * \ingroup IntensityImageFilters Multithreaded
  *
  * \ingroup OTBImageManipulation
  */
   template <class TInputImage, class TOutputImage=TInputImage>
-  class ITK_EXPORT ClampImageFilter : public itk::ImageToImageFilter<TInputImage, TOutputImage>
+  class ITK_EXPORT ClampImageFilter 
+  : public itk::UnaryFunctorImageFilter< TInputImage , TOutputImage ,
+      Functor::ConvertTypeFunctor <typename TInputImage::PixelType ,
+                                   typename TOutputImage::PixelType> >
 {
 public:
   /** Standard class typedefs. */
-  typedef ClampImageFilter               Self;
-  typedef itk::ImageToImageFilter<TInputImage, TOutputImage>  Superclass;
-  typedef itk::SmartPointer<Self>                 Pointer;
-  typedef itk::SmartPointer<const Self>           ConstPointer;
+  typedef ClampImageFilter Self;
+  typedef itk::UnaryFunctorImageFilter< TInputImage , TOutputImage ,
+    Functor::ConvertTypeFunctor <typename TInputImage::PixelType ,
+                                 typename TOutputImage::PixelType> >  Superclass;
+  typedef itk::SmartPointer<Self> Pointer;
+  typedef itk::SmartPointer<const Self> ConstPointer;
 
   /** Method for creation through the object factory. */
-  itkNewMacro(Self);
+  itkNewMacro( Self );
 
   /** Run-time type information (and related methods). */
-  itkTypeMacro(ClampImageFilter, itk::ImageToImageFilter);
+  itkTypeMacro( ClampImageFilter , itk::UnaryFunctorImageFilter );
 
 
   /** Some additional typedefs.  */
   typedef TInputImage                                  InputImageType;
-  typedef typename InputImageType::ConstPointer        InputImagePointer;
   typedef typename InputImageType::RegionType          InputImageRegionType;
   typedef typename InputImageType::PixelType           InputImagePixelType;
 
   /** Some additional typedefs.  */
-  typedef TOutputImage                                 OutputImageType;
-  typedef typename OutputImageType::Pointer            OutputImagePointer;
-  typedef typename OutputImageType::RegionType         OutputImageRegionType;
-  typedef typename OutputImageType::PixelType          OutputImagePixelType;
+  typedef TOutputImage OutputImageType;
+  typedef typename OutputImageType::RegionType OutputImageRegionType;
+  typedef typename OutputImageType::PixelType OutputImagePixelType;
+  typedef typename OutputImageType::InternalPixelType OutputInternalPixelType;
+  typedef typename itk::NumericTraits< OutputInternalPixelType >::ValueType OutputPixelValueType;
 
 
-  /** The values greater than or equal to the value are set to OutsideValue. */
-  void ClampAbove(const OutputImagePixelType &thresh);
+  /** The values greater than or equal to the value are set to \p thresh. */
+  void ClampAbove(const OutputPixelValueType &thresh);
 
-  /** The values less than or equal to the value are set to OutsideValue. */
-  void ClampBelow(const OutputImagePixelType &thresh);
+  /** The values less than or equal to the value are set to \p thresh. */
+  void ClampBelow(const OutputPixelValueType &thresh);
 
-  /** The values outside the range are set to OutsideValue. */
-  void ClampOutside(const OutputImagePixelType &lower, const OutputImagePixelType &upper);
+  /** The values outside the range are set to \p lower or \p upper. */
+  void ClampOutside(const OutputPixelValueType &lower, const OutputPixelValueType &upper);
 
   /** Set/Get methods to set the lower threshold */
-  void SetLower(OutputImagePixelType val)
-  {
-    m_Lower = val;
-    m_DLower = static_cast<double>(val);
-    this->Modified();
-  }
-  itkGetConstMacro(Lower, OutputImagePixelType);
+  void SetLower(OutputPixelValueType val);
+
+  itkGetConstMacro(Lower, OutputPixelValueType);
 
   /** Set/Get methods to set the upper threshold */
-  void SetUpper(OutputImagePixelType val)
-  {
-    m_Upper = val;
-    m_DUpper = static_cast<double>(val);
-    this->Modified();
-  }
-  itkGetConstMacro(Upper, OutputImagePixelType);
+  void SetUpper(OutputPixelValueType val);
+
+  itkGetConstMacro(Upper, OutputPixelValueType);
 
 
 protected:
   ClampImageFilter();
-  ~ClampImageFilter() ITK_OVERRIDE {};
-  void PrintSelf(std::ostream& os, itk::Indent indent) const ITK_OVERRIDE;
-
-  /** ClampImageFilter can be implemented as a multithreaded filter.
-   * Therefore, this implementation provides a ThreadedGenerateData() routine
-   * which is called for each processing thread. The output image data is
-   * allocated automatically by the superclass prior to calling
-   * ThreadedGenerateData().  ThreadedGenerateData can only write to the
-   * portion of the output image specified by the parameter
-   * "outputRegionForThread"
-   *
-   * \sa ImageToImageFilter::ThreadedGenerateData(),
-   *     ImageToImageFilter::GenerateData()  */
-  void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
-                            itk::ThreadIdType threadId ) ITK_OVERRIDE;
-
-  void GenerateOutputInformation(void) ITK_OVERRIDE
-  {
-    Superclass::GenerateOutputInformation();
+  ~ClampImageFilter() override {};
+  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
 
-    this->GetOutput()->SetNumberOfComponentsPerPixel( this->GetInput()->GetNumberOfComponentsPerPixel() );
-  }
+  void GenerateOutputInformation(void) override
+    {
+    Superclass::GenerateOutputInformation();
+    unsigned int sizeIn = this->GetInput()->GetNumberOfComponentsPerPixel();
+    this->GetFunctor().SetInputComponents( sizeIn );
+    this->GetOutput()->SetNumberOfComponentsPerPixel( 
+      this->GetFunctor().GetOutputSize () );
+    }
 
 private:
-  ClampImageFilter(const Self&); //purposely not implemented
-  void operator=(const Self&); //purposely not implemented
-
-  double m_DLower;
-  double m_DUpper;
+  ClampImageFilter(const Self&) = delete ;
+  void operator=(const Self&) = delete ;
 
-  OutputImagePixelType m_Lower;
-  OutputImagePixelType m_Upper;
+  OutputPixelValueType m_Lower;
+  OutputPixelValueType m_Upper;
 };
 
 
diff --git a/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.txx b/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.txx
index fd1ed1320ec1cbe7768eb8ccb44f7b9ba317d8f9..b1ac37e2e3df315e4b2e402f9034a73ef25a4665 100644
--- a/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.txx
+++ b/Modules/Filtering/ImageManipulation/include/otbClampImageFilter.txx
@@ -25,6 +25,7 @@
 #include "otbClampImageFilter.h"
 #include "itkImageRegionIterator.h"
 #include "itkNumericTraits.h"
+#include <limits>
 #include "itkObjectFactory.h"
 #include "itkProgressReporter.h"
 
@@ -38,13 +39,35 @@ template <class TInputImage, class TOutputImage>
 ClampImageFilter<TInputImage, TOutputImage>
 ::ClampImageFilter()
 {
-  m_Lower = itk::NumericTraits<OutputImagePixelType>::NonpositiveMin();
-  m_Upper = itk::NumericTraits<OutputImagePixelType>::max();
+  m_Lower = std::numeric_limits < OutputPixelValueType >::lowest();
+  m_Upper = std::numeric_limits < OutputPixelValueType >::max();
+}
 
-  m_DLower = static_cast<double>(m_Lower);
-  m_DUpper = static_cast<double>(m_Upper);
+template <class TInputImage, class TOutputImage>
+void
+ClampImageFilter<TInputImage, TOutputImage>
+::SetLower(OutputPixelValueType val)
+{
+  if ( m_Lower != val )
+    {
+    m_Lower = val;
+    this->GetFunctor().SetLowest( m_Lower );
+    this->Modified();  
+    }
 }
 
+template <class TInputImage, class TOutputImage>
+void
+ClampImageFilter<TInputImage, TOutputImage>
+::SetUpper(OutputPixelValueType val)
+{
+  if ( m_Upper != val )
+    {
+    m_Upper = val;
+    this->GetFunctor().SetHighest( m_Upper );
+    this->Modified();
+    }
+}
 
 /**
  *
@@ -70,14 +93,15 @@ ClampImageFilter<TInputImage, TOutputImage>
 template <class TInputImage, class TOutputImage>
 void
 ClampImageFilter<TInputImage, TOutputImage>
-::ClampAbove(const OutputImagePixelType &thresh)
+::ClampAbove(const OutputPixelValueType &thresh)
 {
   if (m_Upper != thresh
-      || m_Lower > itk::NumericTraits<OutputImagePixelType>::NonpositiveMin())
+      || m_Lower > std::numeric_limits < OutputPixelValueType >::lowest())
     {
-    m_Lower = itk::NumericTraits<OutputImagePixelType>::NonpositiveMin();
+    m_Lower = std::numeric_limits < OutputPixelValueType >::lowest();
     m_Upper = thresh;
-    m_DUpper = static_cast<double>(m_Upper);
+    this->GetFunctor().SetLowest( m_Lower );
+    this->GetFunctor().SetHighest( m_Upper );
     this->Modified();
     }
 }
@@ -88,13 +112,14 @@ ClampImageFilter<TInputImage, TOutputImage>
 template <class TInputImage, class TOutputImage>
 void
 ClampImageFilter<TInputImage, TOutputImage>
-::ClampBelow(const OutputImagePixelType &thresh)
+::ClampBelow(const OutputPixelValueType &thresh)
 {
-  if (m_Lower != thresh || m_Upper < itk::NumericTraits<OutputImagePixelType>::max())
+  if (m_Lower != thresh || m_Upper < std::numeric_limits < OutputPixelValueType >::max())
     {
+    m_Upper = std::numeric_limits < OutputPixelValueType >::max();
     m_Lower = thresh;
-    m_DLower = m_Lower;
-    m_Upper = itk::NumericTraits<InputImagePixelType>::max();
+    this->GetFunctor().SetLowest( m_Lower );
+    this->GetFunctor().SetHighest( m_Upper );
     this->Modified();
     }
 }
@@ -106,7 +131,7 @@ ClampImageFilter<TInputImage, TOutputImage>
 template <class TInputImage, class TOutputImage>
 void
 ClampImageFilter<TInputImage, TOutputImage>
-::ClampOutside(const OutputImagePixelType &lower, const OutputImagePixelType &upper)
+::ClampOutside(const OutputPixelValueType &lower, const OutputPixelValueType &upper)
 {
   if (lower > upper)
     {
@@ -118,73 +143,12 @@ ClampImageFilter<TInputImage, TOutputImage>
     {
     m_Lower = lower;
     m_Upper = upper;
-    m_DLower = m_Lower;
-    m_DUpper = m_Upper;
+    this->GetFunctor().SetLowest( m_Lower );
+    this->GetFunctor().SetHighest( m_Upper );
     this->Modified();
     }
 }
 
-
-/**
- *
- */
-template <class TInputImage, class TOutputImage>
-void
-ClampImageFilter<TInputImage, TOutputImage>
-::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread,
-                       itk::ThreadIdType threadId)
-{
-  itkDebugMacro(<<"Actually executing");
-
-  // Get the input and output pointers
-  InputImagePointer  inputPtr  = this->GetInput();
-  OutputImagePointer outputPtr = this->GetOutput(0);
-
-  // Define/declare an iterator that will walk the output region for this
-  // thread.
-  typedef itk::ImageRegionConstIterator<TInputImage> InputIterator;
-  typedef itk::ImageRegionIterator<TOutputImage>      OutputIterator;
-
-  InputIterator  inIt(inputPtr, outputRegionForThread);
-  OutputIterator outIt(outputPtr, outputRegionForThread);
-
-  // support progress methods/callbacks
-  itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels());
-
-  // walk the regions, threshold each pixel
-  while( !outIt.IsAtEnd() && !inIt.IsAtEnd()  )
-    {
-    // Cast the value of the pixel to double in order to compare
-    // with the double version of the upper and the lower bounds of
-    // output image
-    const double value = static_cast<double>(inIt.Get());
-    OutputImagePixelType      outPix = m_Lower;
-
-    if ( m_DLower <= value && value <= m_DUpper)
-      {
-      // pixel passes to output unchanged
-      outPix = static_cast<OutputImagePixelType>(value);
-      }
-    /* Already outPix is initialized with m_Lower even for preventing Warning.
-     *
-    else if ( value < m_DLower )
-      {
-      outPix = m_Lower;
-      }
-     */
-    else if ( value > m_DUpper)
-      {
-      outPix = m_Upper;
-      }
-
-    outIt.Set( outPix );
-
-    ++inIt;
-    ++outIt;
-    progress.CompletedPixel();
-    }
-}
-
 } // end namespace itk
 
 #endif
diff --git a/Modules/Filtering/ImageManipulation/include/otbClampVectorImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbClampVectorImageFilter.h
index 053c3060001c7bc0961d1f4aac7d16ead7cd1fa2..50b43302e4bc18ff3d0cb89c998ee05c5fc710a2 100644
--- a/Modules/Filtering/ImageManipulation/include/otbClampVectorImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbClampVectorImageFilter.h
@@ -21,6 +21,7 @@
 #ifndef otbClampVectorImageFilter_h
 #define otbClampVectorImageFilter_h
 
+#include <vcl_deprecated_header.h>
 #include "itkImageToImageFilter.h"
 
 namespace otb
diff --git a/Modules/Filtering/ImageManipulation/include/otbConvertTypeFunctor.h b/Modules/Filtering/ImageManipulation/include/otbConvertTypeFunctor.h
new file mode 100644
index 0000000000000000000000000000000000000000..c5a73b5cb1591868f4f67a1ddf65df3b5544a6ff
--- /dev/null
+++ b/Modules/Filtering/ImageManipulation/include/otbConvertTypeFunctor.h
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
+ *
+ * This file is part of Orfeo Toolbox
+ *
+ *     https://www.orfeo-toolbox.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef otbConvertTypeFunctor_h
+#define otbConvertTypeFunctor_h
+
+#include <limits>
+#include <type_traits>
+#include <boost/type_traits/is_complex.hpp>
+#include <boost/type_traits/is_scalar.hpp>
+
+#include "itkNumericTraits.h"
+#include "otbDefaultConvertPixelTraits.h"
+
+namespace otb
+{
+namespace Functor
+{
+
+template < class TInputPixelType , class TOutputPixelType >
+class ConvertTypeFunctor
+{
+public:
+  typedef TInputPixelType InputPixelType;
+  typedef TOutputPixelType OutputPixelType;
+  typedef ConvertTypeFunctor Self;
+
+  typedef typename itk::NumericTraits < InputPixelType > :: ValueType InputInternalPixelType;
+  typedef typename itk::NumericTraits < OutputPixelType > :: ValueType OutputInternalPixelType;
+
+  typedef typename itk::NumericTraits < InputInternalPixelType > :: ValueType InputPixelValueType;
+  typedef typename itk::NumericTraits < OutputInternalPixelType > :: ValueType OutputPixelValueType;
+
+  static constexpr bool m_cInPix = boost::is_complex < InputPixelType > :: value ;
+  static constexpr bool m_cOutPix = boost::is_complex < OutputPixelType > :: value ;
+  static constexpr bool m_cInInternalPix = boost::is_complex < InputInternalPixelType > :: value ;
+  static constexpr bool m_cOutInternalPix = boost::is_complex < OutputInternalPixelType > :: value ;
+
+  ConvertTypeFunctor()  
+  // m_cInPix ( boost::is_complex < InputPixelType > :: value ) ,
+  // m_cOutPix ( boost::is_complex < OutputPixelType > :: value ) ,
+  // m_cInInternalPix ( boost::is_complex < InputInternalPixelType > :: value ) ,
+  // m_cOutInternalPix ( boost::is_complex < OutputInternalPixelType > :: value )
+  {
+    m_LowestB = std::numeric_limits < OutputPixelValueType >::lowest();
+    m_HighestB = std::numeric_limits < OutputPixelValueType >::max();
+
+    m_LowestBD = static_cast < double > ( m_LowestB );
+    m_HighestBD = static_cast < double > ( m_HighestB );
+
+    // m_cInPix = boost::is_complex < InputPixelType > :: value ; 
+    // m_cOutPix = boost::is_complex < OutputPixelType > :: value ;
+    // m_cInInternalPix = boost::is_complex < InputInternalPixelType > :: value ; 
+    // m_cOutInternalPix = boost::is_complex < OutputInternalPixelType > :: value ;
+  }
+
+  // template < class InternalPixelType  >
+  void SetInputComponents( unsigned int sizeIn )
+    {
+    m_CompIn = sizeIn ;
+    if ( m_cInPix )
+      {
+      // needed as ITK thinks that one complex component is actually 
+      // two components...
+      m_CompIn /= 2 ;
+      }
+    }
+
+  unsigned int GetOutputSize()
+  {
+    if ( m_cInInternalPix || m_cInPix )
+      m_Scal = 2 * m_CompIn;
+    else
+      m_Scal = m_CompIn;
+
+    OutputPixelType out;
+    unsigned int size = 
+      itk::NumericTraits < OutputPixelType > :: GetLength( out );
+    if ( size == 0 ) // That means it is a variable size container
+      {
+      if ( m_cOutInternalPix )
+        m_CompOut = ( m_Scal + 1 ) / 2 ;
+      else
+        m_CompOut = m_Scal ;
+      }
+    // It is a fixed size container, m_CompOut should be equal to its size
+    else if ( m_cOutPix ) // one complex is one component
+      m_CompOut = 1 ;
+    else // fized size container or scalar
+      m_CompOut = size;
+    
+
+    return m_CompOut ;
+  }
+
+  void SetLowest( OutputPixelValueType & lowest )
+  {
+    m_LowestB = lowest;
+    m_LowestBD = static_cast < double > ( m_LowestB );
+  }
+
+  void SetHighest( OutputPixelValueType & highest )
+  {
+    m_HighestB = highest;
+    m_HighestBD = static_cast < double > ( m_HighestB );
+  }
+
+  OutputPixelType operator() ( InputPixelType const & in ) const
+  {
+    std::vector < double > vPixel;
+    for ( unsigned int i  = 0 ; i < m_CompIn ; i ++)
+      FillIn < InputPixelType > ( i , in , vPixel );
+    assert( m_Scal == vPixel.size() );
+    if (  ( m_cOutPix || m_cOutInternalPix ) && vPixel.size()%2 )
+      { 
+      vPixel.push_back(0); // last component has no imaginary part
+      }
+    Clamp( vPixel );
+    OutputPixelType out;
+
+    int hack = 1;
+    if ( m_cOutPix )
+      hack += 1; // needed in case we have OutputPixelType == complex<t> as 
+    // itk::NumericTraits::SetLength() will ask a length of 2!
+    itk::NumericTraits < OutputPixelType > :: SetLength( out , 
+        hack * m_CompOut );
+
+    for ( unsigned int i  = 0 ; i < m_CompOut ; i ++)
+      FillOut < OutputPixelType > ( i , out , vPixel );
+    return out;
+  }
+
+  ~ConvertTypeFunctor() {};
+
+protected:
+  
+  template <class PixelType ,
+    std::enable_if_t < std::is_arithmetic < PixelType > ::value  , int > = 0 >
+  void FillIn( unsigned int i ,
+               InputPixelType const & pix ,
+               std::vector < double > & vPix ) const
+    {
+      vPix.push_back( DefaultConvertPixelTraits < InputPixelType > ::
+          GetNthComponent( i , pix ) );
+    }
+
+  template <class PixelType ,
+    std::enable_if_t < boost::is_complex < PixelType > :: value , int > = 0 >
+  void FillIn( unsigned int i ,
+               InputPixelType const & pix ,
+               std::vector < double > & vPix ) const
+    {
+      PixelType comp = DefaultConvertPixelTraits < InputPixelType > ::
+          GetNthComponent( i , pix );
+      vPix.push_back( static_cast < double > ( real( comp ) ) );
+      vPix.push_back( static_cast < double > ( imag( comp ) ) );
+    }
+
+  template <class PixelType ,
+   std::enable_if_t <  !( boost::is_complex < PixelType > :: value 
+    || std::is_arithmetic < PixelType > ::value ) , int > = 0 > 
+  void FillIn( unsigned int i ,
+               InputPixelType const & pix ,
+               std::vector < double > & vPix ) const
+    {
+        FillIn < InputInternalPixelType > ( i , pix , vPix );
+    }
+
+  void Clamp( std::vector < double > & vPixel ) const
+    {
+    for ( double & comp : vPixel )
+      {
+        if ( comp >= m_HighestBD )
+          comp = m_HighestBD;
+        else if ( comp <= m_LowestBD )
+          comp = m_LowestBD;
+      }
+    }
+
+  template <class PixelType ,
+    std::enable_if_t < std::is_arithmetic < PixelType > ::value  , int > = 0 >
+  void FillOut( unsigned int i ,
+                OutputPixelType & pix ,
+                std::vector < double > & vPix ) const
+    {
+      DefaultConvertPixelTraits < OutputPixelType > ::
+          SetNthComponent( i , pix , vPix[i] );
+    }
+
+  template <class PixelType ,
+    std::enable_if_t < boost::is_complex < PixelType > :: value , int > = 0 >
+  void FillOut( unsigned int i ,
+                OutputPixelType & pix ,
+                std::vector < double > & vPix ) const
+    {
+      DefaultConvertPixelTraits < OutputPixelType > ::
+          SetNthComponent( i , pix , 
+            PixelType ( vPix[ 2 * i] , vPix[ 2 * i + 1] ) );
+    }
+
+  template <class PixelType ,
+   std::enable_if_t <  !( boost::is_complex < PixelType > :: value 
+    || std::is_arithmetic < PixelType > ::value ) , int > = 0 > 
+  void FillOut( unsigned int i ,
+                OutputPixelType & pix ,
+                std::vector < double > & vPix ) const
+    {
+      FillOut < OutputInternalPixelType > ( i , pix , vPix );
+    }
+
+private:
+  ConvertTypeFunctor(const Self &) = delete; 
+  void operator =(const Self&) = delete;
+
+  double m_LowestBD , m_HighestBD ;
+  OutputPixelValueType m_LowestB , m_HighestB ;
+  unsigned int m_CompIn , m_CompOut , m_Scal ;
+  // const bool m_cInPix , m_cOutPix , m_cInInternalPix , m_cOutInternalPix ;
+
+};
+
+} //end namespace Functor
+
+} //end namespace otb
+
+#endif
diff --git a/Modules/Filtering/ImageManipulation/include/otbOneRIBandImageToOneComplexBandImage.h b/Modules/Filtering/ImageManipulation/include/otbOneRIBandImageToOneComplexBandImage.h
index 8582158d36343dd3449f79e27e7135fb04a435b7..01fe68c1150b7ce971cc105833b431b980d3981a 100644
--- a/Modules/Filtering/ImageManipulation/include/otbOneRIBandImageToOneComplexBandImage.h
+++ b/Modules/Filtering/ImageManipulation/include/otbOneRIBandImageToOneComplexBandImage.h
@@ -21,6 +21,7 @@
 #ifndef otbOneRIBandImageToOneComplexBandImage_h
 #define otbOneRIBandImageToOneComplexBandImage_h
 
+#include <vcl_deprecated_header.h>
 #include "itkImageToImageFilter.h"
 #include "itkImage.h"
 #include "itkNumericTraits.h"
diff --git a/Modules/Filtering/ImageManipulation/include/otbRealImageToComplexImageFilter.h b/Modules/Filtering/ImageManipulation/include/otbRealImageToComplexImageFilter.h
index c426b5a2f9e5a2225d842b51cb92640841bcefbd..8e86ee82f3bf7df11abc7ba99955e673e3b522e8 100644
--- a/Modules/Filtering/ImageManipulation/include/otbRealImageToComplexImageFilter.h
+++ b/Modules/Filtering/ImageManipulation/include/otbRealImageToComplexImageFilter.h
@@ -21,6 +21,7 @@
 #ifndef otbRealImageToComplexImageFilter_h
 #define otbRealImageToComplexImageFilter_h
 
+#include <vcl_deprecated_header.h>
 #include "itkUnaryFunctorImageFilter.h"
 #include "vnl/vnl_math.h"
 
diff --git a/Modules/Filtering/ImageManipulation/include/otbTwoNRIBandsImageToNComplexBandsImage.h b/Modules/Filtering/ImageManipulation/include/otbTwoNRIBandsImageToNComplexBandsImage.h
index 538b07214964f53fb86a9238d9417b968ae13630..c4adb6a9f7b78e4b040a916ef1a970ff6be05627 100644
--- a/Modules/Filtering/ImageManipulation/include/otbTwoNRIBandsImageToNComplexBandsImage.h
+++ b/Modules/Filtering/ImageManipulation/include/otbTwoNRIBandsImageToNComplexBandsImage.h
@@ -21,6 +21,7 @@
 #ifndef otbTwoNRIBandsImageToNComplexBandsImage_h
 #define otbTwoNRIBandsImageToNComplexBandsImage_h
 
+#include <vcl_deprecated_header.h>
 #include "itkImageToImageFilter.h"
 #include "itkImage.h"
 #include "itkNumericTraits.h"
diff --git a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
index 386b4294793890480773aa72640551525dfaedcf..834a6d3da072adf5c4dbc385d46db7931132de97 100644
--- a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
+++ b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt
@@ -58,7 +58,6 @@ otbStreamingInnerProductVectorImageFilter.cxx
 otbPhaseFunctorTest.cxx
 otbShiftScaleVectorImageFilterNew.cxx
 otbChangeLabelImageFilter.cxx
-otbClampVectorImageFilter.cxx
 otbPrintableImageFilterNew.cxx
 otbShiftScaleImageAdaptorNew.cxx
 otbStreamingInnerProductVectorImageFilterNew.cxx
@@ -442,20 +441,6 @@ otb_add_test(NAME bfTvChangeLabelImageFilter COMMAND otbImageManipulationTestDri
   255   # upper  threshold
   )
 
-
-otb_add_test(NAME bfTvClampVectorImageFilterTest COMMAND otbImageManipulationTestDriver
-  --compare-image 0.0001
-  ${BASELINE}/bfTvClampVectorImageFilterTest_Output.tif
-  ${TEMP}/bfTvClampVectorImageFilterTest_Output.tif
-  otbClampVectorImageFilterTest
-  ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif
-  ${TEMP}/bfTvClampVectorImageFilterTest_Output.tif
-  )
-
-otb_add_test(NAME bfTuClampVectorImageFilterNew COMMAND otbImageManipulationTestDriver
-  otbClampVectorImageFilterNew
-  )
-
 otb_add_test(NAME bfTuPrintableImageFilterNew COMMAND otbImageManipulationTestDriver
   otbPrintableImageFilterNew)
 
@@ -638,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..29ac5602eacbc38ffda2b5914822024b2a20d0df 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,423 @@ 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();
+}
+
+template < class OutImageType >
+typename OutImageType::Pointer
+Cross ( otb::VectorImage< std::complex<float> >::Pointer input )
+{
+  typedef otb::ClampImageFilter< otb::VectorImage< std::complex<float> > ,
+                                 OutImageType > ClampFilter;
+  typename ClampFilter::Pointer clamp ( ClampFilter::New() );
+  clamp->SetInput( input );
+  clamp->Update();
+  return clamp->GetOutput();
+}
+
+template < class OutImageType >
+typename OutImageType::Pointer
+Cross ( otb::Image< itk::FixedArray< std::complex<float> , 2 > >::Pointer input )
+{
+  typedef otb::ClampImageFilter< otb::Image< itk::FixedArray< std::complex<float> , 2 > > ,
+                                 OutImageType > ClampFilter;
+  typename ClampFilter::Pointer clamp ( ClampFilter::New() );
+  clamp->SetInput( input );
+  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 ( static_cast<RealPixelType>( ref ) !=  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 ();
+  // unsigned int nbChanelRef = imRef->GetNumberOfComponentsPerPixel ();
+  RealPixelType val;
+  double ref;
+  while ( !it.IsAtEnd() )
+    {
+    // std::cout<<it.Get()<<std::endl;
+    // std::cout<<itRef.Get()<<std::endl;
+    for ( unsigned int i = 0 ; i < nbChanel ; i++ )
+      {
+      val = it.Get()[i];
+      ref = itRef.Get()[i];
+
+      if ( ref > static_cast<double>( max ) && val != max ) 
+        {
+          std::cout<<"ref : "<<static_cast<RealPixelType>(ref)<<std::endl;
+          std::cout<<"val : "<<val<<std::endl;
+        return false;
+        }
+      else if ( ref < static_cast<double>( min ) && val != min ) 
+        {
+          std::cout<<"ref : "<<static_cast<RealPixelType>(ref)<<std::endl;
+          std::cout<<"val : "<<val<<std::endl;
+        return false;
+        }
+      else if ( static_cast<RealPixelType>(ref) !=  val )
+        {
+          std::cout<<"ref : "<<static_cast<RealPixelType>(ref)<<std::endl;
+          std::cout<<"val : "<<val<<std::endl;
+        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 ( static_cast<RealType>( reRef ) !=  val.real() 
+           || static_cast<RealType>( imRef ) !=  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;
+  float 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 ( static_cast<RealType>( reRef ) != val.real()
+             || static_cast<RealType>( imRef ) != val.imag() )
+        {
+        return false;
+        }
+      }
+    ++it;
+    ++itRef;
+    }
+    return true;
+}
+
+template <class ImageType >
+bool
+CompareArrayComplex( const ImageRefType::Pointer imageRef , 
+                     const ImageType * im )
+{
+  typedef typename ImageType::PixelType ArrayType;
+  typedef typename ArrayType::ValueType 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;
+  float 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 ( static_cast<RealType>( reRef ) != val.real()
+             || static_cast<RealType>( imRef ) != 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();
+
+  // vect<real> --> vect<real>
+  otb::VectorImage< short >::Pointer image0 = 
+    Cross < otb::VectorImage< double >  , otb::VectorImage< short > > ( argv[1] );
+  bool test0 = CompareVectorReal < otb::VectorImage< short > >( imageRef , image0 );
+  std::cout<< "Test 0 : "<<test0<<std::endl;
+  image0 =nullptr;
+
+  // vect<real> --> vect<complex>
+  otb::VectorImage< std::complex<unsigned short>>::Pointer image1 = 
+    Cross < otb::VectorImage< float >  , otb::VectorImage<std::complex<unsigned short>> > ( argv[1] );
+  bool test1 = CompareVectorComplex < otb::VectorImage<std::complex<unsigned short>> >( imageRef , image1 );
+  std::cout<< "Test 1 : "<<test1<<std::endl;
+  image1 = nullptr;
+
+  // vect<real> --> image<real>
+  otb::Image<int>::Pointer image2 = 
+    Cross < otb::VectorImage< float >  , otb::Image<int> > ( argv[1] );
+  bool test2 = CompareImageReal < otb::Image<int> >( imageRef , image2 );
+  std::cout<< "Test 2 : "<<test2<<std::endl;
+  image2 = nullptr;
+
+  // vect<real> --> image<complex>
+  otb::Image< std::complex<float>>::Pointer image3 = 
+    Cross < otb::VectorImage< float >  , otb::Image<std::complex<float>> > ( argv[1] );
+  bool test3 = CompareImageComplex < otb::Image<std::complex<float>> >( imageRef , image3 );
+  std::cout<< "Test 3 : "<<test3<<std::endl;
+  image3 = nullptr;
+
+  // image<real> --> image<real>
+  otb::Image< unsigned short >::Pointer image4 = 
+    Cross < otb::Image< itk::FixedArray < double , 4 > >  , otb::Image< unsigned short > > ( argv[1] );
+  bool test4 = CompareImageReal < otb::Image< unsigned short > >( imageRef , image4 );
+  std::cout<< "Test 4 : "<<test4<<std::endl;
+  image4 = nullptr;
+
+  // image<real> --> image<complex>
+  otb::Image< std::complex<int> >::Pointer image5 = 
+    Cross < otb::Image< itk::FixedArray < double , 4 > >  , otb::Image< std::complex<int> > > ( argv[1] );
+  bool test5 = CompareImageComplex < otb::Image< std::complex<int> > >( imageRef , image5 );
+  std::cout<< "Test 5 : "<<test5<<std::endl;
+  image5 = nullptr;
+
+  // image<real> --> vector<real>
+  otb::VectorImage< float >::Pointer image6 = 
+    Cross < otb::Image< itk::FixedArray < double , 4 > >  , otb::VectorImage< float > > ( argv[1] );
+  bool test6 = CompareVectorReal < otb::VectorImage< float > >( imageRef , image6 );
+  std::cout<< "Test 6 : "<<test6<<std::endl;
+  image6 = nullptr;
+
+  // image<real> --> vector<complex>
+  otb::VectorImage< std::complex<float> >::Pointer image7 = 
+    Cross < otb::Image< itk::FixedArray < double , 4 > >  , otb::VectorImage< std::complex<float> > > ( argv[1] );
+  bool test7 = CompareVectorComplex < otb::VectorImage< std::complex<float> > >( imageRef , image7 );
+  std::cout<< "Test 7 : "<<test7<<std::endl;  
+
+  // vector<complex> --> vector<real>
+  otb::VectorImage< int >::Pointer image8 = 
+    Cross <  otb::VectorImage< int > > ( image7 );
+  bool test8 = CompareVectorReal < otb::VectorImage< int > >( imageRef , image8 );
+  std::cout<< "Test 8 : "<<test8<<std::endl;
+  image8=nullptr;
+
+  // vector<complex> --> vector<complex>
+  otb::VectorImage< std::complex<int> >::Pointer image9 = 
+    Cross <  otb::VectorImage< std::complex<int> > > ( image7 );
+  bool test9 = CompareVectorComplex < otb::VectorImage< std::complex<int> > >( imageRef , image9 );
+  std::cout<< "Test 9 : "<<test9<<std::endl;
+  image9=nullptr;
+
+  // vector<complex> --> image<real>
+  otb::Image< int >::Pointer image10 = 
+    Cross <  otb::Image< int > > ( image7 );
+  bool test10 = CompareImageReal < otb::Image< int > >( imageRef , image10 );
+  std::cout<< "Test 10 : "<<test10<<std::endl;
+  image10=nullptr;
+
+  // vector<complex> --> image<complex>
+  otb::Image< std::complex<unsigned short> >::Pointer image11 = 
+    Cross <  otb::Image< std::complex<unsigned short> > > ( image7 );
+  bool test11 = CompareImageComplex < otb::Image< std::complex<unsigned short> > >( imageRef , image11 );
+  std::cout<< "Test 11 : "<<test11<<std::endl;
+  image11=nullptr;
+
+  // image<complex> --> vector<complex>
+  otb::VectorImage<std::complex<float>>::Pointer image12 = 
+    Cross < otb::Image< std::complex<float> >   , otb::VectorImage< std::complex<float>> > ( argv[1] );
+  bool test12 = CompareVectorComplex < otb::VectorImage<std::complex<float>> >( imageRef , image12 );
+  std::cout<< "Test 12 : "<<test12<<std::endl;
+  image12 = nullptr;
+
+  // image<complex> --> image<complex>
+  otb::Image< std::complex< short >>::Pointer image13 = 
+    Cross < otb::Image< std::complex<float> >   , otb::Image< std::complex< short >> > ( argv[1] );
+  bool test13 = CompareImageComplex < otb::Image< std::complex< short >> >( imageRef , image13 );
+  std::cout<< "Test 13 : "<<test13<<std::endl;
+  image13 = nullptr;
+
+  // image<complex> --> image<real>
+  otb::Image< int >::Pointer image14 = 
+    Cross < otb::Image< std::complex<float> >   , otb::Image< int > > ( argv[1] );
+  bool test14 = CompareImageReal < otb::Image< int > >( imageRef , image14 );
+  std::cout<< "Test 14 : "<<test14<<std::endl;
+  image14 = nullptr;
+
+  // image<complex> --> vector<real>
+  otb::VectorImage< unsigned short >::Pointer image15 = 
+    Cross < otb::Image< std::complex<float> >   , otb::VectorImage< unsigned short > > ( argv[1] );
+  bool test15 = CompareVectorReal < otb::VectorImage< unsigned short > >( imageRef , image15 );
+  std::cout<< "Test 15 : "<<test15<<std::endl;
+  image15 = nullptr;
+
+  // image<fixedarray<real>> --> image<fixedarray<complex>>
+  otb::Image< itk::FixedArray < std::complex<float> , 2 > >::Pointer image16 = 
+    Cross < otb::Image< itk::FixedArray < double , 4 > > ,
+            otb::Image< itk::FixedArray < std::complex<float> , 2 > > > ( argv[1] );
+  bool test16 = CompareArrayComplex < otb::Image< itk::FixedArray < std::complex<float> , 2 > > >( imageRef , image16 );
+  std::cout<< "Test 16 : "<<test16<<std::endl; 
+
+  // image<fixedarray<complex>> --> vectorimage<real>
+  otb::VectorImage< int >::Pointer image17 = 
+    Cross < otb::VectorImage< int > >( image16 );
+  bool test17 = CompareVectorReal < otb::VectorImage< int > >( imageRef , image17 );
+  std::cout<< "Test 17 : "<<test17<<std::endl; 
+  image17 = nullptr;
+
+  // vector<real> --> image<fixedarray<complex>>
+  otb::Image< itk::FixedArray < std::complex<float> , 2 > >::Pointer image18 = 
+    Cross < otb::VectorImage< int > ,
+            otb::Image< itk::FixedArray < std::complex<float> , 2 > > > ( argv[1] );
+  bool test18 = CompareArrayComplex < otb::Image< itk::FixedArray < std::complex<float> , 2 > > >( imageRef , image18 );
+  image18 = nullptr;
+  std::cout<< "Test 18 : "<<test18<<std::endl; 
+
+  if (test1 && test2 && test3 && test4 && test5 &&test6 && test7 && test8 
+   && test9 && test10 && test11 && test12 && test13 && test14 && test15 
+   && test16 && test17 && test18 )
+    return EXIT_SUCCESS;
+  return EXIT_FAILURE;
+}
diff --git a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
index b5176d976154edad57bcd2f470a2cff6eb76085c..c5b59f8ef2d62eb790adf085e5c9121db5f28d4a 100644
--- a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx
@@ -61,8 +61,6 @@ void RegisterTests()
   REGISTER_TEST(otbPhaseFunctorTest);
   REGISTER_TEST(otbShiftScaleVectorImageFilterNew);
   REGISTER_TEST(otbChangeLabelImageFilter);
-  REGISTER_TEST(otbClampVectorImageFilterNew);
-  REGISTER_TEST(otbClampVectorImageFilterTest);
   REGISTER_TEST(otbPrintableImageFilterNew);
   REGISTER_TEST(otbShiftScaleImageAdaptorNew);
   REGISTER_TEST(otbStreamingInnerProductVectorImageFilterNew);
@@ -87,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);
diff --git a/Modules/Filtering/ImageManipulation/test/otbOneRIBandImageToOneComplexBandImage.cxx b/Modules/Filtering/ImageManipulation/test/otbOneRIBandImageToOneComplexBandImage.cxx
index b7d8de1665289709964b8938b56ab693ee62b93b..41a18d0bb3b611e3eee571932648c0803e92c3aa 100644
--- a/Modules/Filtering/ImageManipulation/test/otbOneRIBandImageToOneComplexBandImage.cxx
+++ b/Modules/Filtering/ImageManipulation/test/otbOneRIBandImageToOneComplexBandImage.cxx
@@ -20,7 +20,8 @@
 
 #include "itkMacro.h"
 
-#include "otbOneRIBandImageToOneComplexBandImage.h"
+// #include "otbOneRIBandImageToOneComplexBandImage.h"
+#include "otbClampImageFilter.h"
 
 #include "otbImage.h"
 #include "otbVectorImage.h"
@@ -37,7 +38,7 @@ int otbOneRIBandImageToOneComplexBandImage(int itkNotUsed(argc), char * argv[])
   typedef otb::Image<OutputPixelType, 2> OutputImageType;
  
  
-  typedef otb::OneRIBandImageToOneComplexBandImage<InputImageType, OutputImageType> FilterType;
+  typedef otb::ClampImageFilter<InputImageType, OutputImageType> FilterType;
   typedef otb::ImageFileReader<InputImageType> ReaderType;
   typedef otb::ImageFileWriter<OutputImageType> WriterType;
 
diff --git a/Modules/IO/IOXML/include/otbStatisticsXMLFileWriter.txx b/Modules/IO/IOXML/include/otbStatisticsXMLFileWriter.txx
index f1d830132a227162ceb539c3435fd8436b085de4..b20416b4d77617e0c23ea967603cbd910489ea5c 100644
--- a/Modules/IO/IOXML/include/otbStatisticsXMLFileWriter.txx
+++ b/Modules/IO/IOXML/include/otbStatisticsXMLFileWriter.txx
@@ -72,7 +72,7 @@ StatisticsXMLFileWriter<TMeasurementVector>
     itkExceptionMacro(<<"The XML output FileName is empty, please set the filename via the method SetFileName");
 
   // Check that the right extension is given : expected .xml */
-  std::string extension = itksys::SystemTools::GetFilenameLastExtension(m_FileName);
+  const std::string extension = itksys::SystemTools::GetFilenameLastExtension(m_FileName);
   if (itksys::SystemTools::LowerCase(extension) != ".xml")
     {
     itkExceptionMacro(<<extension
diff --git a/Modules/Remote/otb-bv.remote.cmake b/Modules/Remote/otb-bv.remote.cmake
index 06e067e6586cc345fed2d1f6aade487cf08350b3..739f46126b5c658ce1eb11dcd0d07879dfbbcc8d 100644
--- a/Modules/Remote/otb-bv.remote.cmake
+++ b/Modules/Remote/otb-bv.remote.cmake
@@ -22,8 +22,8 @@
 otb_fetch_module(OTBBioVars
   "Biophysical variable estimation from remote sensing imagery.
 A more detailed description can be found on the project website:
-http://tully.ups-tlse.fr/jordi/otb-bv
+https://gitlab.orfeo-toolbox.org/jinglada/otb-bv
 "
-  GIT_REPOSITORY http://tully.ups-tlse.fr/jordi/otb-bv.git
+  GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/jinglada/otb-bv.git
   GIT_TAG 0e56e487aebc4a493e25223960560e9ef0ca27ec
 )
diff --git a/Modules/Remote/phenotb.remote.cmake b/Modules/Remote/phenotb.remote.cmake
index aa9e9a8ead204e1b3a4f8492e16825c838da95d7..74d83a9d96d04bd545ee5b02d4790fcac6ab6e3e 100644
--- a/Modules/Remote/phenotb.remote.cmake
+++ b/Modules/Remote/phenotb.remote.cmake
@@ -24,8 +24,8 @@ otb_fetch_module(OTBPhenology
   information from time profiles. These time profiles should represent
   vegetation status as for instance NDVI, LAI, etc.
 A more detailed description can be found on the project website:
-http://tully.ups-tlse.fr/jordi/phenotb
+https://gitlab.orfeo-toolbox.org/jinglada/phenotb
 "
-  GIT_REPOSITORY http://tully.ups-tlse.fr/jordi/phenotb.git
+  GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/jinglada/phenotb.git
   GIT_TAG c9349eb89a652a18b28a40dfb3fa352b76388527
 )
diff --git a/Modules/Remote/temporal-gapfilling.remote.cmake b/Modules/Remote/temporal-gapfilling.remote.cmake
index 469a857fb8119f1564de992b6d0481f82920e61b..2dd788d21391a19390f40ac90ff3af1b5271311b 100644
--- a/Modules/Remote/temporal-gapfilling.remote.cmake
+++ b/Modules/Remote/temporal-gapfilling.remote.cmake
@@ -23,9 +23,9 @@ otb_fetch_module(OTBTemporalGapFilling
   "Gapfilling for time series replaces invalid pixels (as designated by a mask)
   by an interpolation using the valid dates of the series.
 A more detailed description can be found on the project website:
-http://tully.ups-tlse.fr/jordi/temporalgapfilling
+https://gitlab.orfeo-toolbox.org/jinglada/temporalgapfilling
 "
-  GIT_REPOSITORY http://tully.ups-tlse.fr/jordi/temporalgapfilling.git
+  GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/jinglada/temporalgapfilling.git
   # Commit on develop branch which includes patches for Windows support
   GIT_TAG 4fc4a71acf7b9b051cda5a3b950de2cdb9d26287
 )
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
index f97134cbd1e4eb32f6768168b50eb5cab7c94158..c6317be14289016f5a5f9636b1af864a1d0c969c 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h
@@ -592,11 +592,16 @@ public:
     {                                                                   \
     Image##Type::Pointer ret;                                           \
     Parameter* param = GetParameterByKey(parameter);                    \
-    if (dynamic_cast<InputImageParameter*>(param))                      \
+    InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param); \
+    ComplexInputImageParameter* paramDownC = dynamic_cast<ComplexInputImageParameter*>(param); \
+    if ( paramDown )                                                    \
       {                                                                 \
-      InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param); \
       ret = paramDown->Get##Image();                                    \
       }                                                                 \
+    else if ( paramDownC )  /* Support of ComplexInputImageParameter */ \
+      {                                                                 \
+      ret = paramDownC->Get##Image();                                   \
+      }                                                                 \
     return ret;                                                         \
     }
 
@@ -619,30 +624,16 @@ public:
   otbGetParameterImageMacro(UInt8RGBImage);
   otbGetParameterImageMacro(UInt8RGBAImage);
 
-  /* Get a complex image value
-   *
-   * Can be called for types :
-   * \li ParameterType_ComplexInputImage
-   */
-
-#define otbGetParameterComplexImageMacro( Image )                       \
-  Image##Type * GetParameter##Image( std::string parameter )            \
-    {                                                                   \
-    Image##Type::Pointer ret;                                           \
-    Parameter* param = GetParameterByKey(parameter);                    \
-    ComplexInputImageParameter* paramDown = dynamic_cast<ComplexInputImageParameter*>(param); \
-    if (paramDown)                                                      \
-      {                                                                 \
-      ret = paramDown->Get##Image();                                    \
-      }                                                                 \
-    return ret;                                                         \
-    }
-
-  otbGetParameterComplexImageMacro(ComplexFloatImage);
-  otbGetParameterComplexImageMacro(ComplexDoubleImage);
+  // Complex image
+  otbGetParameterImageMacro(ComplexInt16Image);
+  otbGetParameterImageMacro(ComplexInt32Image); 
+  otbGetParameterImageMacro(ComplexFloatImage);
+  otbGetParameterImageMacro(ComplexDoubleImage);
 
-  otbGetParameterComplexImageMacro(ComplexFloatVectorImage);
-  otbGetParameterComplexImageMacro(ComplexDoubleVectorImage);
+  otbGetParameterImageMacro(ComplexInt16VectorImage);
+  otbGetParameterImageMacro(ComplexInt32VectorImage);
+  otbGetParameterImageMacro(ComplexFloatVectorImage);
+  otbGetParameterImageMacro(ComplexDoubleVectorImage);
 
   /* Get an image list value
    *
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h
index 1fa00dd77d70660769bdd48e0031ac0d77d8e368..264967e376a209e0bf36929e4f4960b2e8cc5490 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.h
@@ -60,12 +60,37 @@ public:
   ComplexFloatVectorImageType* GetImage();
 
   /** Get the input image as XXXImageType */
+  ComplexInt16ImageType* GetComplexInt16Image();
+  ComplexInt32ImageType* GetComplexInt32Image();
   ComplexFloatImageType*  GetComplexFloatImage();
   ComplexDoubleImageType* GetComplexDoubleImage();
 
+  ComplexInt16VectorImageType* GetComplexInt16VectorImage();
+  ComplexInt32VectorImageType* GetComplexInt32VectorImage();
   ComplexFloatVectorImageType*  GetComplexFloatVectorImage();
   ComplexDoubleVectorImageType* GetComplexDoubleVectorImage();
 
+/* Support for ComplexInputImageParameter. This has been done to support 
+the macro otbGetParameterImageMacro of otbWrapperApplication.h */
+  UInt8ImageType* GetUInt8Image();
+  UInt16ImageType* GetUInt16Image();
+  Int16ImageType* GetInt16Image();
+  UInt32ImageType* GetUInt32Image();
+  Int32ImageType* GetInt32Image();
+  FloatImageType* GetFloatImage();
+  DoubleImageType* GetDoubleImage();
+
+  UInt8VectorImageType* GetUInt8VectorImage();
+  UInt16VectorImageType* GetUInt16VectorImage();
+  Int16VectorImageType* GetInt16VectorImage();
+  UInt32VectorImageType* GetUInt32VectorImage();
+  Int32VectorImageType* GetInt32VectorImage();
+  FloatVectorImageType* GetFloatVectorImage();
+  DoubleVectorImageType* GetDoubleVectorImage();
+
+  UInt8RGBImageType* GetUInt8RGBImage();
+  UInt8RGBAImageType* GetUInt8RGBAImage();
+
   /** Get the input image as templated image type. */
   template <class TImageType>
     TImageType* GetImage();
@@ -81,15 +106,6 @@ public:
   template <class TComplexInputImage, class TOutputImage>
     TOutputImage* CastImage();
 
-  /** Cast an image to an image of the same type
-  * Image to Image, VectorImage to VectorImage, RGBAImage to RGBAImage. */
-  template <class TComplexInputImage, class TOutputImage>
-    TOutputImage* SimpleCastImage();
-
-  /** Cast an image to a vector image. */
-  template <class TComplexInputImage, class TOutputImage>
-    TOutputImage* CastVectorImageFromImage();
-
   bool HasValue() const ITK_OVERRIDE;
 
   void ClearValue() ITK_OVERRIDE;
@@ -107,9 +123,6 @@ protected:
 
 
   /** Readers typedefs */
-  typedef otb::ImageFileReader<ComplexFloatImageType> ComplexFloatReaderType;
-  typedef otb::ImageFileReader<ComplexDoubleImageType> ComplexDoubleReaderType;
-
   typedef otb::ImageFileReader<ComplexFloatVectorImageType> ComplexFloatVectorReaderType;
   typedef otb::ImageFileReader<ComplexDoubleVectorImageType> ComplexDoubleVectorReaderType;
 
@@ -128,33 +141,6 @@ private:
 
 }; // End class ComplexInputImage Parameter
 
-
-// template specializations of CastImage<> should be declared in header
-// so that the linker knows they exist when building OTB Applications
-
-#define otbDefineCastImageMacro(ComplexInputImageType, OutputImageType)   \
-  template<> OutputImageType *                                          \
-  ComplexInputImageParameter::CastImage<ComplexInputImageType , OutputImageType>();   \
-
-#define otbGenericDefineCastImageMacro(ComplexInputImageType, prefix)     \
-  otbDefineCastImageMacro(ComplexInputImageType, ComplexFloat##prefix##ImageType) \
-  otbDefineCastImageMacro(ComplexInputImageType, ComplexDouble##prefix##ImageType)
-
-
-/*********************************************************************
-********************** Image -> Image
-**********************************************************************/
-
-  otbGenericDefineCastImageMacro(ComplexFloatImageType, )
-  otbGenericDefineCastImageMacro(ComplexDoubleImageType, )
-
-
-/*********************************************************************
-********************** VectorImage -> VectorImage
-**********************************************************************/
-  otbGenericDefineCastImageMacro(ComplexFloatVectorImageType, Vector)
-  otbGenericDefineCastImageMacro(ComplexDoubleVectorImageType, Vector)
-
 } // End namespace Wrapper
 } // End namespace otb
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx
index 774dfdbf789b8cdb48252f76e7aad13bba90399c..92e8dfd32e135ecc522a178f90a2be8fd3e1386a 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexInputImageParameter.txx
@@ -24,8 +24,9 @@
 #include "otbWrapperComplexInputImageParameter.h"
 
 #include "itkUnaryFunctorImageFilter.h"
-#include "itkCastImageFilter.h"
-#include "otbImageToVectorImageCastFilter.h"
+// #include "itkCastImageFilter.h"
+// #include "otbImageToVectorImageCastFilter.h"
+#include "otbClampImageFilter.h"
 
 namespace otb
 {
@@ -91,7 +92,15 @@ ComplexInputImageParameter::GetImage()
       }
     else
       {
-      if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer()))
+      if (dynamic_cast<ComplexInt16VectorImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt16VectorImageType, TOutputImage>();
+        }
+      else if (dynamic_cast<ComplexInt32VectorImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt32VectorImageType, TOutputImage>();
+        }
+      else if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer()))
         {
         return CastImage<ComplexFloatVectorImageType, TOutputImage>();
         }
@@ -99,6 +108,14 @@ ComplexInputImageParameter::GetImage()
         {
         return CastImage<ComplexDoubleVectorImageType, TOutputImage>();
         }
+      else if (dynamic_cast<ComplexInt16ImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt16ImageType, TOutputImage>();
+        }
+      else if (dynamic_cast<ComplexInt32ImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt32ImageType, TOutputImage>();
+        }
       else if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer()))
         {
         return CastImage<ComplexFloatImageType, TOutputImage>();
@@ -119,38 +136,10 @@ ComplexInputImageParameter::GetImage()
 template <class TComplexInputImage, class TOutputImage>
 TOutputImage*
 ComplexInputImageParameter::CastImage()
-{
-  itkExceptionMacro("Cast from "<<typeid(TComplexInputImage).name()
-                    <<" to "<<typeid(TOutputImage).name()<<" not authorized.");
-}
-
-
-template <class TComplexInputImage, class TOutputImage>
-TOutputImage*
-ComplexInputImageParameter::SimpleCastImage()
-{
-  TComplexInputImage* realComplexInputImage = dynamic_cast<TComplexInputImage*>(m_Image.GetPointer());
-
-  typedef itk::CastImageFilter<TComplexInputImage, TOutputImage> CasterType;
-  typename CasterType::Pointer caster = CasterType::New();
-
-  caster->SetInput(realComplexInputImage);
-  caster->UpdateOutputInformation();
-
-  m_Image = caster->GetOutput();
-  m_Caster = caster;
-
-  return caster->GetOutput();
-}
-
-
-template <class TComplexInputImage, class TOutputImage>
-TOutputImage*
-ComplexInputImageParameter::CastVectorImageFromImage()
 {
   TComplexInputImage* realComplexInputImage = dynamic_cast<TComplexInputImage*>(m_Image.GetPointer());
 
-  typedef ImageToVectorImageCastFilter<TComplexInputImage, TOutputImage> CasterType;
+  typedef ClampImageFilter<TComplexInputImage, TOutputImage> CasterType;
   typename CasterType::Pointer caster = CasterType::New();
 
   caster->SetInput(realComplexInputImage);
@@ -160,6 +149,8 @@ ComplexInputImageParameter::CastVectorImageFromImage()
   m_Caster = caster;
 
   return caster->GetOutput();
+  // itkExceptionMacro("Cast from "<<typeid(TComplexInputImage).name()
+  //                   <<" to "<<typeid(TOutputImage).name()<<" not authorized.");
 }
 
 template <class TComplexInputImage>
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h
index 371c4d416691d36e3e07ffe50ea69c1580c20284..0613816b47f09f9c38ceafa4ad9fccbedea2582e 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperComplexOutputImageParameter.h
@@ -122,23 +122,18 @@ protected:
   template <class TInputVectorImageType>
     void SwitchVectorImageWrite();
 
-  //FloatVectorImageType::Pointer m_Image;
   ImageBaseType::Pointer m_Image;
   std::string            m_FileName;
   ComplexImagePixelType         m_ComplexPixelType;
   ComplexImagePixelType         m_DefaultComplexPixelType;
 
-  typedef otb::ImageFileWriter<ComplexFloatImageType>  ComplexFloatWriterType;
-  typedef otb::ImageFileWriter<ComplexDoubleImageType> ComplexDoubleWriterType;
-
-
+  typedef otb::ImageFileWriter<ComplexInt16VectorImageType>  ComplexVectorInt16WriterType;
+  typedef otb::ImageFileWriter<ComplexInt32VectorImageType>  ComplexVectorInt32WriterType;
   typedef otb::ImageFileWriter<ComplexFloatVectorImageType>  ComplexVectorFloatWriterType;
   typedef otb::ImageFileWriter<ComplexDoubleVectorImageType> ComplexVectorDoubleWriterType;
 
-
-  ComplexFloatWriterType::Pointer  m_ComplexFloatWriter;
-  ComplexDoubleWriterType::Pointer m_ComplexDoubleWriter;
-
+  ComplexVectorInt16WriterType::Pointer  m_ComplexVectorInt16Writer;
+  ComplexVectorInt32WriterType::Pointer  m_ComplexVectorInt32Writer;
   ComplexVectorFloatWriterType::Pointer  m_ComplexVectorFloatWriter;
   ComplexVectorDoubleWriterType::Pointer m_ComplexVectorDoubleWriter;
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
index 6ff36eedeed7f32c1382aa06be580d2904741967..3f83839de104e5bb536c821d9efa2573d13e8890 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h
@@ -80,6 +80,16 @@ public:
   UInt8RGBImageType* GetUInt8RGBImage();
   UInt8RGBAImageType* GetUInt8RGBAImage();
 
+  // Complex image
+  ComplexInt16ImageType*  GetComplexInt16Image();
+  ComplexInt32ImageType*  GetComplexInt32Image();
+  ComplexFloatImageType*  GetComplexFloatImage();
+  ComplexDoubleImageType* GetComplexDoubleImage();
+
+  ComplexInt16VectorImageType*  GetComplexInt16VectorImage();
+  ComplexInt32VectorImageType*  GetComplexInt32VectorImage();
+  ComplexFloatVectorImageType*  GetComplexFloatVectorImage();
+  ComplexDoubleVectorImageType* GetComplexDoubleVectorImage();
 
   /** Get the input image as templated image type. */
   template <class TImageType>
@@ -97,17 +107,6 @@ public:
   template <class TInputImage, class TOutputImage>
   TOutputImage*  CastImage();
 
-  /** Cast an image to an image of the same type
-  * Image to Image, VectorImage to VectorImage, RGBAImage to RGBAImage. */
-  template <class TInputImage, class TOutputImage>
-    TOutputImage* SimpleCastImage();
-
-
-  /** Cast an image to a vector image. */
-  template <class TInputImage, class TOutputImage>
-    TOutputImage* CastVectorImageFromImage();
-
-
   bool HasValue() const ITK_OVERRIDE;
 
   void ClearValue() ITK_OVERRIDE;
@@ -145,6 +144,17 @@ protected:
   typedef otb::ImageFileReader<UInt8RGBImageType>  UInt8RGBReaderType;
   typedef otb::ImageFileReader<UInt8RGBAImageType> UInt8RGBAReaderType;
 
+  // Complex
+  typedef otb::ImageFileReader<ComplexInt16ImageType> ComplexInt16ReaderType;
+  typedef otb::ImageFileReader<ComplexInt32ImageType> ComplexInt32ReaderType;
+  typedef otb::ImageFileReader<ComplexFloatImageType> ComplexFloatReaderType;
+  typedef otb::ImageFileReader<ComplexDoubleImageType> ComplexDoubleReaderType;
+
+  typedef otb::ImageFileReader<ComplexInt16VectorImageType> ComplexInt16VectorReaderType;
+  typedef otb::ImageFileReader<ComplexInt32VectorImageType> ComplexInt32VectorReaderType;
+  typedef otb::ImageFileReader<ComplexFloatVectorImageType> ComplexFloatVectorReaderType;
+  typedef otb::ImageFileReader<ComplexDoubleVectorImageType> ComplexDoubleVectorReaderType;
+
   itk::ProcessObject::Pointer m_Reader;
   itk::ProcessObject::Pointer m_Caster;
 
@@ -160,63 +170,6 @@ private:
 
 }; // End class InputImage Parameter
 
-
-// template specializations of CastImage<> should be declared in header
-// so that the linker knows they exist when building OTB Applications
-
-#define otbDeclareCastImageMacro(InputImageType, OutputImageType)   \
-  template<> OTBApplicationEngine_EXPORT OutputImageType *                                          \
-  InputImageParameter::CastImage<InputImageType , OutputImageType>();    \
-
-#define otbGenericDeclareCastImageMacro(InputImageType, prefix)     \
-  otbDeclareCastImageMacro(InputImageType, UInt8##prefix##ImageType) \
-  otbDeclareCastImageMacro(InputImageType, UInt16##prefix##ImageType) \
-  otbDeclareCastImageMacro(InputImageType, Int16##prefix##ImageType) \
-  otbDeclareCastImageMacro(InputImageType, UInt32##prefix##ImageType) \
-  otbDeclareCastImageMacro(InputImageType, Int32##prefix##ImageType) \
-  otbDeclareCastImageMacro(InputImageType, Float##prefix##ImageType) \
-  otbDeclareCastImageMacro(InputImageType, Double##prefix##ImageType)
-
-
-/*********************************************************************
-********************** Image -> Image
-**********************************************************************/
-otbGenericDeclareCastImageMacro(UInt8ImageType, )
-otbGenericDeclareCastImageMacro(Int16ImageType, )
-otbGenericDeclareCastImageMacro(UInt16ImageType, )
-otbGenericDeclareCastImageMacro(Int32ImageType, )
-otbGenericDeclareCastImageMacro(UInt32ImageType, )
-otbGenericDeclareCastImageMacro(FloatImageType, )
-otbGenericDeclareCastImageMacro(DoubleImageType, )
-
-
-/*********************************************************************
-********************** VectorImage -> VectorImage
-**********************************************************************/
-otbGenericDeclareCastImageMacro(UInt8VectorImageType, Vector)
-otbGenericDeclareCastImageMacro(Int16VectorImageType, Vector)
-otbGenericDeclareCastImageMacro(UInt16VectorImageType, Vector)
-otbGenericDeclareCastImageMacro(Int32VectorImageType, Vector)
-otbGenericDeclareCastImageMacro(UInt32VectorImageType, Vector)
-otbGenericDeclareCastImageMacro(FloatVectorImageType, Vector)
-otbGenericDeclareCastImageMacro(DoubleVectorImageType, Vector)
-
-
-/*********************************************************************
-********************** Image -> VectorImage
-**********************************************************************/
-otbGenericDeclareCastImageMacro(UInt8ImageType, Vector)
-otbGenericDeclareCastImageMacro(Int16ImageType, Vector)
-otbGenericDeclareCastImageMacro(UInt16ImageType, Vector)
-otbGenericDeclareCastImageMacro(Int32ImageType, Vector)
-otbGenericDeclareCastImageMacro(UInt32ImageType, Vector)
-otbGenericDeclareCastImageMacro(FloatImageType, Vector)
-otbGenericDeclareCastImageMacro(DoubleImageType, Vector)
-
-#undef otbDeclareCastImageMacro
-#undef otbGenericDeclareCastImageMacro
-
-
 } // End namespace Wrapper
 } // End namespace otb
 
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx
index 9db0e6140868eb635b115f0b46627f956615d178..74e7385133261080cf1e05a831fbac8608f94abe 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.txx
@@ -24,8 +24,7 @@
 #include "otbWrapperInputImageParameter.h"
 
 #include "itkUnaryFunctorImageFilter.h"
-#include "itkCastImageFilter.h"
-#include "otbImageToVectorImageCastFilter.h"
+#include "otbClampImageFilter.h"
 
 namespace otb
 {
@@ -138,6 +137,22 @@ InputImageParameter::GetImage()
         {
         return CastImage<DoubleImageType, TImageType> ();
         }
+      else if (dynamic_cast<ComplexInt16ImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt16ImageType, TImageType>();
+        }
+      else if (dynamic_cast<ComplexInt32ImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt32ImageType, TImageType>();
+        }
+      else if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexFloatImageType, TImageType>();
+        }
+      else if (dynamic_cast<ComplexDoubleImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexDoubleImageType, TImageType>();
+        }
       else if (dynamic_cast<UInt8VectorImageType*> (m_Image.GetPointer()))
         {
         return CastImage<UInt8VectorImageType, TImageType> ();
@@ -174,6 +189,22 @@ InputImageParameter::GetImage()
         {
         return CastImage<UInt8RGBImageType, TImageType> ();
         }
+      else if (dynamic_cast<ComplexInt16VectorImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt16VectorImageType, TImageType>();
+        }
+      else if (dynamic_cast<ComplexInt32VectorImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexInt32VectorImageType, TImageType>();
+        }
+      else if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexFloatVectorImageType, TImageType>();
+        }
+      else if (dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer()))
+        {
+        return CastImage<ComplexDoubleVectorImageType, TImageType>();
+        }
       else
         {
 #if INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION
@@ -190,14 +221,6 @@ InputImageParameter::GetImage()
 template <class TInputImage, class TOutputImage>
 TOutputImage*
 InputImageParameter::CastImage()
-{
-  itkExceptionMacro("Cast from "<<typeid(TInputImage).name()<<" to "<<typeid(TOutputImage).name()<<" not authorized.");
-}
-
-
-template <class TInputImage, class TOutputImage>
-TOutputImage*
-InputImageParameter::SimpleCastImage()
 {
   if ( dynamic_cast<TOutputImage*> (m_Image.GetPointer()) )
     {
@@ -207,7 +230,7 @@ InputImageParameter::SimpleCastImage()
     {
     TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
 
-    typedef itk::CastImageFilter<TInputImage, TOutputImage> CasterType;
+    typedef ClampImageFilter<TInputImage, TOutputImage> CasterType;
     typename CasterType::Pointer caster = CasterType::New();
 
     caster->SetInput(realInputImage);
@@ -217,29 +240,10 @@ InputImageParameter::SimpleCastImage()
     m_Caster = caster;
 
     return caster->GetOutput();
-    }
+    } 
+  // itkExceptionMacro("Cast from "<<typeid(TInputImage).name()<<" to "<<typeid(TOutputImage).name()<<" not authorized.");
 }
 
-
-template <class TInputImage, class TOutputImage>
-TOutputImage*
-InputImageParameter::CastVectorImageFromImage()
-{
-  TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
-
-  typedef ImageToVectorImageCastFilter<TInputImage, TOutputImage> CasterType;
-  typename CasterType::Pointer caster = CasterType::New();
-
-  caster->SetInput(realInputImage);
-  caster->UpdateOutputInformation();
-
-  m_Image = caster->GetOutput();
-  m_Caster = caster;
-
-  return caster->GetOutput();
-}
-
-
 template <class TInputImage>
 void
 InputImageParameter::SetImage(TInputImage* image)
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
index b420299ff6b707f8ccbed39577b488684e527fae..fd0c392b706d11977caa60031c601b046860210c 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h
@@ -119,9 +119,6 @@ protected:
   /** Destructor */
   ~OutputImageParameter() ITK_OVERRIDE;
 
-  template <class TInputImageType>
-    void SwitchImageWrite();
-
   template <class TInputVectorImageType>
     void SwitchVectorImageWrite();
 
@@ -137,14 +134,6 @@ protected:
   ImagePixelType         m_PixelType;
   ImagePixelType         m_DefaultPixelType;
 
-  typedef otb::ImageFileWriter<UInt8ImageType>  UInt8WriterType;
-  typedef otb::ImageFileWriter<Int16ImageType>  Int16WriterType;
-  typedef otb::ImageFileWriter<UInt16ImageType> UInt16WriterType;
-  typedef otb::ImageFileWriter<Int32ImageType>  Int32WriterType;
-  typedef otb::ImageFileWriter<UInt32ImageType> UInt32WriterType;
-  typedef otb::ImageFileWriter<FloatImageType>  FloatWriterType;
-  typedef otb::ImageFileWriter<DoubleImageType> DoubleWriterType;
-
   typedef otb::ImageFileWriter<UInt8VectorImageType>  VectorUInt8WriterType;
   typedef otb::ImageFileWriter<Int16VectorImageType>  VectorInt16WriterType;
   typedef otb::ImageFileWriter<UInt16VectorImageType> VectorUInt16WriterType;
@@ -156,13 +145,10 @@ protected:
   typedef otb::ImageFileWriter<UInt8RGBAImageType>  RGBAUInt8WriterType;
   typedef otb::ImageFileWriter<UInt8RGBImageType>   RGBUInt8WriterType;
 
-  UInt8WriterType::Pointer  m_UInt8Writer;
-  Int16WriterType::Pointer  m_Int16Writer;
-  UInt16WriterType::Pointer m_UInt16Writer;
-  Int32WriterType::Pointer  m_Int32Writer;
-  UInt32WriterType::Pointer m_UInt32Writer;
-  FloatWriterType::Pointer  m_FloatWriter;
-  DoubleWriterType::Pointer m_DoubleWriter;
+  typedef otb::ImageFileWriter<ComplexInt16VectorImageType>  ComplexVectorInt16WriterType;
+  typedef otb::ImageFileWriter<ComplexInt32VectorImageType>  ComplexVectorInt32WriterType;
+  typedef otb::ImageFileWriter<ComplexFloatVectorImageType>  ComplexVectorFloatWriterType;
+  typedef otb::ImageFileWriter<ComplexDoubleVectorImageType> ComplexVectorDoubleWriterType;
 
   VectorUInt8WriterType::Pointer  m_VectorUInt8Writer;
   VectorInt16WriterType::Pointer  m_VectorInt16Writer;
@@ -175,6 +161,11 @@ protected:
   RGBUInt8WriterType::Pointer   m_RGBUInt8Writer;
   RGBAUInt8WriterType::Pointer  m_RGBAUInt8Writer;
 
+  ComplexVectorInt16WriterType::Pointer  m_ComplexVectorInt16Writer;
+  ComplexVectorInt32WriterType::Pointer  m_ComplexVectorInt32Writer;
+  ComplexVectorFloatWriterType::Pointer  m_ComplexVectorFloatWriter;
+  ComplexVectorDoubleWriterType::Pointer m_ComplexVectorDoubleWriter;
+
 private:
   OutputImageParameter(const Parameter &); //purposely not implemented
   void operator =(const Parameter&); //purposely not implemented
diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperTypes.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperTypes.h
index 86fc40fa9cbe4da613d8dfbb11aa3a8e969e2630..a27e22508403dc4fed5069571f16991ea9a07310 100644
--- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperTypes.h
+++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperTypes.h
@@ -78,10 +78,16 @@ typedef enum
   ImagePixelType_uint32,
   ImagePixelType_float,
   ImagePixelType_double,
+  ImagePixelType_cint16,
+  ImagePixelType_cint32,
+  ImagePixelType_cfloat,
+  ImagePixelType_cdouble,
 } ImagePixelType;
 
 typedef enum
 {
+  ComplexImagePixelType_int16,
+  ComplexImagePixelType_int32,
   ComplexImagePixelType_float,
   ComplexImagePixelType_double,
 } ComplexImagePixelType;
@@ -120,13 +126,19 @@ typedef otb::VectorImage<double>         DoubleVectorImageType;
 typedef otb::Image< itk::RGBPixel<unsigned char> >  UInt8RGBImageType;
 typedef otb::Image< itk::RGBAPixel<unsigned char> > UInt8RGBAImageType;
 
+typedef std::complex<short>  Int16ComplexPixelType;
+typedef std::complex<int>    Int32ComplexPixelType;
 typedef std::complex<float>  FloatComplexPixelType;
 typedef std::complex<double> DoubleComplexPixelType;
 
-// Complex Image Type (first : double and float)
+// Complex Image Type
+typedef otb::Image< Int16ComplexPixelType, 2 >  ComplexInt16ImageType;
+typedef otb::Image< Int32ComplexPixelType, 2 >  ComplexInt32ImageType;
 typedef otb::Image< FloatComplexPixelType, 2 >  ComplexFloatImageType;
 typedef otb::Image< DoubleComplexPixelType, 2 > ComplexDoubleImageType;
 
+typedef otb::VectorImage< Int16ComplexPixelType, 2 >  ComplexInt16VectorImageType;
+typedef otb::VectorImage< Int32ComplexPixelType, 2 >  ComplexInt32VectorImageType;
 typedef otb::VectorImage<FloatComplexPixelType, 2 >   ComplexFloatVectorImageType;
 typedef otb::VectorImage< DoubleComplexPixelType, 2 > ComplexDoubleVectorImageType;
 
diff --git a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
index 90853b7ede3c748b8e41f16c1b56fee904aa2d5d..9c0ec07d803e640a5fd67bf805e43e93bd985ac2 100644
--- a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
+++ b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt
@@ -31,13 +31,6 @@ set( OTBApplicationEngine_SRC
   otbWrapperInputFilenameListParameter.cxx
   otbWrapperOutputImageParameter.cxx
   otbWrapperInputImageParameter.cxx
-  otbWrapperInputImageParameterUInt8.cxx
-  otbWrapperInputImageParameterInt16.cxx
-  otbWrapperInputImageParameterUInt16.cxx
-  otbWrapperInputImageParameterInt32.cxx
-  otbWrapperInputImageParameterUInt32.cxx
-  otbWrapperInputImageParameterFloat.cxx
-  otbWrapperInputImageParameterDouble.cxx
   otbWrapperParameterKey.cxx
   otbWrapperDocExampleStructure.cxx
   otbWrapperInputVectorDataParameter.cxx
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx
index 6c59ad4c83753feeacf012655642eba680586279..22629f407458a925afa397824fa678456a9878d6 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexInputImageParameter.cxx
@@ -73,14 +73,18 @@ ComplexInputImageParameter::GetImage()
     return this->GetImage< image##Type > ();          \
   }
 
+otbGetImageMacro(ComplexInt16Image);
+otbGetImageMacro(ComplexInt32Image);
 otbGetImageMacro(ComplexFloatImage);
 otbGetImageMacro(ComplexDoubleImage);
 
+otbGetImageMacro(ComplexInt16VectorImage);
+otbGetImageMacro(ComplexInt32VectorImage);
 otbGetImageMacro(ComplexFloatVectorImage);
 otbGetImageMacro(ComplexDoubleVectorImage);
 
 
-#define otbCastImageMacro(ComplexInputImageType, OutputImageType, theMethod)   \
+/*#define otbCastImageMacro(ComplexInputImageType, OutputImageType, theMethod)   \
   template<> OutputImageType *                                          \
   ComplexInputImageParameter::CastImage<ComplexInputImageType , OutputImageType>()    \
   {                                                                     \
@@ -89,22 +93,22 @@ otbGetImageMacro(ComplexDoubleVectorImage);
 
 #define otbGenericCastImageMacro(ComplexInputImageType, theMethod, prefix)     \
   otbCastImageMacro(ComplexInputImageType, ComplexFloat##prefix##ImageType, theMethod) \
-  otbCastImageMacro(ComplexInputImageType, ComplexDouble##prefix##ImageType, theMethod)
+  otbCastImageMacro(ComplexInputImageType, ComplexDouble##prefix##ImageType, theMethod)*/
 
 
-/*********************************************************************
+/********************************************************************
 ********************** Image -> Image
-**********************************************************************/
+*********************************************************************/
 
-  otbGenericCastImageMacro(ComplexFloatImageType, SimpleCastImage, )
-  otbGenericCastImageMacro(ComplexDoubleImageType, SimpleCastImage, )
+//   otbGenericCastImageMacro(ComplexFloatImageType, SimpleCastImage, )
+//   otbGenericCastImageMacro(ComplexDoubleImageType, SimpleCastImage, )
 
 
 /*********************************************************************
 ********************** VectorImage -> VectorImage
 **********************************************************************/
-  otbGenericCastImageMacro(ComplexFloatVectorImageType, SimpleCastImage, Vector)
-  otbGenericCastImageMacro(ComplexDoubleVectorImageType, SimpleCastImage, Vector)
+//   otbGenericCastImageMacro(ComplexFloatVectorImageType, SimpleCastImage, Vector)
+//   otbGenericCastImageMacro(ComplexDoubleVectorImageType, SimpleCastImage, Vector)
 
   void
 ComplexInputImageParameter::SetImage(ComplexFloatVectorImageType* image)
@@ -133,6 +137,38 @@ ComplexInputImageParameter::ClearValue()
   m_UseFilename = true;
 }
 
+/* Support for ComplexInputImageParameter. This has been done to support 
+the macro otbGetParameterImageMacro of otbWrapperApplication.h */
+#define otbGetFalseImageMacro(image)                  \
+  image##Type *                                       \
+  ComplexInputImageParameter::Get##image ()           \
+  {                                                   \
+    return nullptr;                                   \
+  }
+
+otbGetFalseImageMacro(DoubleImage);
+otbGetFalseImageMacro(DoubleVectorImage);
+
+otbGetFalseImageMacro(FloatImage);
+otbGetFalseImageMacro(FloatVectorImage);
+
+otbGetFalseImageMacro(Int16Image);
+otbGetFalseImageMacro(Int16VectorImage);
+
+otbGetFalseImageMacro(UInt16Image);
+otbGetFalseImageMacro(UInt16VectorImage);
+
+otbGetFalseImageMacro(Int32Image);
+otbGetFalseImageMacro(Int32VectorImage);
+
+otbGetFalseImageMacro(UInt32Image);
+otbGetFalseImageMacro(UInt32VectorImage);
+
+otbGetFalseImageMacro(UInt8Image);
+otbGetFalseImageMacro(UInt8VectorImage);
+
+otbGetFalseImageMacro(UInt8RGBImage);
+otbGetFalseImageMacro(UInt8RGBAImage);
 
 }
 }
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx
index 64ef3657181d767341ce804d642374d6ed7b6a27..6d86118c4591da5f17e8a932356fbede5d2cdc3d 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperComplexOutputImageParameter.cxx
@@ -20,8 +20,7 @@
 
 #include "otbWrapperComplexOutputImageParameter.h"
 #include "itkUnaryFunctorImageFilter.h"
-#include "itkCastImageFilter.h"
-#include "itkVectorCastImageFilter.h"
+#include "otbClampImageFilter.h"
 
 #ifdef OTB_USE_MPI
 
@@ -59,6 +58,16 @@ ComplexOutputImageParameter::ConvertPixelTypeToString(ComplexImagePixelType type
   std::string ret;
   switch(type)
     {
+    case ComplexImagePixelType_int16:
+      {
+      ret = "cint16";
+      break;
+      }
+    case ComplexImagePixelType_int32:
+      {
+      ret = "cint32";
+      break;
+      }
     case ComplexImagePixelType_float:
       {
       ret = "cfloat";
@@ -76,7 +85,11 @@ ComplexOutputImageParameter::ConvertPixelTypeToString(ComplexImagePixelType type
 bool
 ComplexOutputImageParameter::ConvertStringToPixelType(const std::string &value, ComplexImagePixelType &type)
 {
-  if (value == "cfloat")
+  if (value == "cint16")
+    type = ComplexImagePixelType_int16;
+  if (value == "cint32")
+    type = ComplexImagePixelType_int32;
+  else if (value == "cfloat")
     type = ComplexImagePixelType_float;
   else if (value == "cdouble")
     type = ComplexImagePixelType_double;
@@ -87,16 +100,15 @@ ComplexOutputImageParameter::ConvertStringToPixelType(const std::string &value,
 
 void ComplexOutputImageParameter::InitializeWriters()
 {
-  m_ComplexFloatWriter = ComplexFloatWriterType::New();
-  m_ComplexDoubleWriter = ComplexDoubleWriterType::New();
-
+  m_ComplexVectorInt16Writer = ComplexVectorInt16WriterType::New();
+  m_ComplexVectorInt32Writer = ComplexVectorInt32WriterType::New();
   m_ComplexVectorFloatWriter = ComplexVectorFloatWriterType::New();
   m_ComplexVectorDoubleWriter = ComplexVectorDoubleWriterType::New();
 }
 
 template <typename TInput, typename TOutput> void CastAndWriteImage(itk::ImageBase<2> * in, otb::ImageFileWriter<TOutput> * writer, const std::string & filename, const unsigned int & ramValue)
 {
-  typedef itk::CastImageFilter<TInput, TOutput> ClampFilterType; 
+  typedef ClampImageFilter<TInput, TOutput> ClampFilterType; 
   typename ClampFilterType::Pointer clampFilter = ClampFilterType::New();         
   clampFilter->SetInput( dynamic_cast<TInput*>(in));
   
@@ -157,46 +169,58 @@ ComplexOutputImageParameter::SwitchImageWrite()
 {
   switch(m_ComplexPixelType )
     {
-    case ComplexImagePixelType_float:
+    case ComplexImagePixelType_int16:
     {
-    CastAndWriteImage<TInputImageType,ComplexFloatImageType>(m_Image,m_ComplexFloatWriter,m_FileName,m_RAMValue);
+    CastAndWriteImage<TInputImageType,ComplexInt16VectorImageType>(
+      m_Image ,
+      m_ComplexVectorInt16Writer ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
-    case ComplexImagePixelType_double:
+    case ComplexImagePixelType_int32:
     {
-    CastAndWriteImage<TInputImageType,ComplexDoubleImageType>(m_Image,m_ComplexDoubleWriter,m_FileName,m_RAMValue);
+    CastAndWriteImage<TInputImageType,ComplexInt32VectorImageType>(
+      m_Image ,
+      m_ComplexVectorInt32Writer ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
-    }
-}
-
-
-template <class TInputVectorImageType>
-void
-ComplexOutputImageParameter::SwitchVectorImageWrite()
-  {
-  switch(m_ComplexPixelType )
-    {
     case ComplexImagePixelType_float:
     {
-    CastAndWriteImage<TInputVectorImageType,ComplexFloatVectorImageType>(m_Image,m_ComplexVectorFloatWriter,m_FileName,m_RAMValue);
+    CastAndWriteImage<TInputImageType,ComplexFloatVectorImageType>(
+      m_Image ,
+      m_ComplexVectorFloatWriter ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     case ComplexImagePixelType_double:
     {
-    CastAndWriteImage<TInputVectorImageType,ComplexDoubleVectorImageType>(m_Image,m_ComplexVectorDoubleWriter,m_FileName,m_RAMValue);
+    CastAndWriteImage<TInputImageType,ComplexDoubleVectorImageType>(
+      m_Image ,
+      m_ComplexVectorDoubleWriter ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     }
-  }
-
+}
 
 void
 ComplexOutputImageParameter::Write()
 {
   m_Image->UpdateOutputInformation();
-
-  if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer()))
+  if (dynamic_cast<ComplexInt16ImageType*>(m_Image.GetPointer()))
+    {
+    SwitchImageWrite<ComplexInt16ImageType>();
+    }
+  else if (dynamic_cast<ComplexInt16ImageType*>(m_Image.GetPointer()))
+    {
+    SwitchImageWrite<ComplexInt16ImageType>();
+    }
+  else if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer()))
     {
     SwitchImageWrite<ComplexFloatImageType>();
     }
@@ -204,13 +228,21 @@ ComplexOutputImageParameter::Write()
     {
     SwitchImageWrite<ComplexDoubleImageType>();
     }
+  else if (dynamic_cast<ComplexInt16VectorImageType*>(m_Image.GetPointer()))
+    {
+    SwitchImageWrite<ComplexInt16VectorImageType>();
+    }
+  else if (dynamic_cast<ComplexInt32VectorImageType*>(m_Image.GetPointer()))
+    {
+    SwitchImageWrite<ComplexInt32VectorImageType>();
+    }
   else if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer()))
     {
-    SwitchVectorImageWrite<ComplexFloatVectorImageType>();
+    SwitchImageWrite<ComplexFloatVectorImageType>();
     }
   else if (dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer()))
     {
-    SwitchVectorImageWrite<ComplexDoubleVectorImageType>();
+    SwitchImageWrite<ComplexDoubleVectorImageType>();
     }
   else
     {
@@ -221,33 +253,25 @@ ComplexOutputImageParameter::Write()
 itk::ProcessObject*
 ComplexOutputImageParameter::GetWriter()
 {
-  int type = 0;
-  // 0 : image
-  // 1 : VectorImage
-
-  if ( dynamic_cast<ComplexFloatVectorImageType*>( m_Image.GetPointer()) ||
-       dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer()))
-    {
-    type = 1;
-    }
-
   itk::ProcessObject* writer = ITK_NULLPTR;
   switch ( GetComplexPixelType() )
     {
+    case ComplexImagePixelType_int16:
+    {
+      writer = m_ComplexVectorInt16Writer;
+    }
+    case ComplexImagePixelType_int32:
+    {
+      writer = m_ComplexVectorInt32Writer;
+    }
     case ComplexImagePixelType_float:
     {
-    if( type == 1 )
       writer = m_ComplexVectorFloatWriter;
-    else
-      writer = m_ComplexFloatWriter;
     break;
     }
     case ComplexImagePixelType_double:
     {
-    if( type == 1 )
       writer = m_ComplexVectorDoubleWriter;
-    else
-      writer = m_ComplexDoubleWriter;
     break;
     }
     }
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx
index 166ab2956ad5fc46a6bd1df6a1298e3066b4f23f..fe226ef2ffbd7ccb6f588e3926642181c31819ea 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx
@@ -70,6 +70,17 @@ InputImageParameter::GetImage()
 
 otbGetImageMacro(UInt8RGBImage);
 otbGetImageMacro(UInt8RGBAImage);
+otbGetImageAndVectorImageMacro(UInt8);
+otbGetImageAndVectorImageMacro(UInt16);
+otbGetImageAndVectorImageMacro(UInt32);
+otbGetImageAndVectorImageMacro(Int16);
+otbGetImageAndVectorImageMacro(Int32);
+otbGetImageAndVectorImageMacro(Float);
+otbGetImageAndVectorImageMacro(Double);
+otbGetImageAndVectorImageMacro(ComplexInt16);
+otbGetImageAndVectorImageMacro(ComplexInt32);
+otbGetImageAndVectorImageMacro(ComplexFloat);
+otbGetImageAndVectorImageMacro(ComplexDouble);
 
 
 void
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterDouble.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterDouble.cxx
deleted file mode 100644
index e6a07bc294ff440924d5efa5f42f5634cffd1081..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterDouble.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
- *
- * This file is part of Orfeo Toolbox
- *
- *     https://www.orfeo-toolbox.org/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "otbWrapperInputImageParameter.h"
-#include "itksys/SystemTools.hxx"
-#include "otbWrapperTypes.h"
-#include "otbWrapperInputImageParameterMacros.h"
-#include "otb_boost_string_header.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-otbGetImageMacro(DoubleImage);
-otbGetImageMacro(DoubleVectorImage)
-otbGenericCastImageMacro(DoubleImageType, SimpleCastImage, )
-otbGenericCastImageMacro(DoubleVectorImageType, SimpleCastImage, Vector)
-otbGenericCastImageMacro(DoubleImageType, CastVectorImageFromImage, Vector)
-}
-}
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterFloat.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterFloat.cxx
deleted file mode 100644
index fda1544048718215b7dd7757d37baeee12fbb6af..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterFloat.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
- *
- * This file is part of Orfeo Toolbox
- *
- *     https://www.orfeo-toolbox.org/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "otbWrapperInputImageParameter.h"
-#include "otbWrapperInputImageParameterMacros.h"
-#include "itksys/SystemTools.hxx"
-#include "otbWrapperTypes.h"
-#include "otb_boost_string_header.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-otbGetImageMacro(FloatImage);
-otbGetImageMacro(FloatVectorImage)
-otbGenericCastImageMacro(FloatImageType, SimpleCastImage, )
-otbGenericCastImageMacro(FloatVectorImageType, SimpleCastImage, Vector)
-otbGenericCastImageMacro(FloatImageType, CastVectorImageFromImage, Vector)
-}
-}
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterInt16.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterInt16.cxx
deleted file mode 100644
index 22f617fce468169f23ed64db00e695902430f127..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterInt16.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
- *
- * This file is part of Orfeo Toolbox
- *
- *     https://www.orfeo-toolbox.org/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "otbWrapperInputImageParameter.h"
-#include "itksys/SystemTools.hxx"
-#include "otbWrapperTypes.h"
-#include "otbWrapperInputImageParameterMacros.h"
-#include "otb_boost_string_header.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-otbGetImageMacro(Int16Image);
-otbGetImageMacro(Int16VectorImage)
-otbGenericCastImageMacro(Int16ImageType, SimpleCastImage, )
-otbGenericCastImageMacro(Int16VectorImageType, SimpleCastImage, Vector)
-otbGenericCastImageMacro(Int16ImageType, CastVectorImageFromImage, Vector)
-}
-}
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterInt32.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterInt32.cxx
deleted file mode 100644
index ab59107c9e357068ef461bd3b975ec3e16d524b2..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterInt32.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
- *
- * This file is part of Orfeo Toolbox
- *
- *     https://www.orfeo-toolbox.org/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "otbWrapperInputImageParameter.h"
-#include "itksys/SystemTools.hxx"
-#include "otbWrapperTypes.h"
-#include "otbWrapperInputImageParameterMacros.h"
-#include "otb_boost_string_header.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-otbGetImageMacro(Int32Image);
-otbGetImageMacro(Int32VectorImage)
-otbGenericCastImageMacro(Int32ImageType, SimpleCastImage, )
-otbGenericCastImageMacro(Int32VectorImageType, SimpleCastImage, Vector)
-otbGenericCastImageMacro(Int32ImageType, CastVectorImageFromImage, Vector)
-}
-}
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterMacros.h b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterMacros.h
index 4cc9d4d7ae998e8aec82b0856b8ac6e44dcad377..2f1a7915b4f9b1491fde3ba0f9d77fc004e9e021 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterMacros.h
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterMacros.h
@@ -28,22 +28,9 @@
     return this->GetImage< image##Type > ();          \
   }
 
-
-#define otbCastImageMacro(InputImageType, OutputImageType, theMethod)   \
-  template<> OutputImageType *                                          \
-  InputImageParameter::CastImage<InputImageType , OutputImageType>()    \
-  {                                                                     \
-    return this->theMethod<InputImageType , OutputImageType>();         \
-  }
-
-#define otbGenericCastImageMacro(InputImageType, theMethod, prefix)     \
-  otbCastImageMacro(InputImageType, UInt8##prefix##ImageType, theMethod) \
-  otbCastImageMacro(InputImageType, UInt16##prefix##ImageType, theMethod) \
-  otbCastImageMacro(InputImageType, Int16##prefix##ImageType, theMethod) \
-  otbCastImageMacro(InputImageType, UInt32##prefix##ImageType, theMethod) \
-  otbCastImageMacro(InputImageType, Int32##prefix##ImageType, theMethod) \
-  otbCastImageMacro(InputImageType, Float##prefix##ImageType, theMethod) \
-  otbCastImageMacro(InputImageType, Double##prefix##ImageType, theMethod)
+#define otbGetImageAndVectorImageMacro(type) \
+  otbGetImageMacro(type##Image);             \
+  otbGetImageMacro(type##VectorImage); 
 
 
 #endif
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt16.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt16.cxx
deleted file mode 100644
index c63857e57bd7bfd30fb466f74e9e36bcc1ddeea7..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt16.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
- *
- * This file is part of Orfeo Toolbox
- *
- *     https://www.orfeo-toolbox.org/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "otbWrapperInputImageParameter.h"
-#include "itksys/SystemTools.hxx"
-#include "otbWrapperTypes.h"
-#include "otbWrapperInputImageParameterMacros.h"
-#include "otb_boost_string_header.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-otbGetImageMacro(UInt16Image);
-otbGetImageMacro(UInt16VectorImage)
-otbGenericCastImageMacro(UInt16ImageType, SimpleCastImage, )
-otbGenericCastImageMacro(UInt16VectorImageType, SimpleCastImage, Vector)
-otbGenericCastImageMacro(UInt16ImageType, CastVectorImageFromImage, Vector)
-}
-}
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt32.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt32.cxx
deleted file mode 100644
index 50fdf0adf18aefe30b7b1efac80f2b5028619565..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt32.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
- *
- * This file is part of Orfeo Toolbox
- *
- *     https://www.orfeo-toolbox.org/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "otbWrapperInputImageParameter.h"
-#include "itksys/SystemTools.hxx"
-#include "otbWrapperTypes.h"
-#include "otbWrapperInputImageParameterMacros.h"
-#include "otb_boost_string_header.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-otbGetImageMacro(UInt32Image);
-otbGetImageMacro(UInt32VectorImage)
-otbGenericCastImageMacro(UInt32ImageType, SimpleCastImage, )
-otbGenericCastImageMacro(UInt32VectorImageType, SimpleCastImage, Vector)
-otbGenericCastImageMacro(UInt32ImageType, CastVectorImageFromImage, Vector)
-}
-}
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt8.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt8.cxx
deleted file mode 100644
index d388456e4267e8ba0753d54ff05439657d2c2e13..0000000000000000000000000000000000000000
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameterUInt8.cxx
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
- *
- * This file is part of Orfeo Toolbox
- *
- *     https://www.orfeo-toolbox.org/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "otbWrapperInputImageParameter.h"
-#include "itksys/SystemTools.hxx"
-#include "otbWrapperTypes.h"
-#include "otbWrapperInputImageParameterMacros.h"
-#include "otb_boost_string_header.h"
-
-namespace otb
-{
-namespace Wrapper
-{
-otbGetImageMacro(UInt8Image);
-otbGetImageMacro(UInt8VectorImage)
-otbGenericCastImageMacro(UInt8ImageType, SimpleCastImage, )
-otbGenericCastImageMacro(UInt8VectorImageType, SimpleCastImage, Vector)
-otbGenericCastImageMacro(UInt8ImageType, CastVectorImageFromImage, Vector)
-}
-}
diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
index 2790bdce255aa5d0e8a3f92ab625e274ce48bf10..d0dd6678797767b6f50d61ba0a9667173d1a77e1 100644
--- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
+++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx
@@ -20,7 +20,6 @@
 
 #include "otbWrapperOutputImageParameter.h"
 #include "otbClampImageFilter.h"
-#include "otbClampVectorImageFilter.h"
 #include "otbImageIOFactory.h"
 #include "itksys/SystemTools.hxx"
 
@@ -94,6 +93,26 @@ std::string OutputImageParameter::ConvertPixelTypeToString(ImagePixelType type)
       ret = "double";
       break;
       }
+    case ImagePixelType_cint16:
+      {
+      ret = "cint16";
+      break;
+      }
+    case ImagePixelType_cint32:
+      {
+      ret = "cint32";
+      break;
+      }
+    case ImagePixelType_cfloat:
+      {
+      ret = "cfloat";
+      break;
+      }
+    case ImagePixelType_cdouble:
+      {
+      ret = "cdouble";
+      break;
+      }
     }
   return ret;
 }
@@ -115,6 +134,14 @@ OutputImageParameter::ConvertStringToPixelType(const std::string &value, ImagePi
     type = ImagePixelType_float;
   else if (value == "double")
     type = ImagePixelType_double;
+  else if (value == "cint16")
+    type = ImagePixelType_cint16;
+  else if (value == "cint32")
+    type = ImagePixelType_cint32;
+  else if (value == "cfloat")
+    type = ImagePixelType_cfloat;
+  else if (value == "cdouble")
+    type = ImagePixelType_cdouble;
   else
     return false;
   return true;
@@ -122,14 +149,6 @@ OutputImageParameter::ConvertStringToPixelType(const std::string &value, ImagePi
 
 void OutputImageParameter::InitializeWriters()
 {
-  m_UInt8Writer = UInt8WriterType::New();
-  m_Int16Writer = Int16WriterType::New();
-  m_UInt16Writer = UInt16WriterType::New();
-  m_Int32Writer = Int32WriterType::New();
-  m_UInt32Writer = UInt32WriterType::New();
-  m_FloatWriter = FloatWriterType::New();
-  m_DoubleWriter = DoubleWriterType::New();
-
   m_VectorUInt8Writer = VectorUInt8WriterType::New();
   m_VectorInt16Writer = VectorInt16WriterType::New();
   m_VectorUInt16Writer = VectorUInt16WriterType::New();
@@ -140,13 +159,24 @@ void OutputImageParameter::InitializeWriters()
 
   m_RGBUInt8Writer = RGBUInt8WriterType::New();
   m_RGBAUInt8Writer = RGBAUInt8WriterType::New();
+
+  m_ComplexVectorInt16Writer = ComplexVectorInt16WriterType::New();
+  m_ComplexVectorInt32Writer = ComplexVectorInt32WriterType::New();
+  m_ComplexVectorFloatWriter = ComplexVectorFloatWriterType::New();
+  m_ComplexVectorDoubleWriter = ComplexVectorDoubleWriterType::New();
 }
 
 
-template <typename TInput, typename TOutput> void ClampAndWriteImage(itk::ImageBase<2> * in, otb::ImageFileWriter<TOutput> * writer, const std::string & filename, const unsigned int & ramValue)
+template <typename TInput, typename TOutput> 
+void 
+ClampAndWriteVectorImage( itk::ImageBase<2> * in ,
+                    otb::ImageFileWriter<TOutput> * writer , 
+                    const std::string & filename , 
+                    const unsigned int & ramValue )
 {
-  typedef otb::ClampImageFilter<TInput, TOutput> ClampFilterType; 
-  typename ClampFilterType::Pointer clampFilter = ClampFilterType::New();         
+  typedef ClampImageFilter < TInput , TOutput > ClampFilterType;
+  typename ClampFilterType::Pointer clampFilter ( ClampFilterType::New() );
+
   clampFilter->SetInput( dynamic_cast<TInput*>(in));
   
   bool useStandardWriter = true;
@@ -200,152 +230,116 @@ template <typename TInput, typename TOutput> void ClampAndWriteImage(itk::ImageB
     }
 }
 
-template <typename TInput, typename TOutput > void ClampAndWriteVectorImage(itk::ImageBase<2> * in, otb::ImageFileWriter<TOutput > * writer, const std::string & filename, const unsigned int & ramValue)
-{
-  typedef otb::ClampVectorImageFilter<TInput, TOutput> ClampFilterType; 
-  typename ClampFilterType::Pointer clampFilter = ClampFilterType::New();         
-  clampFilter->SetInput( dynamic_cast<TInput*>(in));
-  
-  bool useStandardWriter = true;
-  
-#ifdef OTB_USE_MPI
-  
-  otb::MPIConfig::Pointer mpiConfig = otb::MPIConfig::Instance();
-  
-  if (mpiConfig->GetNbProcs() > 1)
-    {
-    useStandardWriter = false;
-    
-    // Get file extension
-    std::string extension = itksys::SystemTools::GetFilenameExtension(filename);
-    
-    if(extension == ".vrt")
-      {
-      // Use the WriteMPI function
-      WriteMPI(clampFilter->GetOutput(),filename,ramValue);      
-      }
-    #ifdef OTB_USE_SPTW
-    else if (extension == ".tif")
-      {
-      // Use simple parallel tiff writer
-      typedef otb::SimpleParallelTiffWriter<TOutput> SPTWriterType;
-      
-      typename SPTWriterType::Pointer sptWriter = SPTWriterType::New();
-      sptWriter->SetFileName(filename);
-      sptWriter->SetInput(clampFilter->GetOutput());
-      sptWriter->SetAutomaticAdaptativeStreaming(ramValue);
-      sptWriter->Update();
-      }
-    
-    #endif
-    else
-      {
-      itkGenericExceptionMacro("File format "<<extension<<" not supported for parallel writing with MPI. Supported formats are .vrt and .tif. Extended filenames are not supported.");
-      }
-    }
-  #endif
-  
-  if(useStandardWriter)
-    {
-    
-    writer->SetFileName( filename );                                     
-    writer->SetInput(clampFilter->GetOutput());                                     
-    writer->SetAutomaticAdaptativeStreaming(ramValue);
-    writer->Update();
-    }
-}
-
-
-template <class TInputImageType>
+template <class TInput>
 void
-OutputImageParameter::SwitchImageWrite()
-{
+OutputImageParameter::SwitchVectorImageWrite()
+  {
   switch(m_PixelType )
     {
     case ImagePixelType_uint8:
     {
-    ClampAndWriteImage<TInputImageType,UInt8ImageType>(m_Image,m_UInt8Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage< TInput , UInt8VectorImageType > (
+      m_Image ,
+      m_VectorUInt8Writer ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     case ImagePixelType_int16:
     {
-    ClampAndWriteImage<TInputImageType,Int16ImageType>(m_Image,m_Int16Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage< TInput , Int16VectorImageType > (
+      m_Image ,
+      m_VectorInt16Writer ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     case ImagePixelType_uint16:
     {
-    ClampAndWriteImage<TInputImageType,UInt16ImageType>(m_Image,m_UInt16Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage< TInput , UInt16VectorImageType > (
+      m_Image ,
+      m_VectorUInt16Writer ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     case ImagePixelType_int32:
     {
-    ClampAndWriteImage<TInputImageType,Int32ImageType>(m_Image,m_Int32Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage< TInput , Int32VectorImageType > (
+      m_Image ,
+      m_VectorInt32Writer ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     case ImagePixelType_uint32:
     {
-    ClampAndWriteImage<TInputImageType,UInt32ImageType>(m_Image,m_UInt32Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage< TInput , UInt32VectorImageType > (
+      m_Image ,
+      m_VectorUInt32Writer ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     case ImagePixelType_float:
     {
-    ClampAndWriteImage<TInputImageType,FloatImageType>(m_Image,m_FloatWriter,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage< TInput , FloatVectorImageType > (
+      m_Image ,
+      m_VectorFloatWriter ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
     case ImagePixelType_double:
     {
-    ClampAndWriteImage<TInputImageType,DoubleImageType>(m_Image,m_DoubleWriter,m_FileName,m_RAMValue);
-    break;
-    }
-    }
-}
-
-
-template <class TInputVectorImageType>
-void
-OutputImageParameter::SwitchVectorImageWrite()
-  {
-  switch(m_PixelType )
-    {
-    case ImagePixelType_uint8:
-    {
-    ClampAndWriteVectorImage<TInputVectorImageType,UInt8VectorImageType>(m_Image,m_VectorUInt8Writer,m_FileName,m_RAMValue);
-    break;
-    }
-    case ImagePixelType_int16:
-    {
-    ClampAndWriteVectorImage<TInputVectorImageType,Int16VectorImageType>(m_Image,m_VectorInt16Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage< TInput , DoubleVectorImageType > (
+      m_Image ,
+      m_VectorDoubleWriter ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
-    case ImagePixelType_uint16:
+    case ImagePixelType_cint16:
     {
-    ClampAndWriteVectorImage<TInputVectorImageType,UInt16VectorImageType>(m_Image,m_VectorUInt16Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage < TInput , ComplexInt16VectorImageType > (
+      m_Image ,
+      m_ComplexVectorInt16Writer ,
+      m_FileName ,
+      m_RAMValue ); 
     break;
     }
-    case ImagePixelType_int32:
+    case ImagePixelType_cint32:
     {
-    ClampAndWriteVectorImage<TInputVectorImageType,Int32VectorImageType>(m_Image,m_VectorInt32Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage < TInput , ComplexInt32VectorImageType > (
+      m_Image ,
+      m_ComplexVectorInt32Writer ,
+      m_FileName ,
+      m_RAMValue ); 
     break;
     }
-    case ImagePixelType_uint32:
+    case ImagePixelType_cfloat:
     {
-    ClampAndWriteVectorImage<TInputVectorImageType,UInt32VectorImageType>(m_Image,m_VectorUInt32Writer,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage < TInput , ComplexFloatVectorImageType > (
+      m_Image ,
+      m_ComplexVectorFloatWriter ,
+      m_FileName ,
+      m_RAMValue ); 
     break;
     }
-    case ImagePixelType_float:
+    case ImagePixelType_cdouble:
     {
-    ClampAndWriteVectorImage<TInputVectorImageType,FloatVectorImageType>(m_Image,m_VectorFloatWriter,m_FileName,m_RAMValue);
-    break;
-    }
-    case ImagePixelType_double:
-    {
-    ClampAndWriteVectorImage<TInputVectorImageType,DoubleVectorImageType>(m_Image,m_VectorDoubleWriter,m_FileName,m_RAMValue);
+    ClampAndWriteVectorImage < TInput , ComplexDoubleVectorImageType > (
+      m_Image ,
+      m_ComplexVectorDoubleWriter ,
+      m_FileName ,
+      m_RAMValue );
     break;
     }
+    default:
+      break;
     }
   }
 
-
 template <class TInputRGBAImageType>
 void
 OutputImageParameter::SwitchRGBAImageWrite()
@@ -383,31 +377,47 @@ OutputImageParameter::Write()
 
   if (dynamic_cast<UInt8ImageType*>(m_Image.GetPointer()))
     {
-    SwitchImageWrite<UInt8ImageType>();
+    SwitchVectorImageWrite<UInt8ImageType>();
     }
   else if (dynamic_cast<Int16ImageType*>(m_Image.GetPointer()))
     {
-    SwitchImageWrite<Int16ImageType>();
+    SwitchVectorImageWrite<Int16ImageType>();
     }
   else if (dynamic_cast<UInt16ImageType*>(m_Image.GetPointer()))
     {
-    SwitchImageWrite<UInt16ImageType>();
+    SwitchVectorImageWrite<UInt16ImageType>();
     }
   else if (dynamic_cast<Int32ImageType*>(m_Image.GetPointer()))
     {
-    SwitchImageWrite<Int32ImageType>();
+    SwitchVectorImageWrite<Int32ImageType>();
     }
   else if (dynamic_cast<UInt32ImageType*>(m_Image.GetPointer()))
     {
-    SwitchImageWrite<UInt32ImageType>();
+    SwitchVectorImageWrite<UInt32ImageType>();
     }
   else if (dynamic_cast<FloatImageType*>(m_Image.GetPointer()))
     {
-    SwitchImageWrite<FloatImageType>();
+    SwitchVectorImageWrite<FloatImageType>();
     }
   else if (dynamic_cast<DoubleImageType*>(m_Image.GetPointer()))
     {
-    SwitchImageWrite<DoubleImageType>();
+    SwitchVectorImageWrite<DoubleImageType>();
+    }
+  else if (dynamic_cast<ComplexInt16ImageType*>(m_Image.GetPointer()) )
+    {
+    SwitchVectorImageWrite<ComplexInt16ImageType>();
+    }
+  else if (dynamic_cast<ComplexInt32ImageType*>(m_Image.GetPointer()) )
+    {
+    SwitchVectorImageWrite<ComplexInt32ImageType>();
+    }
+  else if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer()) )
+    {
+    SwitchVectorImageWrite<ComplexFloatImageType>();
+    }
+  else if (dynamic_cast<ComplexDoubleImageType*>(m_Image.GetPointer()) )
+    {
+    SwitchVectorImageWrite<ComplexDoubleImageType>();
     }
   else if (dynamic_cast<UInt8VectorImageType*>(m_Image.GetPointer()))
     {
@@ -437,6 +447,22 @@ OutputImageParameter::Write()
     {
     SwitchVectorImageWrite<DoubleVectorImageType>();
     }
+  else if (dynamic_cast<ComplexInt16VectorImageType*>(m_Image.GetPointer()))
+    {
+    SwitchVectorImageWrite<ComplexInt16VectorImageType>();
+    }
+  else if (dynamic_cast<ComplexInt32VectorImageType*>(m_Image.GetPointer()))
+    {
+    SwitchVectorImageWrite<ComplexInt32VectorImageType>();
+    }
+  else if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer()))
+    {
+    SwitchVectorImageWrite<ComplexFloatVectorImageType>();
+    }
+  else if (dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer()))
+    {
+    SwitchVectorImageWrite<ComplexDoubleVectorImageType>();
+    }
   else if (dynamic_cast<UInt8RGBImageType*>(m_Image.GetPointer()))
     {
     SwitchRGBImageWrite<UInt8RGBImageType>();
@@ -455,23 +481,14 @@ OutputImageParameter::Write()
 itk::ProcessObject*
 OutputImageParameter::GetWriter()
 {
-  int type = 0;
+  int type = 1;
   // 0 : image
   // 1 : VectorImage
   // 2 : RGBAImage
   // 3 : RGBImage
   itk::ProcessObject* writer = ITK_NULLPTR;
-  if (dynamic_cast<UInt8VectorImageType*> (m_Image.GetPointer())
-      || dynamic_cast<Int16VectorImageType*> (m_Image.GetPointer())
-      || dynamic_cast<UInt16VectorImageType*> (m_Image.GetPointer())
-      || dynamic_cast<Int32VectorImageType*> (m_Image.GetPointer())
-      || dynamic_cast<UInt32VectorImageType*> (m_Image.GetPointer())
-      || dynamic_cast<FloatVectorImageType*> (m_Image.GetPointer())
-      || dynamic_cast<DoubleVectorImageType*> (m_Image.GetPointer()))
-    {
-    type = 1;
-    }
-  else if (dynamic_cast<UInt8RGBAImageType*> (m_Image.GetPointer()))
+
+  if (dynamic_cast<UInt8RGBAImageType*> (m_Image.GetPointer()))
     {
     type = 2;
     writer = m_RGBAUInt8Writer;
@@ -492,9 +509,6 @@ OutputImageParameter::GetWriter()
       {
       switch(type)
         {
-        case 0:
-          writer = m_UInt8Writer;
-          break;
         case 1:
           writer = m_VectorUInt8Writer;
           break;
@@ -511,48 +525,60 @@ OutputImageParameter::GetWriter()
       {
       if (type == 1)
         writer = m_VectorInt16Writer;
-      else
-        if (type == 0) writer = m_Int16Writer;
       break;
       }
     case ImagePixelType_uint16:
       {
       if (type == 1)
         writer = m_VectorUInt16Writer;
-      else
-        if (type == 0) writer = m_UInt16Writer;
       break;
       }
     case ImagePixelType_int32:
       {
       if (type == 1)
         writer = m_VectorInt32Writer;
-      else
-        if (type == 0) writer = m_Int32Writer;
       break;
       }
     case ImagePixelType_uint32:
       {
       if (type == 1)
         writer = m_VectorUInt32Writer;
-      else
-        if (type == 0) writer = m_UInt32Writer;
       break;
       }
     case ImagePixelType_float:
       {
       if (type == 1)
         writer = m_VectorFloatWriter;
-      else
-        if (type == 0) writer = m_FloatWriter;
       break;
       }
     case ImagePixelType_double:
       {
       if (type == 1)
         writer = m_VectorDoubleWriter;
-      else
-        if (type == 0) writer = m_DoubleWriter;
+      break;
+      }
+    case ImagePixelType_cint16:
+      {
+      if( type == 1 )
+        writer = m_ComplexVectorInt16Writer;
+      break;
+      }
+    case ImagePixelType_cint32:
+      {
+      if( type == 1 )
+        writer = m_ComplexVectorInt32Writer;
+      break;
+      }
+    case ImagePixelType_cfloat:
+      {
+      if( type == 1 )
+        writer = m_ComplexVectorFloatWriter;
+      break;
+      }
+    case ImagePixelType_cdouble:
+      {
+      if( type == 1 )
+        writer = m_ComplexVectorDoubleWriter;
       break;
       }
     }
diff --git a/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
index 860c8673636aff84ee7d5ae5f26c9c5ab0bc733d..319466cb4c49d21b321d55aa57ff0df847f56a53 100644
--- a/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
+++ b/Modules/Wrappers/ApplicationEngine/test/CMakeLists.txt
@@ -171,6 +171,12 @@ otb_add_test(NAME owTvOutputImageParameter COMMAND otbApplicationEngineTestDrive
   "my description"
   )
 
+#~ otb_add_test(NAME owTvOutputImageParameterConversion COMMAND otbApplicationEngineTestDriver
+  #~ otbWrapperOutputImageParameterConversionTest
+  #~ ${INPUTDATA}/poupees.tif
+  #~ ${TEMP}/poupees_out.tif
+  #~ )
+
 otb_add_test(NAME owTvDocExampleStructureTest COMMAND otbApplicationEngineTestDriver
   --compare-ascii ${NOTOL}
   ${BASELINE}/owTuDocExampleStructureTest.txt
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx b/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
index f5b3aabf3d5b4642044293927422883c491198f1..5ccef4965304591a54437f5f75e1d4070bff360a 100644
--- a/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
+++ b/Modules/Wrappers/ApplicationEngine/test/otbApplicationEngineTestDriver.cxx
@@ -51,5 +51,6 @@ void RegisterTests()
   REGISTER_TEST(otbWrapperInputVectorDataParameterNew);
   REGISTER_TEST(otbWrapperOutputImageParameterNew);
   REGISTER_TEST(otbWrapperOutputImageParameterTest1);
+  //~ REGISTER_TEST(otbWrapperOutputImageParameterConversionTest);
   REGISTER_TEST(otbApplicationMemoryConnectTest);
 }
diff --git a/Modules/Wrappers/ApplicationEngine/test/otbWrapperOutputImageParameterTest.cxx b/Modules/Wrappers/ApplicationEngine/test/otbWrapperOutputImageParameterTest.cxx
index 76d6c6056e6ba55ed46f3edda89923fc1ad0c861..ea8899b8e0d50685f8e0973f17e1a50081dde7f5 100644
--- a/Modules/Wrappers/ApplicationEngine/test/otbWrapperOutputImageParameterTest.cxx
+++ b/Modules/Wrappers/ApplicationEngine/test/otbWrapperOutputImageParameterTest.cxx
@@ -23,8 +23,10 @@
 #endif
 
 #include "otbWrapperOutputImageParameter.h"
+#include "otbWrapperInputImageParameter.h"
 #include "otbImageFileReader.h"
 #include "otbWrapperTypes.h"
+#include <vector>
 
 int otbWrapperOutputImageParameterNew(int itkNotUsed(argc), char * itkNotUsed(argv)[])
 {
@@ -34,7 +36,6 @@ int otbWrapperOutputImageParameterNew(int itkNotUsed(argc), char * itkNotUsed(ar
   return EXIT_SUCCESS;
 }
 
-
 int otbWrapperOutputImageParameterTest1(int itkNotUsed(argc), char* argv[])
 {
   typedef otb::Wrapper::OutputImageParameter OutputImageParameterType;
@@ -59,3 +60,59 @@ int otbWrapperOutputImageParameterTest1(int itkNotUsed(argc), char* argv[])
 
   return EXIT_SUCCESS;
 }
+
+
+// template < typename ImageType >
+// void Cross( int p , std::string inputfilename, std::string outputfilename)
+// {
+//   otb::Wrapper::InputImageParameter::Pointer paramIn (
+//     otb::Wrapper::InputImageParameter::New() );
+//   paramIn->SetFromFileName( inputfilename ); 
+//   otb::Wrapper::OutputImageParameter::Pointer paramOut( 
+//     otb::Wrapper::OutputImageParameter::New() ); 
+//   paramOut->SetFileName( outputfilename );
+//   paramOut->SetImage(paramIn->GetImage<ImageType>());
+//   paramOut->InitializeWriters();
+//   paramOut->SetPixelType(static_cast<otb::Wrapper::ImagePixelType>(p));
+//   paramOut->Write();
+// }
+
+
+// int otbWrapperOutputImageParameterConversionTest(int , char* argv[])
+// {
+//   std::string filenamein = argv[1];
+//   std::string filenameout = argv[2] ;
+//   std::string extension = filenameout.substr( filenameout.find_last_of('.') );
+
+//   filenameout = filenameout.substr( 0 , filenameout.find_last_of('.') );
+
+//   for ( int i = otb::Wrapper::ImagePixelType_uint8 ; i < 11 ; i++ )
+//     {
+//       std::string type = 
+//       otb::Wrapper::OutputImageParameter::ConvertPixelTypeToString(
+//         static_cast<otb::Wrapper::ImagePixelType>(i) );
+//       Cross< otb::Wrapper::UInt8ImageType > (i , filenamein , filenameout+"_UInt8_"+ type + extension ) ;
+//       Cross< otb::Wrapper::Int16ImageType > ( i , filenamein , filenameout+"_Int16_"+ type + extension ) ;
+//       Cross< otb::Wrapper::UInt16ImageType > ( i , filenamein , filenameout+"_UInt16_"+ type + extension ) ;
+//       Cross< otb::Wrapper::Int32ImageType > ( i , filenamein , filenameout+"_Int21_"+ type + extension ) ;
+//       Cross< otb::Wrapper::UInt32ImageType > ( i , filenamein , filenameout+"_UInt32_"+ type + extension ) ;
+//       Cross< otb::Wrapper::FloatImageType > ( i , filenamein , filenameout+"_float_"+ type + extension ) ;
+//       Cross< otb::Wrapper::DoubleImageType > ( i , filenamein , filenameout+"_double_"+ type + extension ) ;
+//       Cross< otb::Wrapper::UInt8VectorImageType > ( i , filenamein , filenameout+"_UInt8Vect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::Int16VectorImageType > ( i , filenamein , filenameout+"_Int16Vect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::UInt16VectorImageType > ( i , filenamein , filenameout+"_UInt16Vect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::Int32VectorImageType > ( i , filenamein , filenameout+"_Int21Vect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::UInt32VectorImageType > ( i , filenamein , filenameout+"_UInt32Vect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::FloatVectorImageType > ( i , filenamein , filenameout+"_floatVect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::DoubleVectorImageType > ( i , filenamein , filenameout+"_doubleVect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexInt16ImageType > ( i , filenamein , filenameout+"_CInt16_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexInt32ImageType > ( i , filenamein , filenameout+"_CInt32_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexFloatImageType > ( i , filenamein , filenameout+"_Cfloat_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexDoubleImageType > ( i , filenamein , filenameout+"_Cdouble_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexInt16VectorImageType > ( i , filenamein , filenameout+"_CInt16Vect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexInt32VectorImageType > ( i , filenamein , filenameout+"_CInt32Vect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexFloatVectorImageType > ( i , filenamein , filenameout+"_CfloatVect_"+ type + extension ) ;
+//       Cross< otb::Wrapper::ComplexDoubleVectorImageType > ( i , filenamein , filenameout+"_CdoubleVect_"+ type + extension ) ;
+//     }
+//   return 0;
+// }
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx
index 0cd5800dfa462ba05af6123a247ca48c15d29d78..ab35389152756e9c4db507cd6478520ae5db9bba 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetComplexOutputImageParameter.cxx
@@ -67,6 +67,8 @@ void QtWidgetComplexOutputImageParameter::DoCreateWidget()
   // Set the Output PixelType choice Combobox
   m_ComboBox = new QComboBox;
   m_ComboBox->setToolTip("Complex Output Pixel Type");
+  m_ComboBox->addItem( "cint16");
+  m_ComboBox->addItem( "cint32");
   m_ComboBox->addItem( "cfloat");
   m_ComboBox->addItem( "cdouble");
   m_ComboBox->setCurrentIndex(m_OutputImageParam->GetComplexPixelType());
diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx
index 140ff6534f8487f97bbda7d0a99fc49128401843..9bcf5430d20d65864bb072d00a32792806610411 100644
--- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx
+++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputImageParameter.cxx
@@ -75,6 +75,10 @@ void QtWidgetOutputImageParameter::DoCreateWidget()
   m_ComboBox->addItem( "uint 32");
   m_ComboBox->addItem( "float");
   m_ComboBox->addItem( "double");
+  m_ComboBox->addItem( "cint16");
+  m_ComboBox->addItem( "cint32");
+  m_ComboBox->addItem( "cfloat");
+  m_ComboBox->addItem( "cdouble");
   m_ComboBox->setCurrentIndex(m_OutputImageParam->GetPixelType());
   connect( m_ComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(SetPixelType(int)) );
   connect( m_ComboBox, SIGNAL(currentIndexChanged(int)), GetModel(), SLOT(NotifyUpdate()) );