diff --git a/Code/IO/otbGDALImageIO.cxx b/Code/IO/otbGDALImageIO.cxx
index a636e1dbed0ac5fc19829186903b933727bfd6d5..5b28202c049904cdd35ea1c99bb1449e128968f3 100644
--- a/Code/IO/otbGDALImageIO.cxx
+++ b/Code/IO/otbGDALImageIO.cxx
@@ -264,56 +264,6 @@ void GDALImageIO::Read(void* buffer)
       }
     }
 
-  else if (GDALDataTypeIsComplex(m_PxType) && !m_IsComplex)
-    {
-    // Mise a jour du step
-    std::streamoff  step = static_cast<std::streamoff>(this->GetNumberOfComponents());
-
-    step = step * static_cast<std::streamoff>(m_BytePerPixel);
-
-    std::streamoff lNbPixels = (static_cast<std::streamoff>(lNbColumns))
-      * (static_cast<std::streamoff>(lNbLines));
-    std::streamoff lBufferSize = static_cast<std::streamoff>(m_BytePerPixel) * lNbPixels;
-    lBufferSize *= 2;
-
-    unsigned char* value = new unsigned char[lBufferSize];
-
-    for (int nbComponents = 0; nbComponents < dataset->GetRasterCount(); ++nbComponents)
-      {
-      CPLErr lCrGdal = dataset->GetRasterBand(nbComponents+1)->RasterIO(GF_Read,
-                                                                lFirstColumn,
-                                                                lFirstLine,
-                                                                lNbColumns,
-                                                                lNbLines,
-                                                                value,
-                                                                lNbColumns,
-                                                                lNbLines,
-                                                                m_PxType,
-                                                                0,
-                                                                0);
-      if (lCrGdal == CE_Failure)
-        {
-        itkExceptionMacro(<< "Error while reading image (GDAL format) " << m_FileName.c_str() << ".");
-        }
-      // Recopie dans le buffer
-      std::streamoff cpt(0);
-      //cpt = static_cast<std::streamoff>(nbComponents) * static_cast<std::streamoff>(m_BytePerPixel);
-      cpt = static_cast<std::streamoff>(nbComponents*2*m_BytePerPixel*2);
-      for (std::streamoff i = 0; i < lBufferSize; i = i + static_cast<std::streamoff>(m_BytePerPixel*2))
-        {
-        memcpy((void*) (&(p[cpt])),
-               (const void*) (&(value[i])),
-               (size_t) (m_BytePerPixel)); //Real part
-        memcpy((void*) (&(p[cpt+m_BytePerPixel*2])),
-               (const void*) (&(value[i+m_BytePerPixel])),
-               (size_t) (m_BytePerPixel)); //Imaginary part
-        cpt += step*2;
-        }
-      }
-      delete[] value;
-    }
-
-
   // In the indexed case, one has to retrieve the index image and the
   // color table, and translate p to a 4 components color values buffer
   else if (m_IsIndexed)
@@ -361,12 +311,37 @@ void GDALImageIO::Read(void* buffer)
   else
     {
     // Nominal case
+
+    // In some cases, we need to change some parameters for RasterIO
+    // if the file is complex and the reader is based on a vector of scalar
+    if(GDALDataTypeIsComplex(m_PxType) && !m_IsComplex && m_IsVectorImage)
+    {
+      m_BytePerPixel = m_BytePerPixel * 2 ;
+      m_NbBands = this->GetNumberOfComponents() / 2;
+    }
+    // if the file is scalar with only one band and the reader is based on a vector of complex
+    if(!GDALDataTypeIsComplex(m_PxType) && (m_NbBands == 1) && m_IsComplex && m_IsVectorImage )
+    {
+      m_BytePerPixel = m_BytePerPixel / 2 ;
+    }
+
+    // keep it for the moment
+    /*std::cout << "*** GDALimageIO::Read: nominal case ***"<<std::endl;
+    std::cout << "Paremeters RasterIO :" \
+        << ", indX = " << lFirstColumn \
+        << ", indY = " << lFirstLine \
+        << ", sizeX = " << lNbColumns \
+        << ", sizeY = " << lNbLines \
+        << ", GDAL Data Type = " << GDALGetDataTypeName(m_PxType) \
+        << ", nb Band to read = " << m_NbBands \
+        << ", nb BytePerPixel = " << m_BytePerPixel <<std::endl;*/
+
     CPLErr lCrGdal = m_Dataset->GetDataSet()->RasterIO(GF_Read,
                                                        lFirstColumn,
                                                        lFirstLine,
                                                        lNbColumns,
                                                        lNbLines,
-                                                       p,
+                                                       p, // pData
                                                        lNbColumns,
                                                        lNbLines,
                                                        m_PxType,
@@ -589,8 +564,7 @@ void GDALImageIO::InternalReadImageInformation()
   //Once all sorts of gdal complex image are handle, this won't be
   //necessary any more
   if (GDALDataTypeIsComplex(m_PxType) //TODO should disappear
-      && (m_PxType != GDT_CFloat32)
-      && (m_PxType != GDT_CFloat64))
+      && (m_PxType != GDT_CFloat32) && (m_PxType != GDT_CFloat64))
     {
     m_BytePerPixel = m_BytePerPixel * 2;
     this->SetNumberOfComponents(2);
@@ -610,16 +584,35 @@ void GDALImageIO::InternalReadImageInformation()
       }
     }
 
-  if(GDALDataTypeIsComplex(m_PxType) && !m_IsComplex)
+  if (GDALDataTypeIsComplex(m_PxType) && !m_IsComplex && m_IsVectorImage)
     {
     // we are reading a complex data set into an image where the pixel
-    // type is not complex: we have to double the number of component
+    // type is Vector<real>: we have to double the number of component
     // for that to work
+    //std::cout << "GDALtypeIO = complex and OTB::OutputPixelType = double and OTB::PixelType = Vector" << std::endl;
     m_BytePerPixel = m_BytePerPixel / 2;
     this->SetNumberOfComponents(m_NbBands*2);
     this->SetPixelType(VECTOR);
     }
 
+  if (!GDALDataTypeIsComplex(m_PxType) && m_IsComplex && m_IsVectorImage)
+    {
+    // we are reading a non-complex data set into an image where the pixel
+    // type is Vector<complex>: we have to double the number of byte per pixel
+    // for that to work
+    //std::cout << "GDALtypeIO = double and OTB::OutputPixelType = complex and OTB::PixelType = Vector" << std::endl;
+    m_BytePerPixel = m_BytePerPixel * 2;
+    this->SetPixelType(VECTOR);
+    }
+
+  /* keep it for the moment
+   * std::cout << " *** Parameters set in Internal Read function ***" << std::endl;
+  std::cout << " Pixel Type GDAL = "  << GDALGetDataTypeName(m_PxType) << std::endl;
+  std::cout << " Pixel Type otb = " << GetPixelTypeAsString(this->GetPixelType()) << std::endl;
+  std::cout << " Number of band in file = " << m_NbBands << std::endl;
+  std::cout << " Number of component otb = " << this->GetNumberOfComponents() << std::endl;
+  std::cout << " Byte per pixel = " << m_BytePerPixel << std::endl;
+  std::cout << " Component Type otb = " << GetComponentTypeAsString(this->GetComponentType()) <<std::endl;*/
 
   /*----------------------------------------------------------------------*/
   /*-------------------------- METADATA ----------------------------------*/
diff --git a/Code/IO/otbGDALImageIO.h b/Code/IO/otbGDALImageIO.h
index c05023ab8c0ebb082a90cdf41f7aeab92f729efa..e3e090c419530996c71fff6c9c2879ae2fc68c79 100644
--- a/Code/IO/otbGDALImageIO.h
+++ b/Code/IO/otbGDALImageIO.h
@@ -76,6 +76,10 @@ public:
   itkSetMacro(IsComplex, bool);
   itkGetMacro(IsComplex, bool);
 
+  /** Set/Get whether the pixel type (otb side) is Vector or Scalar */
+  itkSetMacro(IsVectorImage, bool);
+  itkGetMacro(IsVectorImage, bool);
+
   /** Set/Get the dataset index to extract (starting at 0)*/
   itkSetMacro(DatasetNumber, unsigned int);
   itkGetMacro(DatasetNumber, unsigned int);
@@ -175,6 +179,9 @@ private:
    * this information has to be provided by the reader */
   bool m_IsComplex;
 
+  /** Whether the pixel type (otb side, not gdal side) is Vector
+   * this information has to be provided by the reader */
+  bool m_IsVectorImage;
 
 };
 
diff --git a/Code/IO/otbImageFileReader.txx b/Code/IO/otbImageFileReader.txx
index 3d63902742cbfd67f7bbfb8a920b39f5f56be6e2..318173a8e48f0886824473cdbcb385f0e64ed119 100644
--- a/Code/IO/otbImageFileReader.txx
+++ b/Code/IO/otbImageFileReader.txx
@@ -174,7 +174,11 @@ ImageFileReader<TOutputImage>
                              * static_cast<std::streamoff>(region.GetNumberOfPixels());
 
     char * loadBuffer = new char[nbBytes];
-
+    /*std::cout<< "*** IFReader : read with conversion ***" << std::endl;
+    std::cout<< "size of Buffer to GDALImageIO::read = " << nbBytes << " = " \
+        << "ComponentSize ("<< this->m_ImageIO->GetComponentSize() << ") x " \
+        << "Nb of Component (" << this->m_ImageIO->GetNumberOfComponents() << ") x " \
+        << "Nb of Pixel to read (" << region.GetNumberOfPixels() << ")" << std::endl;*/
     this->m_ImageIO->Read(loadBuffer);
 
     this->DoConvertBuffer(loadBuffer, region.GetNumberOfPixels());
@@ -289,6 +293,12 @@ ImageFileReader<TOutputImage>
     OutputImagePixelType dummy;
     imageIO->SetIsComplex(PixelIsComplex(dummy));
 
+    // VectorImage ??
+    if (strcmp(output->GetNameOfClass(), "VectorImage") == 0)
+      imageIO->SetIsVectorImage(true);
+    else
+      imageIO->SetIsVectorImage(false);
+
     // Pass the dataset number (used for hdf files for example)
     imageIO->SetDatasetNumber(m_DatasetNumber);
     }
diff --git a/Testing/Code/IO/CMakeLists.txt b/Testing/Code/IO/CMakeLists.txt
index 9b9d1d1f4b77146a75a8e072beab33db85a11393..0fe61eda6be045630d61795d04d5de7528bcf74f 100644
--- a/Testing/Code/IO/CMakeLists.txt
+++ b/Testing/Code/IO/CMakeLists.txt
@@ -2788,71 +2788,138 @@ ADD_TEST(ioTvTileMapImageIOHelperTest ${IO_TESTS21}
               ${TEMP}/ioTvTileMapImageIOHelperTest.txt
 )
 
-ADD_TEST(ioTvImageDoubleToImageComplex ${IO_TESTS21}
+# Tests about complex reading
+ADD_TEST(ioTvImageDoubleToImageComplex ${IO_TESTS21} # OK
          otbImageDoubleToImageComplex
              ${INPUTDATA}/monobandDouble.tif
 )
 
-ADD_TEST(ioTvImageComplexToImageDouble ${IO_TESTS21}
+ADD_TEST(ioTvImageComplexToImageDouble ${IO_TESTS21} # OK
          otbImageComplexToImageDouble
               ${INPUTDATA}/monobandComplexDouble
 )
 
-ADD_TEST(ioTvImageComplexToImageComplex ${IO_TESTS21}
+ADD_TEST(ioTvImageComplexToImageComplex ${IO_TESTS21} # OK
          otbImageComplexToImageComplex
               ${INPUTDATA}/monobandComplexDouble.hdr
 )
 
-ADD_TEST(ioTvImageComplexToVectorImageDouble ${IO_TESTS21}
+ADD_TEST(ioTvImageComplexToVectorImageDouble ${IO_TESTS21} # OK
          otbImageComplexToVectorImageDouble
               ${INPUTDATA}/monobandComplexDouble.hdr
 )
 
-ADD_TEST(ioTvImageComplexToVectorImageComplex ${IO_TESTS21}
+ADD_TEST(ioTvImageComplexToVectorImageComplex ${IO_TESTS21} # OK
          otbImageComplexToVectorImageComplex
               ${INPUTDATA}/monobandComplexDouble.hdr
 )
 
-ADD_TEST(ioTvVectorImageDoubleToImageComplex ${IO_TESTS21}
+ADD_TEST(ioTvVectorImageDoubleToImageComplex ${IO_TESTS21} # OK
          otbVectorImageDoubleToImageComplex
               ${INPUTDATA}/multibandDouble.tif
 )
 
-ADD_TEST(ioTvVectorImageDoubleToVectorImageComplex ${IO_TESTS21}
+ADD_TEST(ioTvVectorImageDoubleToVectorImageComplex ${IO_TESTS21} #OK
          otbVectorImageDoubleToVectorImageComplex
               ${INPUTDATA}/multibandDouble.tif
 )
 
-ADD_TEST(ioTvVectorImageComplexToVectorImageDouble ${IO_TESTS21}
+ADD_TEST(ioTvVectorImageComplexToVectorImageDouble ${IO_TESTS21} #OK
          otbVectorImageComplexToVectorImageDouble
               ${INPUTDATA}/multibandComplexDouble.hdr
 )
 
-ADD_TEST(ioTvVectorImageComplexToVectorImageComplex ${IO_TESTS21}
+ADD_TEST(ioTvVectorImageComplexToVectorImageComplex ${IO_TESTS21} # OK
          otbVectorImageComplexToVectorImageComplex
               ${INPUTDATA}/multibandComplexDouble.hdr
 )
 
-ADD_TEST(ioTvImageDoubleToVectorImageComplex ${IO_TESTS21}
+ADD_TEST(ioTvImageDoubleToVectorImageComplex ${IO_TESTS21} # OK
          otbImageDoubleToVectorImageComplex
               ${INPUTDATA}/monobandDouble.tif
 )
 
-ADD_TEST(ioTvVectorImageComplexToImageDouble_2bands ${IO_TESTS21}
+ADD_TEST(ioTvVectorImageComplexToVectorImageDouble_3bands ${IO_TESTS21} #OK
+         otbVectorImageComplexToVectorImageDouble
+              ${INPUTDATA}/multibandComplexDouble_3bands.hdr
+)
+
+# Weird cases
+ADD_TEST(ioTvVectorImageComplexToImageDouble_2bands ${IO_TESTS21} #KO
          otbVectorImageComplexToImageDouble
               ${INPUTDATA}/multibandComplexDouble.hdr
 )
 
-ADD_TEST(ioTvVectorImageComplexToImageDouble_3bands ${IO_TESTS21}
+ADD_TEST(ioTvVectorImageComplexToImageDouble_3bands ${IO_TESTS21} # KO
          otbVectorImageComplexToImageDouble
-              ${INPUTDATA}/multi3bandsDouble.hdr
+              ${INPUTDATA}/multibandComplexDouble_3bands.hdr
 )
 
-ADD_TEST(ioTvVectorImageComplexToImageDouble_4bands ${IO_TESTS21}
+ADD_TEST(ioTvVectorImageComplexToImageDouble_4bands ${IO_TESTS21} #KO
          otbVectorImageComplexToImageDouble
-              ${INPUTDATA}/mono3bandsDouble.hdr
+              ${INPUTDATA}/multibandComplexDouble_4bands.hdr
 )
 
+# Tests with GDAL only (not deal for this commit)
+#ADD_TEST(ioTvGDALReadPxlComplexDbMono ${IO_TESTS21}
+#  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMono.txt
+#                           ${TEMP}/ioTvGDALReadPxlComplexDbMono_Out.txt
+#         otbGDALReadPxlComplexDb
+#              ${INPUTDATA}/monobandComplexDouble
+#              1 1
+#              ${TEMP}/ioTvGDALReadPxlComplexDbMono_Out.txt
+#)
+#ADD_TEST(ioTvGDALReadPxlComplexDbMulti ${IO_TESTS21}
+#  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMulti.txt
+#                           ${TEMP}/ioTvGDALReadPxlComplexDbMulti_Out.txt
+#         otbGDALReadPxlComplexDb
+#              ${INPUTDATA}/multibandComplexDouble
+#              1 1
+#              ${TEMP}/ioTvGDALReadPxlComplexDbMulti_Out.txt
+#)
+#ADD_TEST(ioTvGDALReadPxlComplexDbMulti3 ${IO_TESTS21}
+#  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMulti3.txt
+#                           ${TEMP}/ioTvGDALReadPxlComplexDbMulti3_Out.txt
+#         otbGDALReadPxlComplexDb
+#              ${INPUTDATA}/multibandComplexDouble_3bands
+#              100 100
+#              ${TEMP}/ioTvGDALReadPxlComplexDbMulti3_Out.txt
+#)
+#ADD_TEST(ioTvGDALReadPxlComplexDbMulti4 ${IO_TESTS21}
+#  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexDbMulti4.txt
+#                           ${TEMP}/ioTvGDALReadPxlComplexDbMulti4_Out.txt
+#         otbGDALReadPxlComplexDb
+#              ${INPUTDATA}/multibandComplexDouble_4bands
+#              0 0
+#              ${TEMP}/ioTvGDALReadPxlComplexDbMulti4_Out.txt
+#)
+#
+#
+#ADD_TEST(ioTvGDALReadPxlComplexFlMulti ${IO_TESTS21}
+#  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexFlMulti.txt
+#                           ${TEMP}/ioTvGDALReadPxlComplexFlMulti_Out.txt
+#         otbGDALReadPxlComplexFl
+#             ${INPUTDATA}/multibandComplexFloat
+#              100 100
+#              ${TEMP}/ioTvGDALReadPxlComplexFlMulti_Out.txt
+#)
+#ADD_TEST(ioTvGDALReadPxlComplexFlMulti3 ${IO_TESTS21}
+#  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexFlMulti3.txt
+#                           ${TEMP}/ioTvGDALReadPxlComplexFlMulti3_Out.txt
+#         otbGDALReadPxlComplexFl
+#              ${INPUTDATA}/multibandComplexFloat_3bands
+#              100 100
+#              ${TEMP}/ioTvGDALReadPxlComplexFlMulti3_Out.txt
+#)
+#ADD_TEST(ioTvGDALReadPxlComplexFlMulti4 ${IO_TESTS21}
+#  --compare-ascii ${NOTOL} ${BASELINE_FILES}/ioTvGDALReadPxlComplexFlMulti4.txt
+#                           ${TEMP}/ioTvGDALReadPxlComplexFlMulti4_Out.txt
+#         otbGDALReadPxlComplexFl
+#              ${INPUTDATA}/multibandComplexFloat_4bands
+#              100 100
+#              ${TEMP}/ioTvGDALReadPxlComplexFlMulti4_Out.txt
+#)
+
 #----------------------------------------------------------------------------------
 SET(BasicIO_SRCS1
 otbIOTests1.cxx
@@ -3062,6 +3129,9 @@ otbMapFileProductWriter.cxx
 otbKmzProductWriter.cxx
 otbTileMapImageIOHelperTest.cxx
 otbComplexImageManipulationTest.cxx
+#not deal in this commit
+#otbGDALReadPxlComplexDb.cxx
+#otbGDALReadPxlComplexFl.cxx
 )
 
 
diff --git a/Testing/Code/IO/otbComplexImageManipulationTest.cxx b/Testing/Code/IO/otbComplexImageManipulationTest.cxx
index 9c6c3190fbc20a30c05b6e71c4c3d2ac6a5fb95f..4762cdb4a5c31286149cb9b21424573d6a998a1c 100644
--- a/Testing/Code/IO/otbComplexImageManipulationTest.cxx
+++ b/Testing/Code/IO/otbComplexImageManipulationTest.cxx
@@ -45,7 +45,7 @@ int otbImageDoubleToImageComplex(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -60,15 +60,13 @@ int otbImageDoubleToImageComplex(int argc, char * argv[])
   it.GoToBegin();
   while( it.IsAtEnd()==false )
     {
-      count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0];
-
-      if( (it.Get().real() != static_cast<RealType>(count)) || (it.Get().imag() != static_cast<RealType>(0)) ) 
-  {
-    std::cout<<"Image double read as Image complex error : "<<it.Get()<<", waited for ("<<count<<", 0)"<<std::endl;
-
-    return EXIT_FAILURE;
-  }
-
+    count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0];
+    std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "<< "OUTPUT = " << it.Get() << " ||| BASELINE = "<< (PixelType) count << std::endl;
+    if( (it.Get().real() != static_cast<RealType>(count)) || (it.Get().imag() != static_cast<RealType>(0)) )
+      {
+      std::cout<<"Image double read as Image complex error : "<<it.Get()<<", waited for ("<<count<<", 0)"<<std::endl;
+      return EXIT_FAILURE;
+      }
       ++it;
     }
 
@@ -84,10 +82,8 @@ int otbImageComplexToImageDouble(int argc, char * argv[])
 {
   typedef double                                RealType;
   typedef otb::Image<RealType, 2>               ScalImageType;
-
   typedef otb::ImageFileReader<ScalImageType>       ReaderType;
 
-
   ReaderType::Pointer reader = ReaderType::New();
   reader->SetFileName(argv[1]);
 
@@ -112,9 +108,8 @@ int otbImageComplexToImageDouble(int argc, char * argv[])
   while( it.IsAtEnd()==false )
     {
       count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);
-   
       double norm = vcl_sqrt(static_cast<double>( (count*count) + (count+1)*(count+1)));
-
+      std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "<< "OUTPUT = " << it.Get() << " ||| BASELINE = "<< static_cast<RealType>(norm) << std::endl;
       if(it.Get() != static_cast<RealType>(norm))
   {
     std::cout<<"Image complex read as Image double error : value (should be norm): "<<it.Get()<<", waited for "<<norm<<"."<<std::endl;
@@ -123,8 +118,7 @@ int otbImageComplexToImageDouble(int argc, char * argv[])
   }
       ++it;
     }
-  
-  
+
   return EXIT_SUCCESS;
 }
 
@@ -152,7 +146,7 @@ int otbImageComplexToImageComplex(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -163,11 +157,15 @@ int otbImageComplexToImageComplex(int argc, char * argv[])
   itk::ImageRegionIteratorWithIndex<CplxImageType> it( reader->GetOutput(), region );
 
   unsigned int count = 0;
+  PixelType  valPxl;
   it.GoToBegin();
   while( it.IsAtEnd()==false )
     {
      count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);
-
+     valPxl.real() = count;valPxl.imag() = count+1;
+     std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\
+         << "OUTPUT = " << it.Get() \
+         << " ||| BASELINE = "<< valPxl << std::endl;
       if( (it.Get().real() != static_cast<RealType>(count)) || ( it.Get().imag() != static_cast<RealType>(count+1) ) ) 
   {
     std::cout<<"Image complex read as Image complex error: "<<it.Get()<<", waited for ("<<count<<", "<<count+1<<")"<<std::endl;
@@ -205,7 +203,7 @@ int otbImageComplexToVectorImageDouble(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -216,10 +214,15 @@ int otbImageComplexToVectorImageDouble(int argc, char * argv[])
   itk::ImageRegionIteratorWithIndex<ScalVectorImageType> it( reader->GetOutput(), region );
 
   unsigned int count = 0;
+  double valPxl[2];
   it.GoToBegin();
   while( it.IsAtEnd()==false )
     {
      count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);
+     valPxl[0] = count;valPxl[1] = count+1;
+     std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\
+             << "OUTPUT = " << it.Get() \
+             << " ||| BASELINE = "<< "["<<valPxl[0] << ", " <<valPxl[1]<< "]"<< std::endl;
 
      if( (it.Get()[0] != static_cast<RealType>(count)) || (it.Get()[1] != static_cast<RealType>(count+1)) )
   {
@@ -258,7 +261,7 @@ int otbImageComplexToVectorImageComplex(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -269,10 +272,15 @@ int otbImageComplexToVectorImageComplex(int argc, char * argv[])
   itk::ImageRegionIteratorWithIndex<CmplxVectorImageType> it( reader->GetOutput(), region );
 
   unsigned int count = 0;
+  PixelType valPxl;
   it.GoToBegin();
   while( it.IsAtEnd()==false )
     {
       count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);
+      valPxl.real() = count; valPxl.imag()=count+1;
+      std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\
+                   << "OUTPUT = " << it.Get() \
+                   << " ||| BASELINE = "<< "["<<valPxl << "]" << std::endl;
 
       if( (it.Get()[0].real() != static_cast<RealType>(count)) || ( it.Get()[0].imag() != static_cast<RealType>(count+1) ) ) 
   {
@@ -310,7 +318,7 @@ int otbVectorImageDoubleToImageComplex(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -321,14 +329,19 @@ int otbVectorImageDoubleToImageComplex(int argc, char * argv[])
   itk::ImageRegionIteratorWithIndex<CmplxImageType> it( reader->GetOutput(), region );
 
   unsigned int count = 0;
+  unsigned int l_Size = reader->GetOutput()->GetLargestPossibleRegion().GetSize()[0]* reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1];
+  PixelType valPxl;
   it.GoToBegin();
   while( it.IsAtEnd()==false )
     {
-      count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);
-  
-      if(it.Get().real() != static_cast<RealType>(count) || (it.Get().imag() != static_cast<RealType>(count+1)) ) 
+      count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0];
+      valPxl.real() = count; valPxl.imag()=l_Size + count;
+      std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\
+                         << "OUTPUT = " << it.Get() \
+                         << " ||| BASELINE = "<< valPxl << std::endl;
+      if(it.Get().real() != static_cast<RealType>(count) || (it.Get().imag() != static_cast<RealType>(l_Size + count )) )
   {
-    std::cout<<"Vector Image double read as Image double error: "<<it.Get()<<", waited for ("<<count<<", "<<count+1<<")"<<std::endl;
+    std::cout<<"Vector Image double read as Image double error: "<<it.Get()<<", waited for ("<<count<<", "<<l_Size + count<<")"<<std::endl;
     
     return EXIT_FAILURE;
   }
@@ -362,7 +375,7 @@ int otbVectorImageDoubleToVectorImageComplex(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -373,17 +386,27 @@ int otbVectorImageDoubleToVectorImageComplex(int argc, char * argv[])
   itk::ImageRegionIteratorWithIndex<CmplxVectorImageType> it( reader->GetOutput(), region );
 
   unsigned int count = 0;
+  unsigned int l_Size = reader->GetOutput()->GetLargestPossibleRegion().GetSize()[0]* reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1];
+
+  PixelType valPxl[2];
   it.GoToBegin();
   while( it.IsAtEnd()==false )
     {
-      count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);;
-
-      if(it.Get()[0].real() != static_cast<RealType>(count) || (it.Get()[0].imag() != static_cast<RealType>(0)) ) 
-  {
-    std::cout<<"Vector Image double read as Vector Image complex error: "<<it.Get()[0]<<", waited for ("<<count<<", 0)."<<std::endl;
-    
-    return EXIT_FAILURE;
-  }
+      //count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);
+      count = (it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);;
+      valPxl[0].real() = count;valPxl[0].imag() = 0;
+      valPxl[1].real() = l_Size + count;valPxl[1].imag() = 0;
+      std::cout << "PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\
+                         << "OUTPUT = " << it.Get() \
+                         << " ||| BASELINE = "<< "[" << valPxl[0] << ", "<< valPxl[1] << "]" << std::endl;
+
+    if ( (it.Get()[0].real() != static_cast<RealType> (count)) || (it.Get()[0].imag() != static_cast<RealType> (0)) \
+        || (it.Get()[1].real() != static_cast<RealType> (l_Size + count)) ||  (it.Get()[1].imag() != static_cast<RealType> (0)) )
+      {
+      std::cout << "Vector Image double read as Vector Image complex error: " << it.Get()[0] << ", waited for ("
+          << count << ", 0)." << std::endl;
+      return EXIT_FAILURE;
+      }
 
       ++it;
     }
@@ -413,7 +436,7 @@ int otbVectorImageComplexToVectorImageDouble(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -428,15 +451,15 @@ int otbVectorImageComplexToVectorImageDouble(int argc, char * argv[])
   while( it.IsAtEnd()==false )
     {
       count = 2*(it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0]);
-      double norm1 = vcl_sqrt(static_cast<double>(count*count + (count+1)*(count+1)));
-      double norm2 = vcl_sqrt(static_cast<double>((2*l_Size+count)*(2*l_Size+count) + (2*l_Size+count+1)*(2*l_Size+count+1)));
- 
-      if( (it.Get()[0] != norm1) || (it.Get()[1] != norm2) ) 
-  {
-    std::cout<<"Vector Image complex read as Vector Image double error: "<<it.Get()<<", waited for ("<<norm1<<", "<<norm2<<")."<<std::endl;
-    
-    return EXIT_FAILURE;
-  }
+      std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> " \
+          << "OUTPUT = " << it.Get() \
+          << " ||| BASELINE = "<< "[" << count <<", " << count +1 << ", " << 2*l_Size+count << ", " << 2*l_Size+count+1 << "]"<< std::endl;
+
+
+      if (it.Get()[0] !=  count || it.Get()[1] !=  count+1 || it.Get()[2] != 2*l_Size+count || it.Get()[3] != 2*l_Size+count+1 )
+        {
+          return EXIT_FAILURE;
+        }
 
       ++it;
     }
@@ -449,7 +472,7 @@ int otbVectorImageComplexToVectorImageDouble(int argc, char * argv[])
 /***********
  * 9.
  * Read VectorImage<complex> as VectorImage<complex>
- * out : out[0]=norm(in[0]), out[0]=norm(in[1]), ...
+ * out : out[0]=in[0], out[1]=in[1], ...
  ***********/
 int otbVectorImageComplexToVectorImageComplex(int argc, char * argv[])
 {
@@ -468,7 +491,7 @@ int otbVectorImageComplexToVectorImageComplex(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -488,9 +511,13 @@ int otbVectorImageComplexToVectorImageComplex(int argc, char * argv[])
       PixelType cmplx1(count, count+1);
       PixelType cmplx2(2*l_Size+count, 2*l_Size+count+1);
 
+      std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> " \
+                << "OUTPUT = " << it.Get() \
+                << " ||| BASELINE = "<< "[" << cmplx1 <<", " << cmplx2 << "]"<< std::endl;
+
       if( (it.Get()[0] != cmplx1) || (it.Get()[1] != cmplx2) ) 
   {
-    std::cout<<"Image double read as Vector Image complex error: "<<std::endl;
+    std::cout<<"Multi Image Complex double read as Vector Image complex error: "<<std::endl;
     std::cout<<it.Get()[0]<<", waited for "<<cmplx1<<"."<<std::endl;
     std::cout<<it.Get()[1]<<", waited for "<<cmplx2<<"."<<std::endl;
 
@@ -527,7 +554,7 @@ int otbImageDoubleToVectorImageComplex(int argc, char * argv[])
 
   id.Fill(0);
   size[0] = 10;
-  size[1] = 1;
+  size[1] = 2;
 
   region.SetSize( size );
   region.SetIndex( id ); 
@@ -545,12 +572,17 @@ int otbImageDoubleToVectorImageComplex(int argc, char * argv[])
   itk::ImageRegionIteratorWithIndex<CmplxVectorImageType> it( reader->GetOutput(), region );
 
   unsigned int count = 0;
+  PixelType valPxl;
   it.GoToBegin();
   while( it.IsAtEnd()==false )
     {
       count = it.GetIndex()[1]*reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1]+it.GetIndex()[0];
+      valPxl.real() = count;valPxl.imag() = 0;
+      std::cout <<"PXL(" <<it.GetIndex()[0]<<","<<it.GetIndex()[1] <<") -> "\
+          << "OUTPUT = " << it.Get() \
+          << " ||| BASELINE = "<< "["<< valPxl << "]"<< std::endl;
 
-      if( (it.Get()[0].real() != static_cast<RealType>(count)) || (it.Get()[0].imag() != 0) ) 
+     if( (it.Get()[0].real() != static_cast<RealType>(count)) || (it.Get()[0].imag() != 0) )
   {
     std::cout<<"Image double read as Vector Image complex error: "<<it.Get()[0]<<", waited for ("<<count<<", 0)."<<std::endl;
     
@@ -572,7 +604,13 @@ int otbImageDoubleToVectorImageComplex(int argc, char * argv[])
  ***********/
 int otbVectorImageComplexToImageDouble(int argc, char * argv[])
 {
-  typedef double                                RealType;
+  // This case is not handled yet. We need more time to decide what we want to do with this case. ( perhaps return exception ???)
+  std::cout << "This case is not handled yet." \
+      << "We need more time to decide what we want to do with this case. ( perhaps return exception ???)" \
+      << std::endl;
+  return EXIT_FAILURE;
+
+  /*typedef double                                RealType;
   typedef std::complex<RealType>                PixelType;
   typedef otb::VectorImage<PixelType, 2>               CmplxVectorImageType;
   typedef otb::ImageFileReader<CmplxVectorImageType>       ReaderType;
@@ -660,6 +698,6 @@ int otbVectorImageComplexToImageDouble(int argc, char * argv[])
   }
   
   
-  return EXIT_SUCCESS;
+  return EXIT_SUCCESS;*/
 }
 
diff --git a/Testing/Code/IO/otbIOTests21.cxx b/Testing/Code/IO/otbIOTests21.cxx
index 6b72864a86a160daf78c84a3a9f06689dc178dce..b4438b8877a248a6c2b163006e5d379be3bf0002 100644
--- a/Testing/Code/IO/otbIOTests21.cxx
+++ b/Testing/Code/IO/otbIOTests21.cxx
@@ -45,4 +45,7 @@ void RegisterTests()
   REGISTER_TEST(otbVectorImageComplexToVectorImageComplex);
   REGISTER_TEST(otbImageDoubleToVectorImageComplex);
   REGISTER_TEST(otbVectorImageComplexToImageDouble);
+  // not deal in this commit
+  //REGISTER_TEST(otbGDALReadPxlComplexDb);
+  //REGISTER_TEST(otbGDALReadPxlComplexFl);
 }
diff --git a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h
index 30cf712f84e8b76a285a54c3ac31680db16a278d..6d1bb7ca1c8b24c6a4c8dc2e9bc62165d7e38553 100644
--- a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h
+++ b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.h
@@ -51,9 +51,13 @@ public:
   static void ConvertVectorImage(InputPixelType* inputData, 
                       int inputNumberOfComponents, 
                       OutputPixelType* outputData , size_t size);
-  static void ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData, 
+  static void ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData,
                       int inputNumberOfComponents, 
                       OutputPixelType* outputData , size_t size);
+  static void ConvertComplexVectorImageToVectorImageComplex(std::complex<InputPixelType>* inputData,
+                        int inputNumberOfComponents,
+                        OutputPixelType* outputData , size_t size);
+
   static void ConvertComplexToGray(std::complex<InputPixelType>* inputData, 
                       int inputNumberOfComponents, 
                       OutputPixelType* outputData , size_t size);
diff --git a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx
index 0f768c670f44ae7ab2a5fd362a76baada864c4ca..baeaa0fa540b6aa1cf366e01af394c687ecc8716 100644
--- a/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx
+++ b/Utilities/ITK/Code/IO/itkConvertPixelBuffer.txx
@@ -739,15 +739,36 @@ template < typename InputPixelType,
            class OutputConvertTraits >
 void
 ConvertPixelBuffer<InputPixelType, OutputPixelType, OutputConvertTraits>
-::ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData, 
+::ConvertComplexVectorImageToVectorImage(std::complex<InputPixelType>* inputData,
                      int inputNumberOfComponents, 
                      OutputPixelType* outputData , size_t size)
+{
+  size_t length = size* (size_t)inputNumberOfComponents;
+  OutputPixelType dummy;
+  for( size_t i=0; i< length/2; i++ )
+    {
+    OutputConvertTraits::SetNthComponent( 0, *outputData, (*inputData).real());
+    ++outputData;
+    OutputConvertTraits::SetNthComponent( 0, *outputData, (*inputData).imag());
+    ++outputData;
+    ++inputData;
+    }
+}
+
+template < typename InputPixelType,
+           typename OutputPixelType,
+           class OutputConvertTraits >
+void
+ConvertPixelBuffer<InputPixelType, OutputPixelType, OutputConvertTraits>
+::ConvertComplexVectorImageToVectorImageComplex(std::complex<InputPixelType>* inputData,
+                     int inputNumberOfComponents,
+                     OutputPixelType* outputData , size_t size)
 {
   size_t length = size* (size_t)inputNumberOfComponents;
   OutputPixelType dummy;
   for( size_t i=0; i< length; i++ )
     {
-    OutputConvertTraits::SetNthComponent( 0, *outputData, 
+    OutputConvertTraits::SetNthComponent( 0, *outputData,
                                           SpecialCast(*inputData, dummy));
     ++outputData;
     ++inputData;
diff --git a/Utilities/ITK/Code/IO/itkImageFileReader.txx b/Utilities/ITK/Code/IO/itkImageFileReader.txx
index 56b92caecc66a2df9f9df0418f9f0b6d3080d434..ec6b8a94e597ec7253a7bb29207a052442b7242a 100644
--- a/Utilities/ITK/Code/IO/itkImageFileReader.txx
+++ b/Utilities/ITK/Code/IO/itkImageFileReader.txx
@@ -482,8 +482,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
   OutputImagePixelType *outputData =
     this->GetOutput()->GetPixelContainer()->GetBufferPointer();
 
-
-  // TODO:
+      // TODO:
   // Pass down the PixelType (RGB, VECTOR, etc.) so that any vector to
   // scalar conversion be type specific. i.e. RGB to scalar would use
   // a formula to convert to luminance, VECTOR to scalar would use
@@ -501,7 +500,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
 
 #define ITK_CONVERT_BUFFER_IF_BLOCK(type)               \
  else if( m_ImageIO->GetComponentTypeInfo() == typeid(type) )   \
-   {                                                   \
+   {   \
    if( strcmp( this->GetOutput()->GetNameOfClass(), "VectorImage" ) == 0 ) \
      { \
      ConvertPixelBuffer<                                 \
@@ -510,10 +509,10 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
       ConvertPixelTraits                                \
       >                                                 \
       ::ConvertVectorImage(                             \
-        static_cast<type*>(inputData),                  \
-        m_ImageIO->GetNumberOfComponents(),             \
-        outputData,                                     \
-        numberOfPixels);              \
+       static_cast<type*>(inputData),                  \
+       m_ImageIO->GetNumberOfComponents(),             \
+       outputData,                                     \
+       numberOfPixels);              \
      } \
    else \
      { \
@@ -531,34 +530,54 @@ ImageFileReader<TOutputImage, ConvertPixelTraits>
     }
 #define ITK_CONVERT_CBUFFER_IF_BLOCK(type)               \
  else if( m_ImageIO->GetComponentTypeInfo() == typeid(type) )   \
-   {                                                   \
+   {  \
    if( strcmp( this->GetOutput()->GetNameOfClass(), "VectorImage" ) == 0 ) \
      { \
-     ConvertPixelBuffer<                                 \
-      type::value_type,        \
-      OutputImagePixelType,                             \
-      ConvertPixelTraits                                \
-      >                                                 \
-      ::ConvertComplexVectorImageToVectorImage(                             \
-        static_cast<type*>(inputData),                \
-        m_ImageIO->GetNumberOfComponents(),             \
-        outputData,                                     \
-        numberOfPixels);              \
+     if( (typeid(OutputImagePixelType) == typeid(std::complex<double>)) \
+         || (typeid(OutputImagePixelType) == typeid(std::complex<float>)) )\
+       {\
+       /*std::cout << "Complex -> OTB::VectorImage Complex" << std::endl;*/ \
+       ConvertPixelBuffer<                                 \
+        type::value_type,        \
+        OutputImagePixelType,                             \
+        ConvertPixelTraits                                \
+        >                                                 \
+        ::ConvertComplexVectorImageToVectorImageComplex(                             \
+         static_cast<type*>(inputData),                \
+         m_ImageIO->GetNumberOfComponents(),             \
+         outputData,                                     \
+         numberOfPixels); \
+       }\
+     else\
+       {\
+       /*std::cout << "Complex -> OTB::VectorImage Double" << std::endl;*/ \
+       ConvertPixelBuffer<                                 \
+        type::value_type,        \
+        OutputImagePixelType,                             \
+        ConvertPixelTraits                                \
+        >                                                  \
+        ::ConvertComplexVectorImageToVectorImage(                             \
+         static_cast<type*>(inputData),                \
+         m_ImageIO->GetNumberOfComponents(),             \
+         outputData,                                     \
+         numberOfPixels);              \
+       }\
      } \
    else \
      { \
+     /*std::cout << "Complex -> OTB::Image" << std::endl;*/ \
      ConvertPixelBuffer<                                 \
       type::value_type,        \
       OutputImagePixelType,                             \
       ConvertPixelTraits                                \
       >                                                 \
       ::ConvertComplexToGray(                                        \
-        static_cast<type*>(inputData),                  \
-        m_ImageIO->GetNumberOfComponents(),             \
-        outputData,                                     \
-        numberOfPixels);              \
-      } \
-    }
+       static_cast<type*>(inputData),                  \
+       m_ImageIO->GetNumberOfComponents(),             \
+       outputData,                                     \
+       numberOfPixels);              \
+     } \
+   }
 
   if(0)
     {