diff --git a/ViewerManager/Controller/otbImageViewerManagerController.cxx b/ViewerManager/Controller/otbImageViewerManagerController.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c18b8dad4e317fbe261c2fadc590a7bda6dd6dba
--- /dev/null
+++ b/ViewerManager/Controller/otbImageViewerManagerController.cxx
@@ -0,0 +1,133 @@
+
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "otbImageViewerManagerController.h"
+#include "otbMsgReporter.h"
+
+namespace otb
+{
+
+ImageViewerManagerController
+::ImageViewerManagerController()
+{
+
+/** NewVisu */
+  // Build a "visu"controller
+  m_VisuController = VisuControllerType::New();
+  m_PreviewVisuController = VisuControllerType::New();
+}
+
+ImageViewerManagerController
+::~ImageViewerManagerController()
+{}
+
+
+
+void
+ImageViewerManagerController
+::OpenInputImage(const char * filename)
+{
+  try
+  {
+    std::string strFilename = filename;
+    m_Model->OpenImage( strFilename );
+  }
+  catch (itk::ExceptionObject & err)
+  {
+    MsgReporter::GetInstance()->SendError(err.GetDescription());
+  }
+}
+
+/**
+*
+*/
+void
+ImageViewerManagerController
+::CloseImage(unsigned int selectedItem)
+{
+  try
+  {
+    std::cout << "CONTROLLER : CloseImage()" << std::endl;
+    m_Model->CloseImage( selectedItem );
+  }
+  catch (itk::ExceptionObject & err)
+  {
+    MsgReporter::GetInstance()->SendError(err.GetDescription());
+  }
+}
+
+void
+ImageViewerManagerController
+::UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem)
+{
+  try
+    {
+      
+    m_Model->UpdateRGBChannelOrder(redChoice,greenChoice,BlueChoice, selectedItem);
+  }
+  catch (itk::ExceptionObject & err)
+  {
+    MsgReporter::GetInstance()->SendError(err.GetDescription());
+  }
+}
+
+void
+ImageViewerManagerController
+::UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem)
+{
+  try
+    {
+      
+    m_Model->UpdateGrayScaleChannelOrder(choice, selectedItem);
+  }
+  catch (itk::ExceptionObject & err)
+  {
+    MsgReporter::GetInstance()->SendError(err.GetDescription());
+  }
+}
+
+void
+ImageViewerManagerController
+::UpdateModulusChannelOrder(int realChoice, int imChoice, unsigned int selectedItem)
+{
+  try
+    {
+      m_Model->UpdateModulusChannelOrder(realChoice,imChoice, selectedItem);
+    }
+  catch (itk::ExceptionObject & err)
+    {
+      MsgReporter::GetInstance()->SendError(err.GetDescription());
+    }
+}
+
+void
+ImageViewerManagerController
+::UpdatePhaseChannelOrder(int realChoice, int imChoice, unsigned int selectedItem)
+{
+  try
+    {
+      m_Model->UpdatePhaseChannelOrder(realChoice,imChoice, selectedItem);
+    }
+  catch (itk::ExceptionObject & err)
+    {
+      MsgReporter::GetInstance()->SendError(err.GetDescription());
+    }
+}
+
+} // end namespace otb
+
diff --git a/ViewerManager/Controller/otbImageViewerManagerController.h b/ViewerManager/Controller/otbImageViewerManagerController.h
new file mode 100644
index 0000000000000000000000000000000000000000..9a8c08d767f654abdac14f66c3e88e8dcabb1b06
--- /dev/null
+++ b/ViewerManager/Controller/otbImageViewerManagerController.h
@@ -0,0 +1,154 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbImageViewerManagerController_h
+#define __otbImageViewerManagerController_h
+
+#include "otbImageViewerManagerControllerInterface.h"
+#include "otbImageViewerManagerViewGUI.h"
+
+/** NewVisu */
+// #include "otbImageWidgetController.h"
+#include "otbWidgetResizingActionHandler.h"
+
+#include "otbAutoScaleActionHandler.h"
+
+
+
+#include "otbObjectList.h"
+
+namespace otb
+{
+class ITK_EXPORT ImageViewerManagerController
+      : public ImageViewerManagerControllerInterface
+{
+public:
+  /** Standard class typedefs */
+  typedef ImageViewerManagerController                   Self;
+  typedef ImageViewerManagerControllerInterface          Superclass;
+  typedef itk::SmartPointer<Self>                        Pointer;
+  typedef itk::SmartPointer<const Self>                  ConstPointer;
+
+  typedef ImageViewerManagerViewGUI                      ViewType;
+  typedef ViewType::Pointer                              ViewPointerType;
+  typedef ViewType::VisuViewType                         VisuViewType;
+  typedef ViewType::VisuViewPointerType                  VisuViewPointerType;
+  typedef ViewType::ImageWidgetPointerType               VisuWidgetPointerType;
+  
+  typedef Superclass::ImageType                          InputImageType;
+  typedef Superclass::ImagePointerType                   InputImagePointerType;
+
+  /** NewVisu */
+  typedef ModelType::VisuModelType                                      VisuModelType;        //RenderingImageLayer
+  typedef ModelType::VisuModelPointerType                               VisuModelPointerType; //RenderingImageLayer
+  
+  typedef ObjectList<VisuControllerType>                                VisuControllerListType;
+  
+  typedef WidgetResizingActionHandler<VisuModelType,VisuViewType>       ResizingHandlerType;
+  typedef ResizingHandlerType::Pointer                                  ResizingHandlerPointerType;
+
+  typedef ChangeExtractRegionActionHandler<VisuModelType,VisuViewType>  ChangeExtractRegionHandlerType;
+  typedef ChangeExtractRegionHandlerType::Pointer                       ChangeExtractRegionHandlerPointerType;
+  
+  typedef AutoScaleActionHandler<ViewType::ImageWidgetType>             AutoScaleHandlerType;
+  typedef AutoScaleHandlerType::Pointer                                 AutoScaleHandlerPointerType;
+  
+  /** Standard type macros */
+  itkTypeMacro(ImageViewerManagerController,Superclass);
+  itkNewMacro(Self);
+
+  /** NewVisu */
+  VisuControllerPointerType GetVisuController()
+  {
+    return m_VisuController;
+  }
+   VisuControllerPointerType GetPreviewVisuController()
+  {
+    return m_PreviewVisuController;
+  }
+  
+  void SetView(ViewPointerType pView)
+  {
+    m_View = pView;
+    
+    m_AutoScaleHandler = AutoScaleHandlerType::New();
+    m_AutoScaleHandler->SetPreviewWidget(m_View->GetPreviewWidget());
+    m_PreviewVisuController->AddActionHandler(m_AutoScaleHandler);
+  }
+
+  
+   
+/*   VisuControllerListPointerType GetVisuControllerList() */
+/*   { */
+/*     return m_VisuControllerList; */
+/*   } */
+  
+  
+  //virtual void AddController(VisuModelPointerType  modelRenderingLayer  ,VisuViewPointerType visuView);
+
+  virtual void OpenInputImage(const char * filename);
+  virtual void CloseImage(unsigned int selectedItem);
+  virtual void UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem);
+  virtual void UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem );
+  virtual void UpdateModulusChannelOrder(int realChoice , int imChoice ,unsigned int selectedItem );
+  virtual void UpdatePhaseChannelOrder(int realChoice , int imChoice, unsigned int selectedItem);
+  
+
+  
+  
+/*   virtual void SaveOutput(); */
+/*   virtual void ResetModel(); */
+/*   virtual void ClearFeatures(); */
+/*   virtual void CreateFeature(FeatureType featureType); */
+/*   virtual void ClearSelectedChannels(); */
+/*   virtual void SetOutputFileName( const char * name ); */
+/*   virtual void AddInputChannels(std::vector<unsigned int> list); */
+/*   virtual void ChangeFilterStatus(int id); */
+/*   virtual void ViewedRegionChanged(); */
+/*   virtual void PixelClicked(const IndexType & index); */
+/*   virtual void AddToOutputListOrder(int id); */
+/*   virtual void RemoveFromOutputListOrder(int id); */
+
+
+protected:
+  /** Constructor */
+  ImageViewerManagerController();
+  /** Destructor */
+  virtual ~ImageViewerManagerController();
+
+private:
+  ImageViewerManagerController(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  /** Pointer to the view */
+  ViewPointerType m_View;
+
+/** NewVisu */
+  VisuControllerPointerType m_VisuController;
+  VisuControllerPointerType m_PreviewVisuController;
+
+  AutoScaleHandlerPointerType   m_AutoScaleHandler;
+
+  VisuControllerListPointerType   m_VisuControllerList;
+  
+  /** Model of the application*/
+      
+};
+} //end namespace otb
+
+#endif
+
diff --git a/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h b/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..9e31bba096be58518b856dfcc21d890ba7798e22
--- /dev/null
+++ b/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
@@ -0,0 +1,101 @@
+
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbImageViewerManagerControllerInterface_h
+#define __otbImageViewerManagerControllerInterface_h
+
+#include "otbImageViewerFullResolutionEventsInterface.h"
+#include "otbImageViewerManagerModel.h"
+
+
+
+/** NewVisu */
+#include "otbImageWidgetController.h"
+#include "otbImageWidget.h"
+
+#include "otbObjectList.h"
+
+namespace otb
+{
+class ITK_EXPORT  ImageViewerManagerControllerInterface
+      : public ImageViewerFullResolutionEventsInterface
+{
+public:
+  /** Standard class typedefs */
+  typedef ImageViewerManagerControllerInterface     Self;
+  typedef ImageViewerFullResolutionEventsInterface  Superclass;
+  typedef itk::SmartPointer<Self>                   Pointer;
+  typedef itk::SmartPointer<const Self>             ConstPointer;
+  
+
+  typedef ImageViewerManagerModel                   ModelType;
+  typedef ModelType::VisuModelType                  VisuModelType;        //RenderingImageLayer
+  typedef ModelType::VisuModelPointerType           VisuModelPointerType;
+  typedef ModelType::ImageType                      ImageType;
+  typedef ModelType::ImagePointerType               ImagePointerType;
+
+
+/** NewVisu */
+  typedef ImageWidgetController                     VisuControllerType;
+  typedef VisuControllerType::Pointer               VisuControllerPointerType;
+  
+  typedef ObjectList<VisuControllerType>            VisuControllerListType;
+  typedef VisuControllerListType::Pointer           VisuControllerListPointerType;
+  
+  typedef ImageWidgetController                     WidgetControllerType;
+  typedef WidgetControllerType::Pointer             WidgetControllerPointerType;
+  
+  typedef ImageWidget<>                             WidgetType;
+  typedef WidgetType::Pointer                       VisuWidgetPointerType;
+
+  /** Standard type macros */
+  itkTypeMacro(ImageViewerManagerControllerInterface,Superclass);
+
+  /** Users actions */
+  virtual void OpenInputImage(const char * filename) =0;
+  virtual void CloseImage(unsigned int selectedItem) = 0;
+  virtual void UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem) = 0;
+  virtual void UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem) = 0; 
+  virtual void UpdateModulusChannelOrder(int realChoice , int imChoice,unsigned int selectedItem) = 0; 
+  virtual void UpdatePhaseChannelOrder(int realChoice , int imChoice, unsigned int selectedItem) = 0; 
+
+  /** NewVisu */
+  virtual VisuControllerPointerType GetVisuController()=0;
+  virtual VisuControllerPointerType GetPreviewVisuController() = 0;
+
+  
+
+protected:
+  /** Constructor */
+  ImageViewerManagerControllerInterface()
+  {
+    m_Model = ModelType::GetInstance();
+  }
+  /** Destructor */
+  ~ImageViewerManagerControllerInterface() {};
+
+  /** The instance of the model (for commodity) */
+  ModelType * m_Model;
+
+private:
+  ImageViewerManagerControllerInterface(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+};
+} // end namespace otb
+
+#endif
diff --git a/ViewerManager/Model/otbImageViewerManagerModel.cxx b/ViewerManager/Model/otbImageViewerManagerModel.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..61fcf621f69aa27dac8bdbda5e6cfe71bb48dff2
--- /dev/null
+++ b/ViewerManager/Model/otbImageViewerManagerModel.cxx
@@ -0,0 +1,262 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "otbImageViewerManagerModel.h"
+#include "otbFltkFilterWatcher.h"
+#include <FL/fl_ask.H>
+#include "itkExceptionObject.h"
+#include "otbMacro.h"
+
+#include "otbImageFileWriter.h"
+
+
+namespace otb
+{
+
+/** Initialize the singleton */
+ImageViewerManagerModel::Pointer ImageViewerManagerModel::Instance = NULL;
+
+ImageViewerManagerModel::ImageViewerManagerModel()
+{
+  /* Generate image layers*/
+  m_VisuGenerator = LayerGeneratorType::New();
+
+  m_PixelModel = PixelDescriptionModelType::New();
+  
+  //Set all the boolean to false
+  m_HasChangedChannelOrder = false;
+  m_HasImageOpened = false;
+  
+}
+
+ImageViewerManagerModel
+::~ImageViewerManagerModel(){}
+
+
+
+/** Manage the singleton */
+ImageViewerManagerModel::Pointer
+ImageViewerManagerModel::GetInstance()
+{
+  if (!Instance)
+  {
+    Instance = ImageViewerManagerModel::New();
+  }
+  return Instance;
+}
+
+void
+ImageViewerManagerModel
+::Notify(ImageViewerManagerEventsListener * listener)
+{
+  listener->ImageViewerManagerNotify();
+}
+
+void
+ImageViewerManagerModel
+::OpenImage(std::string filename)
+{
+  /** Reader*/
+  ReaderPointerType  reader = ReaderType::New();
+  reader->SetFileName(filename);
+  reader->GenerateOutputInformation();
+      
+  /** Generate the layer*/
+  m_VisuGenerator->SetImage(reader->GetOutput());
+  m_VisuGenerator->GenerateLayer();
+  StandardRenderingFunctionType::Pointer  rendrerFuntion  = m_VisuGenerator->GetDefaultRenderingFunction();
+  
+  
+  /** Rendering image*/
+  VisuModelPointerType rendering = VisuModelType::New();
+  rendering->AddLayer(m_VisuGenerator->GetLayer());
+  rendering->Update();
+
+  /** View*/
+  VisuViewPointerType visuView = this->BuiltVisu(rendering);
+  
+  /** Controller*/
+  WidgetControllerPointerType controller = this->BuiltController(rendering, visuView);
+
+  /** Finish Cuilting the visu*/
+  visuView->SetController(controller);
+
+  /** Store all the information in the structure*/
+  ObjectsTracked currentComponent;
+
+  currentComponent.fileName   = filename;
+  currentComponent.pLayer     = m_VisuGenerator->GetLayer();
+  currentComponent.pReader    = reader;
+  currentComponent.pRendering = rendering;
+  currentComponent.pVisuView  = visuView;
+  currentComponent.pWidgetController = controller;
+  currentComponent.pRenderFuntion  = rendrerFuntion;
+
+  /** Add the the struct in the list*/
+  m_ObjectTrackedList.push_back(currentComponent);
+  std::cout << "Size of the component Struct is " << m_ObjectTrackedList.size() << std::endl;
+  
+  m_HasImageOpened = true;
+  this->NotifyAll();
+  m_HasImageOpened = false;
+  
+}
+/**
+ * Built a part of the visu, create a pointer and add a model to the visu
+ */
+ImageViewerManagerModel
+::VisuViewPointerType
+ImageViewerManagerModel
+::BuiltVisu(VisuModelPointerType pRendering)
+{
+  VisuViewPointerType visuView = VisuViewType::New();
+  visuView->SetModel(pRendering);
+  
+  return visuView;
+}
+
+/**
+ * Add Controller
+ */
+ImageViewerManagerModel
+::WidgetControllerPointerType
+ImageViewerManagerModel
+::BuiltController(VisuModelPointerType modelRenderingLayer, VisuViewPointerType visuView)
+{
+  WidgetControllerPointerType controller = WidgetControllerType::New();
+  
+  // Add the resizing handler
+  ResizingHandlerType::Pointer resizingHandler = ResizingHandlerType::New();
+  resizingHandler->SetModel(modelRenderingLayer);
+  resizingHandler->SetView(visuView);
+  controller->AddActionHandler(resizingHandler);
+  
+    // Add the change scaled region handler
+  ChangeScaledRegionHandlerType::Pointer changeScaledHandler =ChangeScaledRegionHandlerType::New();
+  changeScaledHandler->SetModel(modelRenderingLayer);
+  changeScaledHandler->SetView(visuView);
+  controller->AddActionHandler(changeScaledHandler);
+
+  // Add the change extract region handler
+  ChangeRegionHandlerType::Pointer changeHandler =ChangeRegionHandlerType::New();
+  changeHandler->SetModel(modelRenderingLayer);
+  changeHandler->SetView(visuView);
+  controller->AddActionHandler(changeHandler);
+
+  // Add the change scaled handler
+  ChangeScaleHandlerType::Pointer changeScaleHandler =ChangeScaleHandlerType::New();
+  changeScaleHandler->SetModel(modelRenderingLayer );
+  changeScaleHandler->SetView(visuView);
+  controller->AddActionHandler(changeScaleHandler);
+
+  //Pixel Description Handling
+  m_PixelModel->SetLayers(modelRenderingLayer->GetLayers());
+  PixelDescriptionActionHandlerType::Pointer pixelActionHandler = PixelDescriptionActionHandlerType::New();
+  pixelActionHandler->SetView(visuView);
+  pixelActionHandler->SetModel(m_PixelModel);
+  controller->AddActionHandler(pixelActionHandler);
+  
+
+  return controller;
+}
+
+void
+ImageViewerManagerModel
+::CloseImage(unsigned int selectedItem)
+{
+  m_ObjectTrackedList.erase(m_ObjectTrackedList.begin()+selectedItem-1);
+}
+
+void
+ImageViewerManagerModel
+::UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem)
+{
+  StandardRenderingFunctionType::Pointer renderFunction = m_ObjectTrackedList.at(selectedItem-1).pRenderFuntion;
+  renderFunction->SetRedChannelIndex(redChoice);
+  renderFunction->SetGreenChannelIndex(greenChoice);
+  renderFunction->SetBlueChannelIndex(BlueChoice);
+  
+  //Update the layer
+  m_ObjectTrackedList.at(selectedItem-1).pLayer->SetRenderingFunction(renderFunction);
+  m_ObjectTrackedList.at(selectedItem-1).pRendering->Update();
+  
+  //Notify
+  m_HasChangedChannelOrder = true;
+  this->NotifyAll();
+  m_HasChangedChannelOrder = false;
+}
+
+void
+ImageViewerManagerModel
+::UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem)
+{
+  StandardRenderingFunctionType::Pointer renderFunction = m_ObjectTrackedList.at(selectedItem-1).pRenderFuntion;
+  renderFunction->SetAllChannels(choice);
+  
+  //Update the layer
+  m_ObjectTrackedList.at(selectedItem-1).pLayer->SetRenderingFunction(renderFunction);
+  m_ObjectTrackedList.at(selectedItem-1).pRendering->Update();
+  
+  //Notify
+  m_HasChangedChannelOrder = true;
+  this->NotifyAll();
+  m_HasChangedChannelOrder = false;
+}
+
+void
+ImageViewerManagerModel
+::UpdateModulusChannelOrder(int realChoice , int imChoice, unsigned int selectedItem )
+{
+  ModulusRenderingFunction::Pointer modulusFunction = ModulusRenderingFunction::New();
+  modulusFunction->SetRedChannelIndex(realChoice);
+  modulusFunction->SetGreenChannelIndex(imChoice);
+  modulusFunction->Initialize();
+  
+  //Update the layer
+  m_ObjectTrackedList.at(selectedItem-1).pLayer->SetRenderingFunction(modulusFunction);
+  m_ObjectTrackedList.at(selectedItem-1).pRendering->Update();
+  
+  //Notify
+  m_HasChangedChannelOrder = true;
+  this->NotifyAll();
+  m_HasChangedChannelOrder = false;
+}
+
+
+void
+ImageViewerManagerModel
+::UpdatePhaseChannelOrder(int realChoice , int imChoice, unsigned int selectedItem )
+{
+  PhaseRenderingFunction::Pointer phaseFunction = PhaseRenderingFunction::New();
+  phaseFunction->SetRedChannelIndex(realChoice);
+  phaseFunction->SetGreenChannelIndex(imChoice);
+  phaseFunction->Initialize();
+  
+  //Update the layer
+  m_ObjectTrackedList.at(selectedItem-1).pLayer->SetRenderingFunction(phaseFunction);
+  m_ObjectTrackedList.at(selectedItem-1).pRendering->Update();
+  
+  //Notify
+  m_HasChangedChannelOrder = true;
+  this->NotifyAll();
+  m_HasChangedChannelOrder = false;
+}
+
+
+}
+
+
diff --git a/ViewerManager/Model/otbImageViewerManagerModel.h b/ViewerManager/Model/otbImageViewerManagerModel.h
new file mode 100644
index 0000000000000000000000000000000000000000..b2ede91a28f152f555ab2054f7fde01c30985edf
--- /dev/null
+++ b/ViewerManager/Model/otbImageViewerManagerModel.h
@@ -0,0 +1,207 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbImageViewerManagerModel_h
+#define __otbImageViewerManagerModel_h
+
+#include "otbMVCModel.h"
+#include "otbImageViewerManagerEventsListener.h"
+#include "otbImage.h"
+#include "otbVectorImage.h"
+#include "itkRGBPixel.h"
+#include "otbImageFileReader.h"
+#include "otbObjectList.h"
+
+/** NewVisu */
+#include "otbImageLayer.h"
+#include "otbImageLayerGenerator.h"
+#include "otbImageLayerRenderingModel.h"
+
+#include "otbWidgetResizingActionHandler.h"
+#include "otbChangeScaledExtractRegionActionHandler.h"
+#include "otbChangeExtractRegionActionHandler.h"
+#include "otbChangeScaleActionHandler.h"
+
+#include "otbModulusRenderingFunction.h"
+#include "otbPhaseRenderingFunction.h"
+
+#include "otbPixelDescriptionModel.h"
+#include "otbPixelDescriptionActionHandler.h"
+
+
+#include "otbImageView.h" 
+#include "otbImageWidgetController.h"
+
+namespace otb
+{
+/** \class ImageViewerManagerModel
+ *
+ *
+ *
+ */
+
+class ITK_EXPORT ImageViewerManagerModel
+      : public MVCModel<ImageViewerManagerEventsListener>
+{
+
+public:
+  /** Standard class typedefs */
+  typedef ImageViewerManagerModel                         Self;
+  typedef MVCModel<ImageViewerManagerEventsListener>      Superclass;
+  typedef itk::SmartPointer<Self>                         Pointer;
+  typedef itk::SmartPointer<const Self>                   ConstPointer;
+
+  /** Standard type macro */
+  itkTypeMacro(ImageViewerManagerModel, MVCModel);
+
+  /** Images typedefs */
+  typedef double                                                          PixelType;
+  
+  /**  Image Type*/
+  typedef VectorImage<PixelType , 2>                                      ImageType;
+  typedef itk::RGBPixel<unsigned char>                                    RGBPixelType; 
+  typedef Image<RGBPixelType,2>                                           ViewerImageType;
+  typedef ImageType::Pointer                                              ImagePointerType;
+
+  /** typedef support for layers */
+  typedef otb::ImageLayer<ImageType>                                      LayerType;
+  typedef LayerType::Pointer                                              LayerPointerType;   
+  
+  typedef otb::ImageLayerGenerator<LayerType>                             LayerGeneratorType;
+  typedef LayerGeneratorType::Pointer                                     LayerGeneratorPointerType;
+  typedef LayerGeneratorType::RenderingFunctionType                       StandardRenderingFunctionType;
+
+  typedef Function::ModulusRenderingFunction<ImageType::InternalPixelType, RGBPixelType>    ModulusRenderingFunction;
+  typedef Function::PhaseRenderingFunction<ImageType::InternalPixelType, RGBPixelType>      PhaseRenderingFunction;
+  
+  /** typedef support for reader*/
+  typedef ImageFileReader<ImageType>                                      ReaderType;
+  typedef ReaderType::Pointer                                             ReaderPointerType;
+    
+  /** Typedef support for rendering image*/
+  typedef otb::ImageLayerRenderingModel<ViewerImageType>                              VisuModelType;
+  typedef VisuModelType::Pointer                                                      VisuModelPointerType;
+  
+  /** NewVisu */
+  typedef ImageView<VisuModelType>                                                    VisuViewType;
+  typedef VisuViewType::Pointer                                                       VisuViewPointerType;
+  
+  typedef ImageWidgetController                                                       WidgetControllerType;
+  typedef WidgetControllerType::Pointer                                               WidgetControllerPointerType;
+  
+  typedef WidgetResizingActionHandler<VisuModelType,VisuViewType>                     ResizingHandlerType;
+  typedef ResizingHandlerType::Pointer                                                ResizingHandlerPointerType;
+  typedef otb::ChangeScaledExtractRegionActionHandler<VisuModelType,VisuViewType>     ChangeScaledRegionHandlerType;
+  typedef otb::ChangeExtractRegionActionHandler<VisuModelType,VisuViewType>           ChangeRegionHandlerType;
+  typedef otb::ChangeScaleActionHandler<VisuModelType,VisuViewType>                   ChangeScaleHandlerType;
+  
+  typedef otb::PixelDescriptionModel<ViewerImageType>                                 PixelDescriptionModelType;
+  typedef otb::PixelDescriptionActionHandler<PixelDescriptionModelType,VisuViewType> PixelDescriptionActionHandlerType;
+
+  
+  /** 
+   * Struct embedded in the model
+   */
+  struct _ObjectsTracked
+  {
+    ReaderPointerType                      pReader;
+    LayerPointerType                       pLayer;
+    VisuModelPointerType                   pRendering;
+    WidgetControllerPointerType            pWidgetController;
+    VisuViewPointerType                    pVisuView;
+    StandardRenderingFunctionType::Pointer pRenderFuntion;
+    std::string                            fileName;
+    
+  };
+  
+  typedef struct _ObjectsTracked                                          ObjectsTracked;
+
+  /** 
+   * List of objectTracked, we cannot use ObjectList 
+   * for struct cause don't implenement Register method
+   */
+  typedef std::vector<ObjectsTracked>                                    ObjectTrackedList;
+
+  /** Get the unique instanc1e of the model */
+  static Pointer GetInstance();
+
+  virtual void OpenImage(std::string strfilename);
+  virtual void CloseImage(unsigned int selectedItem);
+  virtual void UpdateRGBChannelOrder(int redChoice , int greenChoice, int BlueChoice, unsigned int selectedItem);
+  virtual void UpdateGrayScaleChannelOrder(int choice, unsigned int selectedItem);
+  virtual void UpdateModulusChannelOrder(int realChoice , int imChoice,unsigned int selectedItem );
+  virtual void UpdatePhaseChannelOrder(int realChoice , int imChoice,unsigned int selectedItem );
+  
+  /** Method needed to Get the list of componenets stored*/
+   ObjectTrackedList GetObjectList()
+    {
+      return m_ObjectTrackedList;
+    }
+
+   /** Get the pixel description model */
+   itkGetObjectMacro(PixelModel,PixelDescriptionModelType);
+   
+   /** Boolean Flags */
+   itkGetMacro(HasImageOpened,bool);
+   itkGetMacro(HasChangedChannelOrder,bool);
+   
+
+protected:
+  /** This is protected for the singleton. Use GetInstance() instead. */
+  itkNewMacro(Self);
+
+  /** Constructor */
+  ImageViewerManagerModel();
+  
+  /** Destructor */
+  virtual ~ImageViewerManagerModel();
+
+  /** Built Visu & Controller*/
+  virtual VisuViewPointerType BuiltVisu(VisuModelPointerType pRendering);
+  virtual WidgetControllerPointerType BuiltController(VisuModelPointerType modelRenderingLayer, VisuViewPointerType visuView);
+  
+    
+private:
+  ImageViewerManagerModel(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+  /** Notify a given listener of changes */
+  virtual void Notify(ImageViewerManagerEventsListener * listener);
+  
+  /** The instance singleton */
+  static Pointer Instance;
+
+  /**Temporary Flags*/
+  PixelDescriptionModelType::Pointer         m_PixelModel;
+  
+  
+  /** Boolean flags*/
+  bool   m_HasImageOpened;
+  bool   m_HasChangedChannelOrder;
+
+  /* Layer Generator Smart Pointer*/
+  LayerGeneratorPointerType                  m_VisuGenerator;
+
+  /** The manipuleted list*/
+  ObjectTrackedList                          m_ObjectTrackedList;
+};
+
+
+
+}
+#endif
+
diff --git a/ViewerManager/View/otbImageViewerManagerViewGUI.cxx b/ViewerManager/View/otbImageViewerManagerViewGUI.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..11796b49af7153f6fc7904a910720ff118c01f18
--- /dev/null
+++ b/ViewerManager/View/otbImageViewerManagerViewGUI.cxx
@@ -0,0 +1,767 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULA
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include <FL/Fl_Text_Buffer.H>
+#include "otbImageViewerManagerViewGUI.h"
+#include "otbMacro.h"
+#include "otbFileName.h"
+
+#include "base/ossimFilename.h"
+#include "base/ossimDirectory.h"
+
+namespace otb
+{
+/**
+ * Constructor
+ */
+
+ImageViewerManagerViewGUI
+::ImageViewerManagerViewGUI():m_TemplateViewerName(""),m_DisplayedLabel("+ "),
+			      m_UndisplayedLabel("- ")
+{
+
+  //
+  m_VisuViewShowedList =  VisuViewShowedList::New();
+  m_VisuView           =  VisuViewType::New();
+  m_PreviewWidget      =  ImageWidgetType::New();
+  m_pRenderingFuntion  = StandardRenderingFunctionType::New();
+  m_PixelView          =  PixelDescriptionViewType::New();
+  m_CurveWidget        =  CurvesWidgetType::New();
+
+  //Get an instance of the model
+  m_ImageViewerManagerModel = ImageViewerManagerModel::GetInstance();
+  m_ImageViewerManagerModel->RegisterListener(this);
+
+  //Create the component of the GUI
+  this->CreateGUI();
+  
+  //Create buffer for the guiViewerInformation
+  Fl_Text_Buffer * buffer = new Fl_Text_Buffer();
+  this->guiViewerInformation->buffer(buffer);
+  
+  //init the previewWindow
+  m_PreviewWidget->label("PreviewWidget");
+  gPreviewWindow->add(m_PreviewWidget);
+  gPreviewWindow->box(FL_NO_BOX);
+  gPreviewWindow->resizable(gPreviewWindow);
+  m_PreviewWidget->resize(gPreviewWindow->x(), gPreviewWindow->y(), gPreviewWindow->w(), gPreviewWindow->h() );
+  
+  // Init the widgets : PixelDescription, Full, Scroll, Zoom & Histogram 
+  m_FullWindow       = new Fl_Window(500,500);
+  m_ScrollWindow     = new Fl_Window(200,200);
+  m_ZoomWindow       = new Fl_Window(200,200);
+  m_PixelWindow      = new Fl_Window(200,200);
+  m_HistogramWindow  = new Fl_Window(300,200);
+
+
+  
+  
+  //
+  m_CurveWidget->resize(0,0,300,200);
+  m_HistogramWindow->add(m_CurveWidget);
+  m_HistogramWindow->resize(0,0,300,200);
+  m_Bhistogram          = HistogramCurveType::New();
+  m_Rhistogram          = HistogramCurveType::New();
+  m_Ghistogram          = HistogramCurveType::New();
+  
+  m_Red.Fill(0);
+  m_Green.Fill(0);
+  m_Blue.Fill(0);
+  
+  m_Red[0]  = 1.;   m_Red[3]   = 0.5;
+  m_Green[1]= 1.;   m_Green[3] = 0.5;
+  m_Blue[2] = 1.;   m_Blue[3]  = 0.5;
+  
+  m_Ghistogram->SetHistogramColor(m_Green);
+  m_Ghistogram->SetLabelColor(m_Green);
+  m_Bhistogram->SetHistogramColor(m_Blue);
+  m_Bhistogram->SetLabelColor(m_Blue);
+  m_Rhistogram->SetHistogramColor(m_Red);
+  m_Rhistogram->SetLabelColor(m_Red);
+  
+  m_CurveWidget->AddCurve(m_Bhistogram);
+  m_CurveWidget->AddCurve(m_Ghistogram);
+  m_CurveWidget->AddCurve(m_Rhistogram);
+  m_CurveWidget->SetXAxisLabel("Pixels");
+  m_CurveWidget->SetYAxisLabel("Frequency");
+    
+  //Add a widget once
+  m_PixelWindow->add(m_PixelView->GetPixelDescriptionWidget());
+
+  //
+  m_PackedWindow =  PackedWidgetManagerType::New(); 
+}
+  
+  /**
+   * 
+   */
+void
+ImageViewerManagerViewGUI
+::OpenImage()
+{
+  std::string pikedFileName="";
+  char * cfname ;
+  cfname = fl_file_chooser("Pick an image file", "*.*",pikedFileName.c_str());
+  
+  if (cfname == NULL || strlen(cfname)<1)
+    {
+      otbMsgDebugMacro(<<"Empty file name!");
+      return ;
+    }
+  
+  Fl::check();
+  guiMainWindow->redraw();
+  
+  //Put the status of the last image 
+  m_DisplayStatusList.push_back(false);
+  //m_DisplayedWidgetList.push_back(NULL);
+
+  // Call the Controller
+  m_ImageViewerManagerController->OpenInputImage(cfname);
+
+
+
+}
+
+/**
+ * Handle the notification of the model
+ */
+void
+ImageViewerManagerViewGUI
+::ImageViewerManagerNotify()
+{
+  if(m_ImageViewerManagerModel->GetHasImageOpened())
+    this->AddImageListName();
+  
+  //Update the 
+  if(m_ImageViewerManagerModel->GetHasChangedChannelOrder())
+    {
+      
+      std::cout << " ViewerNotification " << std::endl;
+      unsigned int selectedItem = guiImageList->value();
+      if (selectedItem == 0)
+	return;        // no image selected, return
+
+      //DipalyPreviewWidget
+      this->DisplayPreviewWidget(selectedItem);
+                
+      //Update the widget dispalyed
+      if(m_DisplayStatusList[selectedItem-1])
+	{
+	  this->Display(selectedItem);
+	  m_FullWindow->redraw();
+	  m_ScrollWindow->redraw();
+	  m_ZoomWindow->redraw();
+	}
+
+      //Update Information
+      this->UpdateInformation(selectedItem);
+    }
+}
+
+/**
+ * CloseImage , Send the notification to the controller then to the model
+ */
+void
+ImageViewerManagerViewGUI
+::CloseImage()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+    return;        // no image selected, return
+  
+  //Call the controller
+  m_ImageViewerManagerController->CloseImage(selectedItem);
+
+  //Erase the item selected
+  guiImageList->remove(selectedItem);
+  m_PreviewWidget->hide();
+  
+  if(m_DisplayStatusList[selectedItem-1])
+    {
+      this->Undisplay(selectedItem);
+    }
+  m_DisplayStatusList.erase( m_DisplayStatusList.begin()+(selectedItem-1));
+
+}
+/**
+ * Show the mainWindow 
+ */
+void
+ImageViewerManagerViewGUI
+::Show()
+{
+  guiMainWindow->show();
+}
+
+/**
+ * Update the filename
+ */
+void
+ImageViewerManagerViewGUI
+::AddImageListName()
+{
+  //Update the Image List widget
+  unsigned int len     = m_ImageViewerManagerModel->GetObjectList().size();
+  std::string fileName = m_ImageViewerManagerModel->GetObjectList().at(len-1).fileName;
+  int slashIndex       = fileName.find_last_of("/",fileName.size());
+  
+  itk::OStringStream oss;
+  oss<<m_UndisplayedLabel;
+  oss<<m_TemplateViewerName<<fileName.substr(slashIndex+1,fileName.size());
+  guiImageList->add(oss.str().c_str());
+  guiImageList->redraw();
+}
+
+/**
+ * Quit GUI
+ */
+void
+ImageViewerManagerViewGUI
+::SelectAction()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+    {
+      // no image selected, return
+      return;
+    }
+  
+  //DipalyPreviewWidget
+  this->DisplayPreviewWidget(selectedItem);
+    
+  //Update SelectedImageInformation 
+  this->UpdateInformation(selectedItem);
+  
+  //Udpate the ViewerGUISetup
+  this->UpdateViewerSetupWindow(selectedItem);
+}
+/**
+ * Quit GUI
+ */
+void
+ImageViewerManagerViewGUI
+::DisplayPreviewWidget(unsigned int selectedItem)
+{
+  //Build the m_PreviewWidget
+  VisuModelPointerType rendering = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRendering;
+    
+  m_PreviewWidget->ClearBuffer();
+  ImageViewerManagerModelType::ViewerImageType * quickLook = rendering->GetRasterizedQuicklook();
+  m_PreviewWidget->ReadBuffer(quickLook, quickLook->GetLargestPossibleRegion());
+
+  double newIsotropicZoom = this->UpdatePreviewWidgetIsotropicZoom(quickLook->GetLargestPossibleRegion().GetSize());  
+  m_PreviewWidget->SetIsotropicZoom(newIsotropicZoom);
+  m_PreviewWidget ->show();
+  m_PreviewWidget->redraw();
+}
+
+
+
+/**
+ * Compute the size of the 
+ */
+double
+ImageViewerManagerViewGUI
+::UpdatePreviewWidgetIsotropicZoom(SizeType size)
+{
+  int h = gPreviewWindow->h();
+  int w = gPreviewWindow->w();
+  
+  double zoomW = static_cast<double>(w)/static_cast<double>(size[0]);
+  double zoomH = static_cast<double>(h)/static_cast<double>(size[1]);
+  
+  return std::min(zoomW,zoomH);
+}
+
+/**
+ * Show Hide
+ */
+void
+ImageViewerManagerViewGUI
+::ShowHide()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+    {
+      // no image selected, return
+      return;
+    }
+  
+  /* check what to do */
+  if(!m_DisplayStatusList[selectedItem-1])
+    {
+      //check if there are displayed images : Close them if yes
+      for(unsigned int i = 0; i<m_DisplayStatusList.size() ; i++)    
+	{
+	  if(m_DisplayStatusList[i])
+	    {
+	      this->UpdateImageListShowed(i+1, m_UndisplayedLabel);
+	      m_DisplayStatusList[i] = false;
+	    }
+	}
+      //Display the new image
+      m_DisplayStatusList[selectedItem-1] = true;
+      this->UpdateImageListShowed(selectedItem, m_DisplayedLabel);
+      this->Display(selectedItem);
+    }
+  else
+    {
+      m_DisplayStatusList[selectedItem-1] = false;
+      this->UpdateImageListShowed(selectedItem, m_UndisplayedLabel);
+      this->Undisplay(selectedItem);
+    }
+}
+
+/**
+ * Display the three widget
+ */
+void
+ImageViewerManagerViewGUI
+::Display(unsigned int selectedItem)
+{
+  //- Get the view stored in the model 
+  //- Build the widgets 
+  
+  //First get the histogram list
+  m_pRenderingFuntion = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRenderFuntion;
+  m_Rhistogram->SetHistogram(m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pLayer->GetHistogramList()->GetNthElement(m_pRenderingFuntion->GetRedChannelIndex()));
+  m_Ghistogram->SetHistogram(m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pLayer->GetHistogramList()->GetNthElement(m_pRenderingFuntion->GetGreenChannelIndex()));
+  m_Bhistogram->SetHistogram(m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pLayer->GetHistogramList()->GetNthElement(m_pRenderingFuntion->GetBlueChannelIndex()));
+  
+  //build the 
+  VisuViewPointerType currentVisuView = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pVisuView;
+  m_PixelView->SetModel(m_ImageViewerManagerModel->GetPixelModel());
+  
+  
+  m_PackedWindow->RegisterFullWidget(currentVisuView->GetFullWidget());
+  m_PackedWindow->RegisterScrollWidget(currentVisuView->GetScrollWidget());
+  m_PackedWindow->RegisterZoomWidget(currentVisuView->GetZoomWidget());
+  m_PackedWindow->RegisterPixelInformationWidget(m_PixelView->GetPixelDescriptionWidget());
+  //m_PackedWindow->RegisterHistogramWidget(m_CurveWidget);
+  m_PackedWindow->Show();
+
+  
+  
+//   currentVisuView->GetFullWidget()->show();
+//   //m_PixelView->GetPixelDescriptionWidget()->show();
+//   currentVisuView->GetScrollWidget()->show();
+//   currentVisuView->GetZoomWidget()->show();
+
+    
+//   //   //Pixel Description
+
+//    //   m_PixelWindow->label("Pixel Description");
+//    //   m_PixelWindow->resizable(m_PixelView->GetPixelDescriptionWidget());
+//    //   m_PixelWindow->show();
+//     m_PackedWindow->m_PixelInformationGroup->resizable(m_PixelView->GetPixelDescriptionWidget());
+//     m_PixelView->GetPixelDescriptionWidget()->resize(m_PackedWindow->m_PixelInformationGroup->x(), m_PackedWindow->m_PixelInformationGroup->y(),
+// 						     m_PackedWindow->m_PixelInformationGroup->w(),m_PackedWindow->m_PixelInformationGroup->h());
+    
+//     //   //FullWidget
+//     //   m_FullWindow->label("Full Window");
+//     //   m_FullWindow->add(currentVisuView->GetFullWidget());
+//     //   m_FullWindow->resizable(currentVisuView->GetFullWidget());
+//     //   m_FullWindow->show(); 
+    
+//     m_PackedWindow->m_FullGroup->add(currentVisuView->GetFullWidget());
+//     m_PackedWindow->m_FullGroup->resizable(currentVisuView->GetFullWidget());
+//     currentVisuView->GetFullWidget()->resize(m_PackedWindow->m_FullGroup->x(), m_PackedWindow->m_FullGroup->y(),
+// 					     m_PackedWindow->m_FullGroup->w(),m_PackedWindow->m_FullGroup->h());
+    
+//     //   m_FullWindow->redraw();
+    
+//     //   //ScrollWidget
+//     //   m_ScrollWindow->label("Scroll Window");
+//     //   m_ScrollWindow->add((currentVisuView->GetScrollWidget()));
+//     //   m_ScrollWindow->resizable(currentVisuView->GetScrollWidget());
+//     //   m_ScrollWindow->show();
+//     m_PackedWindow->m_QuicklookGroup->add(currentVisuView->GetScrollWidget());
+//     m_PackedWindow->m_QuicklookGroup->resizable(currentVisuView->GetScrollWidget());
+//     currentVisuView->GetScrollWidget()->resize(m_PackedWindow->m_QuicklookGroup->x(),m_PackedWindow->m_QuicklookGroup->y(),
+// 					       m_PackedWindow->m_QuicklookGroup->w(),m_PackedWindow->m_QuicklookGroup->h());
+//     //   m_ScrollWindow->redraw();
+    
+//     //   //Zoom Widget
+//     //   m_ZoomWindow->label("Zoom Window");
+//     //   m_ZoomWindow->add(currentVisuView->GetZoomWidget());
+//     //   m_ZoomWindow->resizable(currentVisuView->GetZoomWidget());
+//     //   m_ZoomWindow->show();
+    
+//     m_PackedWindow->m_ZoomGroup->add(currentVisuView->GetZoomWidget());
+//     m_PackedWindow->m_ZoomGroup->resizable(currentVisuView->GetZoomWidget());
+//     currentVisuView->GetZoomWidget()->resize(m_PackedWindow->m_ZoomGroup->x(),m_PackedWindow->m_ZoomGroup->y(),
+// 					    m_PackedWindow->m_ZoomGroup->w(),m_PackedWindow->m_ZoomGroup->h());
+    
+//     //   m_ZoomWindow->redraw();
+    
+//     // adding histograms rendering
+//     // Get the renderingFunction  
+
+    
+  
+  //     // m_HistogramWindow->show();
+//     m_PackedWindow->m_HistogramsGroup->add(m_CurveWidget);
+//     m_CurveWidget->resize(m_PackedWindow->m_HistogramsGroup->x(),m_PackedWindow->m_HistogramsGroup->y(),
+// 			 m_PackedWindow->m_HistogramsGroup->w(),m_PackedWindow->m_HistogramsGroup->h());
+    
+//     //   m_CurveWidget->redraw();
+    
+    //Display Everything
+  
+
+  //currentVisuView->GetFullWidget()->show();
+  //m_PixelView->GetPixelDescriptionWidget()->show();
+  //currentVisuView->GetScrollWidget()->show();
+  //currentVisuView->GetZoomWidget()->show();
+  //m_CurveWidget->show();
+    
+}
+
+/**
+ * Update the guiImageList
+ * Put a  "+" if the view is being showed, or a "-" otherwise in the begining of the imageName
+ */
+void
+ImageViewerManagerViewGUI
+::UpdateImageListShowed(unsigned int selectedItem, std::string status)
+{
+
+  /* Update the ImageList using the status label "+" or "-" */
+  std::string fileName = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).fileName;
+  int slashIndex = fileName.find_last_of("/",fileName.size());
+  
+  itk::OStringStream oss;
+  oss<<status;
+  oss<<m_TemplateViewerName<<fileName.substr(slashIndex+1,fileName.size());
+  guiImageList->text(selectedItem,oss.str().c_str());
+  oss.str("");
+}
+
+/**
+ * Hide all the widget opened
+ */
+void
+ImageViewerManagerViewGUI
+::Undisplay(unsigned int selectedItem)
+{
+  //   m_FullWindow->hide();
+  //   m_ScrollWindow->hide(); 
+  //   m_ZoomWindow->hide();
+  //   m_PixelWindow->hide(); 
+  //   m_HistogramWindow->hide();
+
+
+  //m_PackedWindow->m_Window->hide();
+}
+/**
+ * Hide all the widget opened
+ */
+void
+ImageViewerManagerViewGUI
+::HideAll()
+{
+  // Set the display Label to undislayed
+  for(unsigned int i = 0; i<m_DisplayStatusList.size() ; i++)    
+    {
+      if(m_DisplayStatusList[i])
+	{
+	  std::cout << "cest le " << i+1 << " qui est affiche  "<< std::endl; 
+	  this->UpdateImageListShowed(i+1, m_UndisplayedLabel);
+	  m_DisplayStatusList[i] = false;
+	}
+    }
+  // Close the opened widget
+
+  //packeduWindow->m_Window->hide();
+
+  
+//   m_FullWindow->hide();
+//   m_ScrollWindow->hide(); 
+//   m_ZoomWindow->hide();
+//   m_PixelWindow->hide();
+//   m_HistogramWindow->hide();
+}
+
+/**
+ * Quit GUI
+ */
+void
+ImageViewerManagerViewGUI
+::Quit()
+{
+  m_FullWindow->hide();
+  m_ScrollWindow->hide(); 
+  m_ZoomWindow->hide();
+  m_PixelWindow->hide();
+  guiMainWindow->hide();
+}
+
+/**
+ *
+ */
+void
+ImageViewerManagerViewGUI
+::UpdateInformation(unsigned int selectedItem)
+{
+  itk::OStringStream oss;
+  oss.str("");
+  std::string selectedImageName = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).fileName;
+  // Clear the info buffer
+  guiViewerInformation->buffer()->remove(0,guiViewerInformation->buffer()->length());
+  oss<<"Filename: "<<selectedImageName<<std::endl;
+  guiViewerInformation->insert(oss.str().c_str());
+  oss.str("");
+  oss<<"Image information:"<<std::endl;
+  guiViewerInformation->insert(oss.str().c_str());
+  oss.str("");
+  oss<<"Number of bands: "<<m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pReader->GetOutput()->GetNumberOfComponentsPerPixel();
+  oss<<" - Size: "<<m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pReader->GetOutput()->GetLargestPossibleRegion().GetSize()<<std::endl;
+
+  guiViewerInformation->insert(oss.str().c_str());
+  oss.str("");
+
+  //update band information
+  if(m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pReader->GetOutput()->GetNumberOfComponentsPerPixel()>=3)
+    {
+      oss<<"RGB Composition: ";
+      oss<<" Band 1: "<<m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRenderFuntion->GetRedChannelIndex();
+      oss<<" Band 2: "<<m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRenderFuntion->GetGreenChannelIndex();
+      oss<<" Band 3: "<<m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRenderFuntion->GetBlueChannelIndex()<<std::endl;
+    }
+  
+  guiViewerInformation->insert(oss.str().c_str());
+  oss.str("");
+}
+
+/**
+ *
+ */
+void
+ImageViewerManagerViewGUI
+::UpdateViewerSetupWindow(unsigned int selectedItem)
+{
+  
+  ImageViewerManagerModelType::ReaderPointerType reader = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pReader;
+  m_NbComponent = reader->GetOutput()->GetNumberOfComponentsPerPixel();
+
+  itk::OStringStream oss;
+  oss.str("");
+  
+  for (unsigned int i = 0;i<m_NbComponent;++i)
+  {
+    oss.str("");
+    oss<<i+1;
+    guiGrayscaleChannelChoice->add(oss.str().c_str());
+    guiRedChannelChoice->add(oss.str().c_str());
+    guiGreenChannelChoice->add(oss.str().c_str());
+    guiBlueChannelChoice->add(oss.str().c_str());
+    guiGrayscaleChannelChoice->add(oss.str().c_str());
+    guiRealChannelChoice->add(oss.str().c_str());
+    guiImaginaryChannelChoice->add(oss.str().c_str());
+  }
+
+  switch(m_NbComponent){
+  case 1 :
+    this->GrayScaleSet();
+    break;
+  case 4 : 
+    this->RGBSet();
+    break;
+  case 3 : 
+    this->RGBSet();
+    break;    
+  default:
+    this->ComplexSet();
+  }
+  
+  guiViewerSetupName->value(m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).fileName.c_str());
+  
+}
+
+/**
+ * RGBSet();
+ */
+void 
+ImageViewerManagerViewGUI
+::RGBSet()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+    {
+      // no image selected, return
+      return;
+    }
+
+  StandardRenderingFunctionType::Pointer renderingFunction = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRenderFuntion;
+  
+  guiViewerSetupColorMode->set();
+  guiViewerSetupComplexMode->clear();
+  guiViewerSetupGrayscaleMode->clear();
+  guiGrayscaleChannelChoice->deactivate();
+  guiRealChannelChoice->deactivate();
+  guiImaginaryChannelChoice->deactivate();
+  bModulus->deactivate();
+  bPhase->deactivate();
+  
+  guiRedChannelChoice->activate();
+  guiGreenChannelChoice->activate();
+  guiBlueChannelChoice->activate();
+
+  guiRedChannelChoice->value(std::min(renderingFunction->GetRedChannelIndex(),m_NbComponent-1));
+  guiGreenChannelChoice->value(std::min(renderingFunction->GetGreenChannelIndex(),m_NbComponent-1));
+  guiBlueChannelChoice->value(std::min(renderingFunction->GetBlueChannelIndex(),m_NbComponent-1));
+  
+}
+
+/**
+ * GrayScale();
+ */
+void 
+ImageViewerManagerViewGUI
+::GrayScaleSet()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+    {
+      // no image selected, return
+      return;
+    }
+
+  StandardRenderingFunctionType::Pointer renderingFunction = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRenderFuntion;
+  
+  guiViewerSetupGrayscaleMode->set();
+  guiViewerSetupComplexMode->clear();
+  guiViewerSetupColorMode->clear();
+  
+  guiRealChannelChoice->deactivate();
+  guiImaginaryChannelChoice->deactivate();
+  bModulus->deactivate();
+  bPhase->deactivate();
+  guiRedChannelChoice->deactivate();
+  guiGreenChannelChoice->deactivate();
+  guiBlueChannelChoice->deactivate();
+
+  guiGrayscaleChannelChoice->activate();
+  guiGrayscaleChannelChoice->value(std::min(renderingFunction->GetRedChannelIndex(),m_NbComponent-1));
+}
+
+
+void
+ImageViewerManagerViewGUI
+::ComplexSet()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+  {
+    // no image selected, return
+    return;
+  }
+  
+  StandardRenderingFunctionType::Pointer renderingFunction = m_ImageViewerManagerModel->GetObjectList().at(selectedItem-1).pRenderFuntion;
+  
+  guiViewerSetupComplexMode->set();
+  guiViewerSetupColorMode->clear();
+  guiViewerSetupGrayscaleMode->clear();
+  guiGrayscaleChannelChoice->deactivate();
+  guiRedChannelChoice->deactivate();
+  guiGreenChannelChoice->deactivate();
+  guiBlueChannelChoice->deactivate();
+  guiRealChannelChoice->activate();
+  guiImaginaryChannelChoice->activate();
+  bModulus->activate();
+  bPhase->activate();
+  guiRealChannelChoice->value(std::min(renderingFunction->GetRedChannelIndex(),m_NbComponent-1));
+  guiImaginaryChannelChoice->value(std::min(renderingFunction->GetGreenChannelIndex(),m_NbComponent-1));
+}
+
+
+/**
+ * ViewerSetup();
+ */
+void 
+ImageViewerManagerViewGUI
+::ViewerSetup()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+  {
+    // no image selected, return
+    return;
+  }
+  guiViewerSetupWindow->show();
+}
+
+void 
+ImageViewerManagerViewGUI
+::ViewerSetupOk()
+{
+  unsigned int selectedItem = guiImageList->value();
+  if (selectedItem == 0)
+  {
+    // no image selected, return
+    return;
+  }
+  
+  if (guiViewerSetupColorMode->value())
+    {
+      m_ImageViewerManagerController->UpdateRGBChannelOrder(atoi(guiRedChannelChoice->value())-1,
+							    atoi(guiGreenChannelChoice->value())-1,
+							    atoi(guiBlueChannelChoice->value())-1,
+							    selectedItem);
+    }
+  else if (guiViewerSetupGrayscaleMode->value())
+    {
+      m_ImageViewerManagerController->UpdateGrayScaleChannelOrder(atoi(guiGrayscaleChannelChoice->value())-1,
+								  selectedItem);
+    }
+  else if (guiViewerSetupComplexMode->value())
+    {
+      if (bModulus->value())
+	{
+	  m_ImageViewerManagerController->UpdateModulusChannelOrder(atoi(guiRealChannelChoice->value())-1,
+								   atoi(guiImaginaryChannelChoice->value())-1,
+								   selectedItem);
+	}
+      else
+	{
+	  m_ImageViewerManagerController->UpdatePhaseChannelOrder(atoi(guiRealChannelChoice->value())-1,
+								  atoi(guiImaginaryChannelChoice->value())-1,
+								  selectedItem);
+	}
+    }
+}
+
+void 
+ImageViewerManagerViewGUI
+::ViewerSetupCancel()
+{
+  guiViewerSetupWindow->hide();
+}
+
+/**
+ * PrintSelf Method
+ */
+
+void
+ImageViewerManagerViewGUI
+::PrintSelf(std::ostream& os, itk::Indent indent) const
+{
+  Superclass::PrintSelf(os, indent);
+}
+} // End namespace otb
+
diff --git a/ViewerManager/View/otbImageViewerManagerViewGUI.h b/ViewerManager/View/otbImageViewerManagerViewGUI.h
new file mode 100644
index 0000000000000000000000000000000000000000..33ee57c4a1579d57f3f44fcb6ea7d695f8805844
--- /dev/null
+++ b/ViewerManager/View/otbImageViewerManagerViewGUI.h
@@ -0,0 +1,252 @@
+/*=========================================================================
+
+Program:   ORFEO Toolbox
+Language:  C++
+Date:      $Date$
+Version:   $Revision$
+
+
+Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
+See OTBCopyright.txt for details.
+
+
+This software is distributed WITHOUT ANY WARRANTY; without even
+the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef __otbImageViewerManagerViewGUI_h 
+#define __otbImageViewerManagerViewGUI_h 
+
+#include "otbImageViewerManagerEventsListener.h"
+
+// Disabling deprecation warning
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4996)
+#endif
+#include "otbImageViewerManagerViewGroup.h"
+//#include "otbImageWidgetPackedManager.h"
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#include <FL/Fl_Group.H>
+#include "otbImageViewerManagerModel.h"
+#include "otbImageViewerManagerControllerInterface.h"
+
+#include "otbImageView.h"
+#include "otbImageWidget.h"
+#include "otbPixelDescriptionView.h"
+
+#include "otbCurves2DWidget.h"
+#include "otbHistogramCurve.h"
+
+#include "otbPackedWidgetManager.h"
+
+#include "otbObjectList.h"
+#include "otbFixedSizeFullImageWidget.h"
+#include <FL/Fl_File_Chooser.H>
+
+namespace otb
+{
+/** \class ImageViewerManagerViewGUI
+ *
+ */
+  class ITK_EXPORT ImageViewerManagerViewGUI
+    : public ImageViewerManagerEventsListener, public ImageViewerManagerViewGroup
+{
+public:
+  /** Standard typedefs */
+  typedef ImageViewerManagerViewGUI                  Self;
+  typedef ImageViewerManagerEventsListener           Superclass;
+  typedef itk::SmartPointer<Self>                    Pointer;
+  typedef itk::SmartPointer<const Self>              ConstPointer;
+
+  /** Type macro */
+  itkNewMacro(Self);
+
+  /** Creation through object factory macro */
+  itkTypeMacro(ImageViewerManagerViewGUI,ImageViewerManagerEventListener);
+
+  /** Controller */
+  typedef ImageViewerManagerControllerInterface::Pointer  ImageViewerManagerControllerInterfacePointerType;
+  
+  /** Model*/
+  typedef ImageViewerManagerModel                                 ImageViewerManagerModelType;
+  typedef ImageViewerManagerModelType::VisuModelType              VisuModelType;  //rendreing Image
+  typedef ImageViewerManagerModelType::VisuModelPointerType       VisuModelPointerType;  //rendreing Image
+  typedef ImageViewerManagerModelType::PixelDescriptionModelType  PixelDescriptionModelType;  //rendreing Image
+  typedef ImageViewerManagerModelType::LayerType::HistogramType   HistogramType;        
+  typedef ImageViewerManagerModelType::StandardRenderingFunctionType StandardRenderingFunctionType;
+  
+  typedef ImageView<VisuModelType>                                VisuViewType;
+  typedef VisuViewType::Pointer                                   VisuViewPointerType;
+
+  typedef PixelDescriptionView<PixelDescriptionModelType>         PixelDescriptionViewType;
+
+  typedef ObjectList<VisuViewType>                                VisuViewListType;
+  typedef VisuViewListType::Pointer                               VisuViewListPointerType;
+
+  //typedef ImageWidgetPackedManager                                ImageWidgetPackedManagerType;
+  //typedef std::vector<ImageWidgetPackedManagerType*>            WidgetManagerList; 
+  
+  // 
+  typedef PackedWidgetManager                                     PackedWidgetManagerType;
+  typedef PackedWidgetManagerType::Pointer                        PackedWidgetManagerPointerType;
+  
+  /** Widget for the preview*/
+  typedef ImageWidget<>                                           ImageWidgetType;
+  typedef ImageWidgetType::SizeType                               SizeType;
+  typedef ImageWidgetType::Pointer                                ImageWidgetPointerType;
+
+  /** Curves 2D widget */
+  typedef Curves2DWidget                            CurvesWidgetType;
+  typedef CurvesWidgetType::Pointer                 CurvesWidgetPointerType;
+  typedef HistogramCurve<HistogramType>             HistogramCurveType;
+  typedef HistogramCurveType::Pointer               HistogramCurvePointerType;
+
+  /** vector to store the status of images : diplayed or not displayed*/
+  typedef std::vector<bool>                                       BoolVector;
+  
+  typedef ObjectList<VisuViewType>                                VisuViewShowedList;
+
+  
+  /** Method to set the controller*/
+  itkGetObjectMacro(ImageViewerManagerController,ImageViewerManagerControllerInterface);
+
+  void SetImageViewerManagerController(ImageViewerManagerControllerInterface *pController)
+  {
+    m_ImageViewerManagerController = pController;
+    m_VisuView->SetController(m_ImageViewerManagerController->GetVisuController());
+    m_PreviewWidget->SetController(m_ImageViewerManagerController->GetPreviewVisuController());
+  }
+    
+
+  /** VisuModel */
+  itkGetMacro(VisuView,VisuViewPointerType);
+  //itkGetMacro(VisuViewList,VisuViewListPointerType );
+  
+  itkGetMacro(PreviewWidget,ImageWidgetPointerType );
+  
+  /// Show()
+  virtual void Show();
+
+   // Update the display
+  virtual void ImageViewerManagerNotify();
+  
+  /// Inherited methods
+  virtual void OpenImage();
+  //virtual VisuViewPointerType  AddView(VisuModelPointerType renderingLayer);
+  
+protected:
+  virtual void   CloseImage(); 
+  virtual void   ViewerSetup();
+  virtual void   ViewerSetupOk(); 
+  virtual void   ViewerSetupCancel(); 
+  /*   virtual void LinkSetup(); */
+  /*   virtual void LinkSetupRemove(); */
+  /*   virtual void LinkSetupClear(); */
+  /*   virtual void LinkSetupOk(); */
+  /*   virtual void LinkSetupSave(); */
+  virtual void   AddImageListName();
+  virtual void   Quit(); 
+  virtual void   SelectAction(); 
+  virtual double UpdatePreviewWidgetIsotropicZoom(SizeType size);
+  virtual void   ShowHide(); 
+  virtual void   HideAll(); 
+  virtual void   Display(unsigned int selectedItem);
+  virtual void   Undisplay(unsigned int selectedItem); 
+  virtual void   UpdateImageListShowed(unsigned int selectedItem, std::string status);
+  virtual void   GrayScaleSet(); 
+  virtual void   RGBSet(); 
+  virtual void   ComplexSet(); 
+  /*   virtual void ZoomSmallImagesHook(); */
+  /*   virtual void Diaporama(); */
+  /*   virtual void DiaporamaPrevious(); */
+  /*   virtual void DiaporamaNext(); */
+  /*   virtual void DiaporamaQuit(); */
+  
+  virtual void UpdateInformation(unsigned int selectedItem); 
+  virtual void UpdateViewerSetupWindow(unsigned int selectedItem); 
+  virtual void DisplayPreviewWidget(unsigned int selectedItem);
+  
+  /*   virtual void UpdateLinkSetupWindow(unsigned int selectedItem); */
+  /*   virtual void UpdatePreviewWindow(unsigned int selectedItem); */
+  /*   virtual void UpdateDiaporamaProgressBar(); */
+  
+
+  /** Constructor */
+  ImageViewerManagerViewGUI();
+  /** Destructor */
+  virtual ~ImageViewerManagerViewGUI()
+    {
+      
+      delete        m_FullWindow;
+      delete        m_ScrollWindow;
+      delete        m_ZoomWindow;
+      delete        m_PixelWindow;
+    };
+  /**PrintSelf method */
+  virtual void PrintSelf(std::ostream& os, itk::Indent indent) const;
+
+private:
+  ImageViewerManagerViewGUI(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+  
+  /** Pointer to the model */
+  
+  ImageViewerManagerModel::Pointer               m_ImageViewerManagerModel;
+  /** Pointer to the controller */
+  ImageViewerManagerControllerInterface::Pointer m_ImageViewerManagerController;
+  
+  BoolVector                                     m_DisplayStatusList;
+  std::string                                    m_TemplateViewerName ;
+  std::string                                    m_DisplayedLabel;
+  std::string                                    m_UndisplayedLabel ;
+  VisuViewShowedList::Pointer                    m_VisuViewShowedList;
+  
+  /** FL_Windows*/
+  Fl_Window*                                     m_FullWindow;
+  Fl_Window*                                     m_ScrollWindow;
+  Fl_Window*                                     m_ZoomWindow;
+  Fl_Window*                                     m_PixelWindow;
+  Fl_Window*                                     m_HistogramWindow;
+
+  PackedWidgetManagerType::Pointer               m_PackedWindow;
+
+  //Packed View
+  //ImageWidgetPackedManagerType *                 packedWindow;
+  //WidgetManagerList                              m_DisplayedWidgetList;
+  
+  /** Curve widget */
+  CurvesWidgetPointerType                        m_CurveWidget;
+  HistogramCurveType::Pointer                    m_Bhistogram;
+  HistogramCurveType::Pointer                    m_Ghistogram;
+  HistogramCurveType::Pointer                    m_Rhistogram;
+
+  unsigned int                                   m_NbComponent;
+  /** NewVisu */
+  VisuViewPointerType                            m_VisuView;
+  
+  /**ImageWidget for my preview*/
+  ImageWidgetPointerType                         m_PreviewWidget;
+
+  /**view associated to the pixelDescription*/
+  PixelDescriptionViewType::Pointer             m_PixelView ;
+
+
+
+  //Histogram 
+  StandardRenderingFunctionType::Pointer  m_pRenderingFuntion;
+  HistogramCurveType::ColorType    m_Red;
+  HistogramCurveType::ColorType    m_Green;
+  HistogramCurveType::ColorType    m_Blue;
+  
+  
+
+};
+}// End namespace otb
+
+#endif
+
diff --git a/ViewerManager/View/otbImageViewerManagerViewGroup.fl b/ViewerManager/View/otbImageViewerManagerViewGroup.fl
new file mode 100644
index 0000000000000000000000000000000000000000..c45fc6759fc19e0823bff5b128f5551212e0a1b4
--- /dev/null
+++ b/ViewerManager/View/otbImageViewerManagerViewGroup.fl
@@ -0,0 +1,262 @@
+# data file for the Fltk User Interface Designer (fluid)
+version 1.0109 
+header_name {.h} 
+code_name {.cxx}
+class ImageViewerManagerViewGroup {open
+} {
+  Function {CreateGUI()} {open return_type void
+  } {
+    Fl_Window guiMainWindow {
+      label otbImageViewerManagerView open selected
+      xywh {495 250 610 460} type Double box UP_BOX color 52 selection_color 7 labelcolor 187 resizable visible
+    } {
+      Fl_Text_Display guiViewerInformation {
+        label Information
+        tooltip {Selected image viewer information} xywh {15 324 575 126} box EMBOSSED_BOX color 54 selection_color 55 labelcolor 186 textcolor 187
+      }
+      Fl_Browser guiImageList {
+        label {Viewers List}
+        callback {SelectAction();}
+        tooltip {List of opened image viewer (showed image viewer are prefixed with +, and hidden with -)} xywh {25 35 230 275} type Hold box EMBOSSED_BOX selection_color 20 labelcolor 186 align 1 textcolor 187
+      }
+      Fl_Group gPreviewWindow {open
+        xywh {280 38 195 189} resizable
+      } {}
+      Fl_Group gBottom {open
+        xywh {260 244 225 60}
+      } {
+        Fl_Button guiShowHide {
+          label {Show / Hide}
+          callback {ShowHide();}
+          tooltip {Show or hide the selected image viewer} xywh {260 257 105 33} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x20 color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Button guiHideAll {
+          label {Hide all}
+          callback {HideAll();}
+          tooltip {Hide all the viewers} xywh {373 257 100 33} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x20 color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Group gBlanck1 {open
+          xywh {475 254 10 41} resizable
+        } {}
+      }
+      Fl_Group gRight {open
+        xywh {480 31 115 277}
+      } {
+        Fl_Button guiOpenImage {
+          label {Open Image}
+          callback {OpenImage();}
+          tooltip {Open an image in a  new image viewer} xywh {489 46 95 24} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x6f color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Button guiCloseImage {
+          label {Close Image}
+          callback {CloseImage();}
+          tooltip {Close the selected image} xywh {489 88 95 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x63 color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Button guiViewerSetup {
+          label {Viewer setup}
+          callback {ViewerSetup();}
+          tooltip {Set up the selected viewer} xywh {489 129 95 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x76 color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Button guiLinkSetup {
+          label {Link setup}
+          callback {LinkSetup();}
+          tooltip {Add or remove links with the selected viewer} xywh {489 172 95 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x6c color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Button guiQuit {
+          label Quit
+          callback {Quit();}
+          tooltip {Quit the viewer manager} xywh {490 258 95 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x71 color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Button {} {
+          label Slideshow
+          callback {Diaporama();}
+          tooltip {Launch the slideshow mode} xywh {490 215 95 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0x64 color 23 selection_color 23 labelcolor 186
+        }
+        Fl_Group gBlanck2 {open
+          xywh {500 288 75 12} resizable
+        } {}
+      }
+    }
+    Fl_Window guiViewerSetupWindow {
+      label {Viewer setup} open
+      xywh {885 215 705 230} type Double box UP_BOX color 52 selection_color 7 labelcolor 187 visible
+    } {
+      Fl_Round_Button guiViewerSetupGrayscaleMode {
+        label {Grayscale mode}
+        callback {GrayScaleSet();}
+        tooltip {Swith the image viewer mode to grayscale} xywh {22 18 140 24} box ROUND_UP_BOX down_box ROUND_DOWN_BOX value 1 color 23 selection_color 22 labelcolor 186
+      }
+      Fl_Round_Button guiViewerSetupColorMode {
+        label {RGB composition mode}
+        callback {RGBSet();}
+        tooltip {Switch the image viewer mode to RGB composition} xywh {460 17 184 24} box ROUND_UP_BOX down_box ROUND_DOWN_BOX color 23 selection_color 22 labelcolor 186
+      }
+      Fl_Input_Choice guiGrayscaleChannelChoice {
+        label {Channel index } open
+        tooltip {Select the band to view in grayscale mode} xywh {118 73 57 24} box EMBOSSED_BOX color 7 selection_color 55 labelcolor 187
+      } {}
+      Fl_Input_Choice guiRedChannelChoice {
+        label {Red channel index } open
+        tooltip {Select band for red channel in RGB composition} xywh {602 51 57 24} box EMBOSSED_BOX color 7 selection_color 55 labelcolor 187 deactivate
+      } {}
+      Fl_Input_Choice guiGreenChannelChoice {
+        label {Green channel index } open
+        tooltip {Select band for green channel in RGB composition} xywh {602 73 57 24} box EMBOSSED_BOX color 7 selection_color 55 labelcolor 187 deactivate
+      } {}
+      Fl_Input_Choice guiBlueChannelChoice {
+        label {Blue channel index } open
+        tooltip {Select band for blue channel in RGB composition} xywh {602 95 57 24} box EMBOSSED_BOX color 7 selection_color 55 labelcolor 187 deactivate
+      } {}
+      Fl_Return_Button guiViewerSetupOk {
+        label Ok
+        callback {ViewerSetupOk();}
+        tooltip {Save changes and leave viewer set up interface} xywh {353 180 80 30} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0xff0d color 23 selection_color 23 labelcolor 186
+      }
+      Fl_Input guiViewerSetupName {
+        label {Viewer name}
+        tooltip {Set a new name for the selected viewer} xywh {205 136 305 24} box EMBOSSED_BOX color 54 selection_color 55 labelcolor 186 textcolor 187
+      }
+      Fl_Button guiViewerSetupCancel {
+        label Cancel
+        callback {ViewerSetupCancel();}
+        tooltip {Leave viewer set up interface without saving changes} xywh {240 180 80 30} box ROUND_UP_BOX down_box ROUND_DOWN_BOX color 23 selection_color 23 labelcolor 186
+      }
+      Fl_Round_Button guiViewerSetupComplexMode {
+        label {Complex composition mode}
+        callback {ComplexSet();}
+        tooltip {Switch the image viewer mode to complex composition} xywh {215 17 210 26} box ROUND_UP_BOX down_box ROUND_DOWN_BOX color 23 selection_color 22 labelcolor 186
+      }
+      Fl_Input_Choice guiRealChannelChoice {
+        label {Real channel index } open
+        tooltip {Select band for real channel in complex composition} xywh {375 74 57 24} box EMBOSSED_BOX color 7 selection_color 55 labelcolor 187 deactivate
+      } {}
+      Fl_Input_Choice guiImaginaryChannelChoice {
+        label {Imaginary channel index } open
+        tooltip {Select band for imaginary channel in complex composition} xywh {375 96 57 24} box EMBOSSED_BOX color 7 selection_color 55 labelcolor 187 deactivate
+      } {}
+      Fl_Round_Button bModulus {
+        label Modulus
+        callback {bPhase->clear();}
+        tooltip {Toggle modulus mode} xywh {235 50 80 15} down_box ROUND_DOWN_BOX value 1 labelcolor 187 deactivate
+      }
+      Fl_Round_Button bPhase {
+        label Phase
+        callback {bModulus->clear();}
+        tooltip {Toggle phase mode} xywh {325 50 80 15} down_box ROUND_DOWN_BOX labelcolor 187 deactivate
+      }
+    }
+    Fl_Window guiLinkSetupWindow {
+      label {Link setup}
+      xywh {888 755 440 220} type Double box UP_BOX color 52 selection_color 7 labelcolor 187 visible
+    } {
+      Fl_Input_Choice guiLinkChoice {
+        label {Link to viewer: } open
+        tooltip {Select the viewer to link with} xywh {115 26 185 24} box EMBOSSED_BOX color 54 selection_color 55 labelcolor 187
+      } {}
+      Fl_Input guiLinkXOffset {
+        label {X offset}
+        tooltip {Set the x offset of the link} xywh {379 16 35 23} box EMBOSSED_BOX selection_color 55 labelcolor 186 textcolor 187
+      }
+      Fl_Input guiLinkYOffset {
+        label {Y offset}
+        tooltip {Set the Y offset of the link} xywh {379 41 35 23} box EMBOSSED_BOX selection_color 55 labelcolor 186 textcolor 187
+      }
+      Fl_Button guiSaveLink {
+        label Apply
+        callback {LinkSetupSave();}
+        tooltip {Save the current link} xywh {15 175 90 30} box ROUND_UP_BOX color 23 selection_color 23 labelcolor 186
+      }
+      Fl_Browser guiLinkList {
+        label {Existing links}
+        tooltip {List of image viewers already linked with the selected image viewer} xywh {15 88 405 75} type Hold box EMBOSSED_BOX color 54 selection_color 20 labelcolor 186 align 1 textcolor 187
+      }
+      Fl_Button guiLinkRemove {
+        label Remove
+        callback {LinkSetupRemove();}
+        tooltip {Remove the selected link} xywh {121 175 90 30} box ROUND_UP_BOX down_box ROUND_DOWN_BOX color 23 selection_color 23 labelcolor 186
+      }
+      Fl_Button guiLinkClear {
+        label Clear
+        callback {LinkSetupClear();}
+        tooltip {Clear all links for the selected image viewer} xywh {225 175 90 30} box ROUND_UP_BOX down_box ROUND_DOWN_BOX color 23 selection_color 23 labelcolor 186
+      }
+      Fl_Return_Button guiLinkOk {
+        label Quit
+        callback {LinkSetupOk();}
+        tooltip {Leave the link set up interface} xywh {331 175 90 30} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0xff0d color 23 selection_color 23 labelcolor 186
+        code0 {guiLinkSetupWindow->hide();}
+      }
+    }
+    Fl_Window guiDiaporama {
+      label Slideshow
+      xywh {1142 721 390 90} type Double box UP_BOX color 52 selection_color 7 labelcolor 187 visible
+    } {
+      Fl_Progress guiDiaporamaProgressBar {
+        label Progress
+        tooltip {Position in diaporama} xywh {37 14 310 25} box ROUND_UP_BOX selection_color 20 labelcolor 186
+      }
+      Fl_Button {} {
+        label Previous
+        callback {DiaporamaPrevious();}
+        tooltip {Previous image in diaporama} xywh {20 55 105 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0xff55 color 23 selection_color 23 labelcolor 186
+      }
+      Fl_Button {} {
+        label Next
+        callback {DiaporamaNext();}
+        tooltip {Next image in diaporama} xywh {140 55 105 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0xff56 color 23 selection_color 23 labelcolor 186
+      }
+      Fl_Return_Button {} {
+        label { Quit}
+        callback {DiaporamaQuit();}
+        tooltip {Leave diaporama mode} xywh {262 55 105 25} box ROUND_UP_BOX down_box ROUND_DOWN_BOX shortcut 0xff1b color 23 selection_color 23 labelcolor 186
+      }
+    }
+  }
+  Function {ImageViewerManagerViewGroup()} {} {}
+  Function {~ImageViewerManagerViewGroup()} {open return_type virtual
+  } {}
+  Function {OpenImage()} {open return_type {virtual void}
+  } {}
+  Function {CloseImage()} {open return_type {virtual void}
+  } {}
+  Function {ViewerSetup()} {open return_type {virtual void}
+  } {}
+  Function {ViewerSetupOk()} {open return_type {virtual void}
+  } {}
+  Function {LinkSetup()} {open return_type {virtual void}
+  } {}
+  Function {LinkSetupRemove()} {open return_type {virtual void}
+  } {}
+  Function {LinkSetupClear()} {open return_type {virtual void}
+  } {}
+  Function {LinkSetupOk()} {open return_type {virtual void}
+  } {}
+  Function {LinkSetupSave()} {open return_type {virtual void}
+  } {}
+  Function {Quit()} {open return_type {virtual void}
+  } {}
+  Function {SelectAction()} {open return_type {virtual void}
+  } {}
+  Function {ShowHide()} {open return_type {virtual void}
+  } {}
+  Function {GrayScaleSet()} {open return_type {virtual void}
+  } {}
+  Function {RGBSet()} {open return_type {virtual void}
+  } {}
+  Function {ViewerSetupCancel()} {open return_type {virtual void}
+  } {}
+  Function {ZoomSmallImagesHook()} {open return_type {virtual void}
+  } {}
+  Function {DiaporamaPrevious()} {open return_type {virtual void}
+  } {}
+  Function {DiaporamaNext()} {open return_type {virtual void}
+  } {}
+  Function {DiaporamaQuit()} {open return_type {virtual void}
+  } {}
+  Function {Diaporama()} {open return_type {virtual void}
+  } {}
+  Function {HideAll()} {open return_type {virtual void}
+  } {}
+  Function {ComplexSet()} {open return_type {virtual void}
+  } {}
+} 
diff --git a/ViewerManager/otbImageViewerManager.cxx b/ViewerManager/otbImageViewerManager.cxx
index a7179b24d0b7be6bf77d161bcb8edd8d0c2a0a43..b657c1341c62ded11d6a8eaedce26b857c647584 100644
--- a/ViewerManager/otbImageViewerManager.cxx
+++ b/ViewerManager/otbImageViewerManager.cxx
@@ -15,49 +15,62 @@ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 PURPOSE.  See the above copyright notices for more information.
 
 =========================================================================*/
-#include "otbImageViewerManager.h"
+#include "otbImageViewerManagerViewGUI.h"
+#include "otbImageViewerManagerModel.h"
+#include "otbImageViewerManagerController.h"
+#include "otbCommandLineArgumentParser.h"
+#include "otbMsgReporter.h"
+
 
 int main(int argc, char* argv[])
 {
+  
+  // Parse command line parameters
+  typedef otb::CommandLineArgumentParser ParserType;
+  ParserType::Pointer parser = ParserType::New();
+
+  parser->AddInputImage(false); //Optionnal parameter
+
+  typedef otb::CommandLineArgumentParseResult ParserResultType;
+  ParserResultType::Pointer  parseResult = ParserResultType::New();
+
   try
   {
-    typedef double PixelType;
-    typedef otb::ImageViewerManager<PixelType> ManagerType;
-    ManagerType::Pointer manager = ManagerType::New();
-    manager->Show();
-    std::string strTest("--OTBTesting");
-    bool bFlRun(true);
-
-    for (int i = 1; i<argc;++i)
-    {
-      if ( strTest.compare(argv[i])==0 )
-      {
-        std::cout << "--OTBTesting option. No FL::run() call !" << std::endl;
-        bFlRun=false;
-      }
-      else
-      {
-        manager->OpenImage(argv[i]);
-        Fl::check();
-      }
-    }
-    if ( bFlRun==true) return Fl::run();
+    parser->ParseCommandLine(argc,argv,parseResult);
   }
   catch ( itk::ExceptionObject & err )
   {
-    std::cout << "Following otbException catch :" << std::endl;
-    std::cout << err << std::endl;
-    return EXIT_FAILURE;
-  }
-  catch ( std::bad_alloc & err )
-  {
-    std::cout << "Exception bad_alloc : "<<(char*)err.what()<< std::endl;
-    return EXIT_FAILURE;
-  }
-  catch ( ... )
-  {
-    std::cout << "Unknown Exception found !" << std::endl;
+    std::string descriptionException = err.GetDescription();
+    if (descriptionException.find("ParseCommandLine(): Help Parser") != std::string::npos)
+    {
+      std::cout << "WARNING : output file pixels are converted in 'unsigned char'" << std::endl;
+      return EXIT_SUCCESS;
+    }
+    if (descriptionException.find("ParseCommandLine(): Version Parser") != std::string::npos)
+    {
+      return EXIT_SUCCESS;
+    }
     return EXIT_FAILURE;
   }
-  return EXIT_SUCCESS;
+  
+  typedef otb::ImageViewerManagerController ControllerType;
+  typedef otb::ImageViewerManagerViewGUI ViewType;
+
+  ControllerType::Pointer controller = ControllerType::New();
+  ViewType::Pointer view = ViewType::New();
+  controller->SetView(view);
+  view->SetImageViewerManagerController(controller);
+  //otb::MsgReporter::GetInstance()->SetTitle("Image Viewer Manager application");
+  
+  //
+  view->Show();
+
+  if ( parseResult->IsOptionInputImagePresent() )
+    view->GetImageViewerManagerController()->OpenInputImage(parseResult->GetInputImage().c_str());
+
+  Fl::check();
+
+  otbGenericMsgDebugMacro(<<"Running GUI ...");
+  Fl::run();
+
 }