diff --git a/ViewerManager/Controller/otbImageViewerManagerController.cxx b/ViewerManager/Controller/otbImageViewerManagerController.cxx
index 5c33f1fd51c12aa28813729b9ac8072c93fb03c7..d4131f375532f455b9c93c19d522845e6544c6ae 100644
--- a/ViewerManager/Controller/otbImageViewerManagerController.cxx
+++ b/ViewerManager/Controller/otbImageViewerManagerController.cxx
@@ -128,5 +128,19 @@ ImageViewerManagerController
     }
 }
 
+void
+ImageViewerManagerController
+::Link(unsigned int leftChoice, unsigned int rightChoice)
+{
+  try
+    {
+      m_Model->Link(leftChoice,rightChoice);
+    }
+  catch (itk::ExceptionObject & err)
+    {
+      MsgReporter::GetInstance()->SendError(err.GetDescription());
+    }
+}
+
 } // end namespace otb
 
diff --git a/ViewerManager/Controller/otbImageViewerManagerController.h b/ViewerManager/Controller/otbImageViewerManagerController.h
index 9a8c08d767f654abdac14f66c3e88e8dcabb1b06..1f31e15db829f12db599bdec22b6163e9ee690b9 100644
--- a/ViewerManager/Controller/otbImageViewerManagerController.h
+++ b/ViewerManager/Controller/otbImageViewerManagerController.h
@@ -106,7 +106,7 @@ public:
   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 Link(unsigned int leftChoice, unsigned int rightChoice);
 
   
   
diff --git a/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h b/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
index 9e31bba096be58518b856dfcc21d890ba7798e22..10de1fa83157056c13e2df7e5934747ac9bf515a 100644
--- a/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
+++ b/ViewerManager/Controller/otbImageViewerManagerControllerInterface.h
@@ -73,7 +73,7 @@ public:
   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; 
-
+  virtual void Link(unsigned int leftChoice, unsigned int rightChoice) = 0;
   /** NewVisu */
   virtual VisuControllerPointerType GetVisuController()=0;
   virtual VisuControllerPointerType GetPreviewVisuController() = 0;
diff --git a/ViewerManager/Model/otbImageViewerManagerModel.cxx b/ViewerManager/Model/otbImageViewerManagerModel.cxx
index b306ddd13dd9e2907596561b339cacdbc4a219ac..c75895b4a290ec442fc438e4308577b403479a1b 100644
--- a/ViewerManager/Model/otbImageViewerManagerModel.cxx
+++ b/ViewerManager/Model/otbImageViewerManagerModel.cxx
@@ -109,6 +109,7 @@ ImageViewerManagerModel
   currentComponent.pWidgetController = controller;
   currentComponent.pRenderFuntion  = rendrerFuntion;
   currentComponent.pPixelView   = pixelView;
+  currentComponent.pPixelModel  = pixelModel;
   currentComponent.pCurveWidget = curveWidget;
 
   /** Add the the struct in the list*/
@@ -258,6 +259,103 @@ ImageViewerManagerModel
   m_HasChangedChannelOrder = false;
 }
 
+/**
+ *
+ */
+void
+ImageViewerManagerModel
+::Link(unsigned int leftChoice, unsigned int rightChoice)
+{
+
+  //Get the controllers of the selected images
+  WidgetControllerPointerType rightController = m_ObjectTrackedList.at(rightChoice-1).pWidgetController;
+  WidgetControllerPointerType leftController = m_ObjectTrackedList.at(leftChoice-1).pWidgetController;
+
+  //Get the models related to the choosen images
+  VisuModelPointerType rightRenderModel       = m_ObjectTrackedList.at(rightChoice-1).pRendering;
+  VisuModelPointerType leftRenderModel       = m_ObjectTrackedList.at(leftChoice-1).pRendering;
+  
+  //Get the views related to the choosen images
+  VisuViewPointerType  pRightVisuView         = m_ObjectTrackedList.at(rightChoice-1).pVisuView;; 
+  VisuViewPointerType  pLeftVisuView          = m_ObjectTrackedList.at(leftChoice-1).pVisuView;
+
+  //Pixel View
+  PixelDescriptionModelPointerType rightPixelModel = m_ObjectTrackedList.at(rightChoice-1).pPixelModel;
+  PixelDescriptionModelPointerType leftPixelModel  = m_ObjectTrackedList.at(leftChoice-1).pPixelModel;
+    
+  // Add the resizing handler
+  ResizingHandlerType::Pointer rightResizingHandler = ResizingHandlerType::New();
+  rightResizingHandler->SetModel(rightRenderModel);
+  rightResizingHandler->SetView(pLeftVisuView);
+
+  ResizingHandlerType::Pointer leftResizingHandler = ResizingHandlerType::New();
+  leftResizingHandler->SetModel(leftRenderModel);
+  leftResizingHandler->SetView(pRightVisuView);
+  
+  rightController->AddActionHandler( leftResizingHandler);
+  leftController->AddActionHandler(rightResizingHandler);
+  
+  // Add the change scaled region handler
+  ChangeScaledRegionHandlerType::Pointer rightChangeScaledHandler =ChangeScaledRegionHandlerType::New();
+  rightChangeScaledHandler->SetModel(rightRenderModel);
+  rightChangeScaledHandler->SetView(pLeftVisuView);
+
+  ChangeScaledRegionHandlerType::Pointer leftChangeScaledHandler =ChangeScaledRegionHandlerType::New();
+  leftChangeScaledHandler->SetModel(leftRenderModel);
+  leftChangeScaledHandler->SetView(pRightVisuView);
+  
+  rightController->AddActionHandler(leftChangeScaledHandler);
+  leftController->AddActionHandler( rightChangeScaledHandler);
+  
+  // Add the change extract region handler
+  ChangeRegionHandlerType::Pointer rightChangeHandler =ChangeRegionHandlerType::New();
+  rightChangeHandler->SetModel(rightRenderModel);
+  rightChangeHandler->SetView(pLeftVisuView);
+    
+  ChangeRegionHandlerType::Pointer leftChangeHandler =ChangeRegionHandlerType::New();
+  leftChangeHandler->SetModel(leftRenderModel);
+  leftChangeHandler->SetView(pRightVisuView);
+  
+  rightController->AddActionHandler( leftChangeHandler);
+  leftController->AddActionHandler(rightChangeHandler);
+
+  // Add the change scaled handler
+  ChangeScaleHandlerType::Pointer rightChangeScaleHandler =ChangeScaleHandlerType::New();
+  rightChangeScaleHandler->SetModel(rightRenderModel );
+  rightChangeScaleHandler->SetView(pLeftVisuView);
+
+  ChangeScaleHandlerType::Pointer leftChangeScaleHandler =ChangeScaleHandlerType::New();
+  leftChangeScaleHandler->SetModel(leftRenderModel );
+  leftChangeScaleHandler->SetView(pRightVisuView);
+
+  rightController->AddActionHandler( leftChangeScaleHandler);
+  leftController->AddActionHandler(rightChangeScaleHandler);
+
+ //Pixel Description Handling
+  PixelDescriptionActionHandlerType::Pointer rightPixelActionHandler = PixelDescriptionActionHandlerType::New();
+  rightPixelActionHandler->SetView(pLeftVisuView );
+  rightPixelActionHandler->SetModel(rightPixelModel);
+  
+  PixelDescriptionActionHandlerType::Pointer leftPixelActionHandler = PixelDescriptionActionHandlerType::New();
+  leftPixelActionHandler->SetView(pRightVisuView);
+  leftPixelActionHandler->SetModel(leftPixelModel);
+
+  rightController->AddActionHandler(leftPixelActionHandler );
+  leftController->AddActionHandler(rightPixelActionHandler);
+
+}
+
+/**
+ *
+ */
+void
+ImageViewerManagerModel
+::AddLinkActionHandler(unsigned int choice)
+{
+  
+}
+
+
 
 }
 
diff --git a/ViewerManager/Model/otbImageViewerManagerModel.h b/ViewerManager/Model/otbImageViewerManagerModel.h
index 08c516c093895ce44f5ac12dbb4098c5a125b6a6..4fb3e307de007d451b210506ef3e1b86ef3477a3 100644
--- a/ViewerManager/Model/otbImageViewerManagerModel.h
+++ b/ViewerManager/Model/otbImageViewerManagerModel.h
@@ -131,7 +131,8 @@ public:
     VisuViewPointerType                    pVisuView;
     StandardRenderingFunctionType::Pointer pRenderFuntion;
     PixelDescriptionViewType::Pointer      pPixelView;
-    CurvesWidgetType::Pointer              pCurveWidget;      
+    PixelDescriptionModelPointerType       pPixelModel;
+    CurvesWidgetType::Pointer              pCurveWidget;
     std::string                            fileName;
   };
   
@@ -152,6 +153,8 @@ public:
   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 Link(unsigned int leftChoice, unsigned int rightChoice);
+  virtual void AddLinkActionHandler(unsigned int choice);
   
   /** Method needed to Get the list of componenets stored*/
    ObjectTrackedList GetObjectList()
@@ -162,7 +165,7 @@ public:
    /** Boolean Flags */
    itkGetMacro(HasImageOpened,bool);
    itkGetMacro(HasChangedChannelOrder,bool);
-   
+   itkGetMacro(HasNewLink,bool);
 
 protected:
   /** This is protected for the singleton. Use GetInstance() instead. */
@@ -192,6 +195,7 @@ private:
   /** Boolean flags*/
   bool   m_HasImageOpened;
   bool   m_HasChangedChannelOrder;
+  bool   m_HasNewLink;
 
   /** The manipuleted list*/
   ObjectTrackedList                          m_ObjectTrackedList;