diff --git a/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx b/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
index b8a1455e435432835a0a2bf2dee39266977dcc92..73a2d1ca4bcc37125f9f2b596b8a8ebcbac8dd1f 100644
--- a/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
+++ b/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
@@ -32,6 +32,7 @@ InputImageParameter::InputImageParameter()
   this->SetName("Input Image");
   this->SetKey("in");
   m_FileName="";
+  m_PreviousFileName="";
   this->ClearValue();
 }
 
@@ -110,113 +111,121 @@ template <class TOutputImage>
 TOutputImage *
 InputImageParameter::GetImage()
 {
-  // 2 cases : the user set a filename vs. the user set an image
-  //////////////////////// Filename case:
-  if (!m_FileName.empty())
+  // Used m_PreviousFileName because if not, when the user call twice GetImage,
+  // it without changing the filename, it returns 2 different
+  // image pointers
+  // TODO : how do we deal with 2 GetImage with 2 defferent template???
+  if( m_PreviousFileName!=m_FileName )
     {
-    typedef otb::ImageFileReader<TOutputImage> ReaderType;
-    typename ReaderType::Pointer reader = ReaderType::New();
-    reader->SetFileName(m_FileName);
-    try
-      {
-      reader->UpdateOutputInformation();
-      }
-    catch (itk::ExceptionObject &)
+    //////////////////////// Filename case:
+    // 2 cases : the user set a filename vs. the user set an image
+    if ( !m_FileName.empty() )
       {
-      this->ClearValue();
-      }
-
-    m_Image = reader->GetOutput();
-    m_Reader = reader;
-
-    // Pay attention, don't return m_Image because it is a ImageBase...
-    return reader->GetOutput();
-    }
-  //////////////////////// Image case:
-  else
-    {
-    if (m_Image.IsNull())
-      {
-      itkExceptionMacro("No input image or filename detected...");
-      }
-    else
-      {
-      if (dynamic_cast<Int8ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int8ImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<UInt8ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt8ImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<Int16ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int16ImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<UInt16ImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt16ImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<Int32ImageType*> (m_Image.GetPointer()))
+      m_PreviousFileName = m_FileName;
+      typedef otb::ImageFileReader<TOutputImage> ReaderType;
+      typename ReaderType::Pointer reader = ReaderType::New();
+      reader->SetFileName(m_FileName);
+      try
         {
-        return CastImage<Int32ImageType, TOutputImage> ();
+        reader->UpdateOutputInformation();
         }
-      else if (dynamic_cast<UInt32ImageType*> (m_Image.GetPointer()))
+      catch (itk::ExceptionObject &)
         {
-        return CastImage<UInt32ImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<FloatImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<FloatImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<DoubleImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<DoubleImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<Int8VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int8VectorImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<UInt8VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt8VectorImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<Int16VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int16VectorImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<UInt16VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt16VectorImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<Int32VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<Int32VectorImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<UInt32VectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt32VectorImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<FloatVectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<FloatVectorImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<DoubleVectorImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<DoubleVectorImageType, TOutputImage> ();
+        this->ClearValue();
         }
       
-      else if (dynamic_cast<UInt8RGBAImageType*> (m_Image.GetPointer()))
-        {
-        return CastImage<UInt8RGBAImageType, TOutputImage> ();
-        }
-      else if (dynamic_cast<UInt8RGBImageType*> (m_Image.GetPointer()))
+      m_Image = reader->GetOutput();
+      m_Reader = reader;
+      
+      // Pay attention, don't return m_Image because it is a ImageBase...
+      return reader->GetOutput();
+      }
+    //////////////////////// Image case:
+    else
+      {
+      if (m_Image.IsNull())
         {
-        return CastImage<UInt8RGBImageType, TOutputImage> ();
+        itkExceptionMacro("No input image or filename detected...");
         }
       else
         {
-        itkExceptionMacro("Unknown image type");
+        if (dynamic_cast<Int8ImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<Int8ImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<UInt8ImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt8ImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<Int16ImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<Int16ImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<UInt16ImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt16ImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<Int32ImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<Int32ImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<UInt32ImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt32ImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<FloatImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<FloatImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<DoubleImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<DoubleImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<Int8VectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<Int8VectorImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<UInt8VectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt8VectorImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<Int16VectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<Int16VectorImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<UInt16VectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt16VectorImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<Int32VectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<Int32VectorImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<UInt32VectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt32VectorImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<FloatVectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<FloatVectorImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<DoubleVectorImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<DoubleVectorImageType, TOutputImage> ();
+          }
+      
+        else if (dynamic_cast<UInt8RGBAImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt8RGBAImageType, TOutputImage> ();
+          }
+        else if (dynamic_cast<UInt8RGBImageType*> (m_Image.GetPointer()))
+          {
+          return CastImage<UInt8RGBImageType, TOutputImage> ();
+          }
+        else
+          {
+          itkExceptionMacro("Unknown image type");
+          }
         }
       }
     }
@@ -350,6 +359,7 @@ InputImageParameter::ClearValue()
  m_Reader = NULL;
  m_Caster = NULL;
  m_FileName = "";
+ m_PreviousFileName="";
 }
 
 
diff --git a/Code/ApplicationEngine/otbWrapperInputImageParameter.h b/Code/ApplicationEngine/otbWrapperInputImageParameter.h
index 4430c41e4c5af242eb9db722d26cb3f0df7fd50c..647796bd4575af6f38c873fe4f680fcaa2052d2f 100644
--- a/Code/ApplicationEngine/otbWrapperInputImageParameter.h
+++ b/Code/ApplicationEngine/otbWrapperInputImageParameter.h
@@ -124,7 +124,6 @@ protected:
   ImageBaseType::Pointer m_Image;
   std::string m_FileName;
 
-
   /** Readers typedefs */
 
   typedef otb::ImageFileReader<Int8ImageType> Int8ReaderType;
@@ -148,34 +147,7 @@ protected:
 
   typedef otb::ImageFileReader<UInt8RGBImageType>  UInt8RGBReaderType;
   typedef otb::ImageFileReader<UInt8RGBAImageType> UInt8RGBAReaderType;
-/*
-  Int8ReaderType::Pointer   m_Int8Reader;
-  UInt8ReaderType::Pointer  m_UInt8Reader;
-  Int16ReaderType::Pointer  m_Int16Reader;
-  UInt16ReaderType::Pointer m_UInt16Reader;
-  Int32ReaderType::Pointer  m_Int32Reader;
-  UInt32ReaderType::Pointer m_UInt32Reader;
-  FloatReaderType::Pointer  m_FloatReader;
-  DoubleReaderType::Pointer m_DoubleReader;
-
-  VectorInt8ReaderType::Pointer   m_VectorInt8Reader;
-  VectorUInt8ReaderType::Pointer  m_VectorUInt8Reader;
-  VectorInt16ReaderType::Pointer  m_VectorInt16Reader;
-  VectorUInt16ReaderType::Pointer m_VectorUInt16Reader;
-  VectorInt32ReaderType::Pointer  m_VectorInt32Reader;
-  VectorUInt32ReaderType::Pointer m_VectorUInt32Reader;
-  VectorFloatReaderType::Pointer  m_VectorFloatReader;
-  VectorDoubleReaderType::Pointer m_VectorDoubleReader;
-
-  RGBAInt8ReaderType::Pointer   m_RGBAInt8Reader;
-  RGBAUInt8ReaderType::Pointer  m_RGBAUInt8Reader;
-  RGBAInt16ReaderType::Pointer  m_RGBAInt16Reader;
-  RGBAUInt16ReaderType::Pointer m_RGBAUInt16Reader;
-  RGBAInt32ReaderType::Pointer  m_RGBAInt32Reader;
-  RGBAUInt32ReaderType::Pointer m_RGBAUInt32Reader;
-  RGBAFloatReaderType::Pointer  m_RGBAFloatReader;
-  RGBADoubleReaderType::Pointer m_RGBADoubleReader;
-*/
+
   itk::ProcessObject::Pointer m_Reader;
   itk::ProcessObject::Pointer m_Caster;
 
@@ -183,6 +155,9 @@ private:
   InputImageParameter(const Parameter &); //purposely not implemented
   void operator =(const Parameter&); //purposely not implemented
 
+  /** Store the loaded image filename */
+  std::string m_PreviousFileName;
+
 }; // End class InputImage Parameter
 
 } // End namespace Wrapper