diff --git a/ViewerManager/Model/otbImageViewerManagerModel.cxx b/ViewerManager/Model/otbImageViewerManagerModel.cxx
index 59cbc07509e681b6d05c524ed3e57f2d01f10ba9..500f8a8dde6b5b1de619983f1f6b0f343fe822e6 100644
--- a/ViewerManager/Model/otbImageViewerManagerModel.cxx
+++ b/ViewerManager/Model/otbImageViewerManagerModel.cxx
@@ -69,18 +69,18 @@ ImageViewerManagerModel
   ReaderPointerType  reader = ReaderType::New();
   reader->SetFileName(filename);
   reader->GenerateOutputInformation();
-      
+
   /** Generate the layer*/
   LayerGeneratorPointerType visuGenerator = LayerGeneratorType::New();
   visuGenerator->SetImage(reader->GetOutput());
   FltkFilterWatcher qlwatcher(visuGenerator->GetResampler(),0,0,200,20,"Generating QuickLook ...");
   visuGenerator->GenerateLayer();
   StandardRenderingFunctionType::Pointer  rendrerFuntion  = visuGenerator->GetDefaultRenderingFunction();
-    
+
   /** Rendering image*/
   VisuModelPointerType rendering = VisuModelType::New();
   rendering->AddLayer(visuGenerator->GetLayer());
- 
+
   rendering->Update();
 
   /** View*/
@@ -91,13 +91,13 @@ ImageViewerManagerModel
   PixelDescriptionModelPointerType pixelModel = PixelDescriptionModelType::New();
   pixelModel->SetLayers(rendering->GetLayers());
   pixelView->SetModel(pixelModel);
-  
+
   /** Controller*/
   WidgetControllerPointerType controller = this->BuiltController(rendering, visuView ,pixelModel );
 
   /** Finish Builting the visu*/
   visuView->SetController(controller);
-    
+
   /** Build the curve Widget */
   CurvesWidgetType::Pointer   curveWidget = CurvesWidgetType::New();
 
@@ -117,11 +117,11 @@ ImageViewerManagerModel
 
   /** Add the the struct in the list*/
   m_ObjectTrackedList.push_back(currentComponent);
-  
+
   m_HasImageOpened = true;
   this->NotifyAll();
   m_HasImageOpened = false;
-  
+
 }
 
 /**
@@ -134,7 +134,7 @@ ImageViewerManagerModel
 {
   VisuViewPointerType visuView = VisuViewType::New();
   visuView->SetModel(pRendering);
-  
+
   return visuView;
 }
 
@@ -147,13 +147,13 @@ ImageViewerManagerModel
 ::BuiltController(VisuModelPointerType modelRenderingLayer, VisuViewPointerType visuView, PixelDescriptionModelPointerType pixelModel)
 {
   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);
@@ -177,7 +177,13 @@ ImageViewerManagerModel
   pixelActionHandler->SetView(visuView);
   pixelActionHandler->SetModel(pixelModel);
   controller->AddActionHandler(pixelActionHandler);
-  
+
+  // Add the action handler for the arrow key
+  ArrowKeyMoveActionHandlerType::Pointer arrowKeyMoveHandler = ArrowKeyMoveActionHandlerType::New();
+  arrowKeyMoveHandler->SetModel(modelRenderingLayer);
+  arrowKeyMoveHandler->SetView(visuView);
+  controller->AddActionHandler(arrowKeyMoveHandler);
+
   return controller;
 }
 
@@ -196,11 +202,11 @@ ImageViewerManagerModel
   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();
@@ -213,11 +219,11 @@ ImageViewerManagerModel
 {
   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();
@@ -232,11 +238,11 @@ ImageViewerManagerModel
   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();
@@ -252,11 +258,11 @@ ImageViewerManagerModel
   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();
@@ -274,7 +280,7 @@ ImageViewerManagerModel
   //Create A null offset
   OffsetType nullOffset;
   nullOffset.Fill(0);
-  
+
   //Get the controllers of the selected images
   WidgetControllerPointerType rightController = m_ObjectTrackedList.at(rightChoice-1).pWidgetController;
   WidgetControllerPointerType leftController = m_ObjectTrackedList.at(leftChoice-1).pWidgetController;
@@ -282,15 +288,15 @@ ImageViewerManagerModel
   //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  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);
@@ -299,10 +305,10 @@ ImageViewerManagerModel
   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);
@@ -313,10 +319,10 @@ ImageViewerManagerModel
   leftChangeScaledHandler->SetModel(leftRenderModel);
   leftChangeScaledHandler->SetView(pRightVisuView);
   leftChangeScaledHandler->SetOffset(offset);
-  
+
   rightController->AddActionHandler(leftChangeScaledHandler);
   leftController->AddActionHandler( rightChangeScaledHandler);
-  
+
   // Add the change extract region handler--
   ChangeRegionHandlerType::Pointer rightChangeHandler =ChangeRegionHandlerType::New();
   rightChangeHandler->SetModel(rightRenderModel);
@@ -327,7 +333,7 @@ ImageViewerManagerModel
   leftChangeHandler->SetModel(leftRenderModel);
   leftChangeHandler->SetView(pRightVisuView);
   leftChangeHandler->SetOffset(offset);
-  
+
   rightController->AddActionHandler( leftChangeHandler);
   leftController->AddActionHandler(rightChangeHandler);
 
@@ -369,7 +375,7 @@ ImageViewerManagerModel
   VisuModelPointerType  render = m_ObjectTrackedList.at(selectedItem-1).pRendering;
   VisuViewPointerType   view   = m_ObjectTrackedList.at(selectedItem-1).pVisuView;
   PixelDescriptionModelPointerType pixelModel = m_ObjectTrackedList.at(selectedItem-1).pPixelModel;
-  
+
   m_ObjectTrackedList.at(selectedItem-1).pWidgetController = this->BuiltController(render,view,pixelModel);
   m_ObjectTrackedList.at(selectedItem-1).pVisuView->SetController(m_ObjectTrackedList.at(selectedItem-1).pWidgetController);
 }
diff --git a/ViewerManager/Model/otbImageViewerManagerModel.h b/ViewerManager/Model/otbImageViewerManagerModel.h
index ff4f1027754053728f1e46980d99a897cfb66869..e392eb348e96022203440ba30ca641faecf23963 100644
--- a/ViewerManager/Model/otbImageViewerManagerModel.h
+++ b/ViewerManager/Model/otbImageViewerManagerModel.h
@@ -35,6 +35,7 @@ PURPOSE.  See the above copyright notices for more information.
 #include "otbChangeScaledExtractRegionActionHandler.h"
 #include "otbChangeExtractRegionActionHandler.h"
 #include "otbChangeScaleActionHandler.h"
+#include "otbArrowKeyMoveActionHandler.h"
 
 #include "otbModulusRenderingFunction.h"
 #include "otbPhaseRenderingFunction.h"
@@ -46,7 +47,7 @@ PURPOSE.  See the above copyright notices for more information.
 #include "otbCurves2DWidget.h"
 
 
-#include "otbImageView.h" 
+#include "otbImageView.h"
 #include "otbImageWidgetController.h"
 
 namespace otb
@@ -73,54 +74,55 @@ public:
 
   /** Images typedefs */
   typedef double                                                          PixelType;
-  
+
   /**  Image Type*/
   typedef VectorImage<PixelType , 2>                                                ImageType;
-  typedef itk::RGBPixel<unsigned char>                                              RGBPixelType; 
+  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 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::OffsetType                                                    OffsetType;
   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::ArrowKeyMoveActionHandler<VisuModelType,VisuViewType>                  ArrowKeyMoveActionHandlerType;
+
   typedef otb::PixelDescriptionModel<ViewerImageType>                                 PixelDescriptionModelType;
   typedef PixelDescriptionModelType::Pointer                                          PixelDescriptionModelPointerType;
   typedef PixelDescriptionView<PixelDescriptionModelType>                             PixelDescriptionViewType;
   typedef otb::PixelDescriptionActionHandler<PixelDescriptionModelType,VisuViewType>  PixelDescriptionActionHandlerType;
 
   typedef Curves2DWidget                                                              CurvesWidgetType;
-  
-  /** 
+
+  /**
    * Struct embedded in the model
    */
   struct _ObjectsTracked
@@ -136,11 +138,11 @@ public:
     CurvesWidgetType::Pointer              pCurveWidget;
     std::string                            fileName;
   };
-  
+
   typedef struct _ObjectsTracked                                          ObjectsTracked;
 
-  /** 
-   * List of objectTracked, we cannot use ObjectList 
+  /**
+   * List of objectTracked, we cannot use ObjectList
    * for struct cause don't implenement Register method
    */
   typedef std::vector<ObjectsTracked>                                    ObjectTrackedList;
@@ -156,13 +158,13 @@ public:
   virtual void UpdatePhaseChannelOrder(int realChoice , int imChoice,unsigned int selectedItem );
   virtual void Link(unsigned int leftChoice, unsigned int rightChoice, OffsetType offset);
   virtual void InitializeImageViewController(unsigned int selectedItem);
-  
+
   /** Method needed to Get the list of componenets stored*/
    ObjectTrackedList GetObjectList()
     {
       return m_ObjectTrackedList;
     }
-      
+
    /** Boolean Flags */
    itkGetMacro(HasImageOpened,bool);
    itkGetMacro(HasChangedChannelOrder,bool);
@@ -173,25 +175,25 @@ protected:
 
   /** Constructor */
   ImageViewerManagerModel();
-  
+
   /** Destructor */
   virtual ~ImageViewerManagerModel();
 
   /** Built Visu & Controller*/
   virtual VisuViewPointerType BuiltVisu(VisuModelPointerType pRendering);
   virtual WidgetControllerPointerType BuiltController(VisuModelPointerType modelRenderingLayer, VisuViewPointerType visuView , PixelDescriptionModelType::Pointer pixelModel);
-  
-    
+
+
 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;
-  
+
   /** Boolean flags*/
   bool   m_HasImageOpened;
   bool   m_HasChangedChannelOrder;