diff --git a/Code/Visualization/otbHistogramCurve.txx b/Code/Visualization/otbHistogramCurve.txx
index 30c4f1e06329f09475b05d12766a81064b684950..cadc3190181da00215bd52b222c67e9fa06ae6fe 100644
--- a/Code/Visualization/otbHistogramCurve.txx
+++ b/Code/Visualization/otbHistogramCurve.txx
@@ -154,7 +154,7 @@ HistogramCurve<THistogram>
     }
   mean/=nbSamples;
   squaremean/=nbSamples;
-  m_Maximum[1] = mean + vcl_sqrt(squaremean - mean*mean); 
+  m_Maximum[1] = mean + 6*vcl_sqrt(squaremean - mean*mean); 
   m_BinWidth = (last-first)/(nbSamples);
 }
 
diff --git a/Code/Visualization/otbImageLayerGenerator.h b/Code/Visualization/otbImageLayerGenerator.h
index d2a83b5bef219b1dad2b9ab2dc598d679998c659..814a66140098e9b74011ba1ec8747ae55284d419 100644
--- a/Code/Visualization/otbImageLayerGenerator.h
+++ b/Code/Visualization/otbImageLayerGenerator.h
@@ -74,6 +74,10 @@ public:
   <ImageType,ImageType>                        ResampleFilterType;
   typedef typename ResampleFilterType::Pointer ResampleFilterPointerType;
   
+  /** Rendering function typedef */
+  typedef typename ImageLayerType::DefaultRenderingFunctionType RenderingFunctionType;
+  typedef typename RenderingFunctionType::Pointer RenderingFunctionPointerType;
+
   /** Get the generated layer */
   itkGetObjectMacro(Layer,ImageLayerType);
 
@@ -108,6 +112,9 @@ public:
   itkSetMacro(ScreenRatio,double);
   itkGetMacro(ScreenRatio,double);
 
+  /** Get the generated default rendering function */
+  itkGetObjectMacro(DefaultRenderingFunction,RenderingFunctionType);
+
 protected:
   /** Constructor */
   ImageLayerGenerator();
@@ -131,6 +138,9 @@ private:
   /** The generated image layer */
   ImageLayerPointerType m_Layer;
 
+  /** The default rendering function */
+  RenderingFunctionPointerType m_DefaultRenderingFunction;
+
   /** The input image */
   ImagePointerType      m_Image;
 
diff --git a/Code/Visualization/otbImageLayerGenerator.txx b/Code/Visualization/otbImageLayerGenerator.txx
index 6f89f92ccb576b6a977420d4b971e30955a70cf6..b0461d50f05ba61ee6751cae472edcd486e19f4e 100644
--- a/Code/Visualization/otbImageLayerGenerator.txx
+++ b/Code/Visualization/otbImageLayerGenerator.txx
@@ -27,7 +27,7 @@ namespace otb
 
 template < class TImageLayer >
 ImageLayerGenerator<TImageLayer>
-::ImageLayerGenerator() : m_Layer(), m_Image(), m_Quicklook(),
+::ImageLayerGenerator() : m_Layer(), m_DefaultRenderingFunction(), m_Image(), m_Quicklook(),
                           m_SubsamplingRate(1), m_GenerateQuicklook(true), 
                           m_Resampler(), m_ScreenRatio(0.25)
 {
@@ -35,6 +35,8 @@ ImageLayerGenerator<TImageLayer>
   m_Layer = ImageLayerType::New();
   // Resampler
   m_Resampler = ResampleFilterType::New();
+  // Rendering function
+  m_DefaultRenderingFunction = RenderingFunctionType::New();
 }
 
 template < class TImageLayer >
@@ -123,35 +125,31 @@ ImageLayerGenerator<TImageLayer>
   m_Layer->SetHasScaledExtract(true);
   m_Layer->VisibleOn();
 
-  // Set up rendering function
-  typedef typename ImageLayerType::DefaultRenderingFunctionType RenderingFunctionType;
-  typename RenderingFunctionType::Pointer rfunc = RenderingFunctionType::New();
-
   // Setup channels
   switch(m_Image->GetNumberOfComponentsPerPixel())
     {
     case 1:
     {
-    rfunc->SetAllChannels(0);
+    m_DefaultRenderingFunction->SetAllChannels(0);
     break;
     }
     case 2:
     {
-    rfunc->SetAllChannels(0);
+    m_DefaultRenderingFunction->SetAllChannels(0);
     }
     case 3:
     {
-    rfunc->SetRedChannelIndex(0);
-    rfunc->SetGreenChannelIndex(1);
-    rfunc->SetBlueChannelIndex(2);
+    m_DefaultRenderingFunction->SetRedChannelIndex(0);
+    m_DefaultRenderingFunction->SetGreenChannelIndex(1);
+    m_DefaultRenderingFunction->SetBlueChannelIndex(2);
     break;
     }
     case 4:
     {
     // Handle quickbird like channel order
-    rfunc->SetRedChannelIndex(2);
-    rfunc->SetGreenChannelIndex(1);
-    rfunc->SetBlueChannelIndex(0);
+    m_DefaultRenderingFunction->SetRedChannelIndex(2);
+    m_DefaultRenderingFunction->SetGreenChannelIndex(1);
+    m_DefaultRenderingFunction->SetBlueChannelIndex(0);
     break;
     }
     default:
@@ -162,7 +160,7 @@ ImageLayerGenerator<TImageLayer>
     }
 
   // Set the rendering function
-  m_Layer->SetRenderingFunction(rfunc);
+  m_Layer->SetRenderingFunction(m_DefaultRenderingFunction);
 }
 
 template < class TImageLayer >
diff --git a/Code/Visualization/otbStandardImageViewer.h b/Code/Visualization/otbStandardImageViewer.h
index 20f7ac4674c67dd75d9f7e4449d40ce06e568443..e13e1fc338c45c70fb39ce0c2e01617c71cdeb0c 100644
--- a/Code/Visualization/otbStandardImageViewer.h
+++ b/Code/Visualization/otbStandardImageViewer.h
@@ -34,6 +34,10 @@
 #include "otbPixelDescriptionModel.h"
 #include "otbPixelDescriptionActionHandler.h"
 #include "otbPixelDescriptionView.h"
+#include "otbStandardRenderingFunction.h"
+#include "otbVectorData.h"
+#include "otbVectorDataProjectionFilter.h"
+#include "otbVectorDataGlComponent.h"
 
 #include <Fl/Fl_Tile.H>
 #include <Fl/Fl_Group.H>
@@ -46,7 +50,7 @@ namespace otb
 *  
 */
 
-template <class TImage>  
+template <class TImage, class TVectorData = VectorData<double> >  
 class StandardImageViewer
   : public itk::Object
 {
@@ -66,6 +70,11 @@ public:
   /** Input image type */
   typedef TImage                                    ImageType;
   typedef typename ImageType::Pointer               ImagePointerType;
+  typedef typename ImageType::InternalPixelType     InternalPixelType;
+
+  /** VectorData typedef */
+  typedef TVectorData                               VectorDataType;
+  typedef typename VectorDataType::Pointer          VectorDataPointerType;
 
   /** Output image type */
   typedef itk::RGBPixel<unsigned char>              RGBPixelType;
@@ -108,6 +117,11 @@ public:
   typedef otb::ChangeScaleActionHandler
   <RenderingModelType,ViewType>                     ChangeScaleHandlerType;
 
+  /** Rendering function */
+  typedef typename ImageLayerGeneratorType::RenderingFunctionType StandardRenderingFunctionType;
+  typedef typename StandardRenderingFunctionType::Pointer StandardRenderingFunctionPointerType;
+
+
   /** Pixel description */
   typedef PixelDescriptionModel<OutputImageType>    PixelDescriptionModelType;
   typedef typename PixelDescriptionModelType::Pointer PixelDescriptionModelPointerType;
@@ -117,10 +131,27 @@ public:
     < PixelDescriptionModelType >                   PixelDescriptionViewType;
   typedef typename PixelDescriptionViewType::Pointer PixelDescriptionViewPointerType;
 
+  /** VectorData overlay */
+  typedef VectorDataProjectionFilter
+  <VectorDataType,VectorDataType>                    VectorDataProjectionFilterType;
+  typedef VectorDataGlComponent<VectorDataType>      VectorDataGlComponentType;
+
   /** Set/Get the image to render */
   itkSetObjectMacro(Image,ImageType);
   itkGetObjectMacro(Image,ImageType);
 
+  /** Set/Get the VectorData to render */
+  itkSetObjectMacro(VectorData,VectorDataType);
+  itkGetObjectMacro(VectorData,VectorDataType);
+
+  /** Set/Get the DEM directory */
+  itkSetStringMacro(DEMDirectory);
+  itkGetStringMacro(DEMDirectory);
+
+  /** Set/Get the Label */
+  itkSetStringMacro(Label);
+  itkGetStringMacro(Label);
+
   /** Update and show the widget (you should call Fl::run() to hold to
    * display */
   void Update();
@@ -137,9 +168,15 @@ private:
   StandardImageViewer(const Self&);     // purposely not implemented
   void operator=(const Self&); // purposely not implemented
 
+  /** Label of the viewer */
+  std::string m_Label;
+
   /** Pointer to the image */
   ImagePointerType            m_Image;
   
+  /** Pointer to the VectorData */
+  VectorDataPointerType       m_VectorData;
+
   /** The image layer */
   ImageLayerPointerType       m_ImageLayer;
 
@@ -161,6 +198,12 @@ private:
   /** The widget controller */
   WidgetControllerPointerType m_Controller;
 
+  /** StandardRenderingFunction */
+  StandardRenderingFunctionPointerType m_RenderingFunction;
+
+  /** Path to the DEMDirectory (used if a VectorData is rendered */
+  std::string m_DEMDirectory;
+
   /** The window */
   Fl_Window * m_Window;
 
diff --git a/Code/Visualization/otbStandardImageViewer.txx b/Code/Visualization/otbStandardImageViewer.txx
index b260cb68a874f37342b5dd9765c94a0ce432435d..c1638f104203116c491a247e66b7360ada87f8d8 100644
--- a/Code/Visualization/otbStandardImageViewer.txx
+++ b/Code/Visualization/otbStandardImageViewer.txx
@@ -23,9 +23,10 @@
 namespace otb
 {
 
-template <class TImage>  
-StandardImageViewer<TImage>
-::StandardImageViewer() : m_Image(), m_ImageLayer(), m_RenderingModel(),m_PixelDescriptionModel(), m_View(), m_PixelDescriptionView(), m_CurveWidget(), m_Controller(), m_Window(),
+template <class TImage,class TVectorData>  
+StandardImageViewer<TImage,TVectorData>
+::StandardImageViewer() : m_Label("Default label"), m_Image(), m_VectorData(), m_ImageLayer(), m_RenderingModel(),m_PixelDescriptionModel(), 
+			  m_View(), m_PixelDescriptionView(), m_CurveWidget(), m_Controller(), m_RenderingFunction(), m_Window(),
 			  m_FullGroup(),m_SideGroup(),m_Tile(),m_Width(800),m_Height(600), m_SideBarWidth(200)
 {
   // Build a new rendering model
@@ -48,7 +49,7 @@ StandardImageViewer<TImage>
   m_View->SetController(m_Controller);
   m_PixelDescriptionView->SetModel(m_PixelDescriptionModel);
 
-   // Add the resizing handler
+  // Add the resizing handler
   ResizingHandlerType::Pointer resizingHandler = ResizingHandlerType::New();
   resizingHandler->SetModel(m_RenderingModel);
   resizingHandler->SetView(m_View);
@@ -100,8 +101,8 @@ StandardImageViewer<TImage>
   m_PixelDescriptionView->GetPixelDescriptionWidget()->resize(m_Width-m_SideBarWidth,3*m_Height/4,m_SideBarWidth,m_Height/4);
 }
 
-template <class TImage>  
-StandardImageViewer<TImage>
+template <class TImage,class TVectorData>  
+StandardImageViewer<TImage,TVectorData>
 ::~StandardImageViewer()
 {
   m_Tile->remove(m_View->GetScrollWidget());
@@ -112,38 +113,67 @@ StandardImageViewer<TImage>
   delete m_Window;
 }
 
-template <class TImage>  
+template <class TImage,class TVectorData>  
 void
-StandardImageViewer<TImage>
+StandardImageViewer<TImage,TVectorData>
 ::Update()
 {
+  // First check if there is actually an input image
   if(m_Image.IsNull())
     {
     itkExceptionMacro(<<"The image pointer is null, there is nothing to display. You probably forget to set the image.");
     }
 
-  // TODO: Add a real label here
-  m_Window->label("The label");
+  // Update image info for further use
+  m_Image->UpdateOutputInformation();
+  
+  // If there is a VectorData
+  if(m_VectorData.IsNotNull())
+    {
+    // Reproject VectorData in image projection
+     typename VectorDataProjectionFilterType::Pointer vproj = VectorDataProjectionFilterType::New();
+     vproj->SetInput(m_VectorData);
+     vproj->SetOutputKeywordList(m_Image->GetImageKeywordlist());
+     vproj->SetOutputOrigin(m_Image->GetOrigin());
+     vproj->SetOutputSpacing(m_Image->GetSpacing());
+     vproj->SetDEMDirectory(m_DEMDirectory);
+     vproj->Update();
+     
+     // Create a VectorData gl component
+     typename VectorDataGlComponentType::Pointer vgl = VectorDataGlComponentType::New();
+     vgl->SetVectorData(vproj->GetOutput());
+
+     // Add it to the image view
+      m_View->GetScrollWidget()->AddGlComponent(vgl);
+      m_View->GetFullWidget()->AddGlComponent(vgl);
+      m_View->GetZoomWidget()->AddGlComponent(vgl);
+    }
 
   // Generate the layer
  ImageLayerGeneratorPointerType generator = ImageLayerGeneratorType::New();
   generator->SetImage(m_Image);
   generator->GenerateLayer();
-  
   m_ImageLayer = generator->GetLayer();
+  m_RenderingFunction = generator->GetDefaultRenderingFunction();
 
+  // Set the window and layer label
+  m_Window->label(m_Label.c_str());
+  m_ImageLayer->SetName(m_Label);
+
+  // Add the generated layer to the rendering model
   m_RenderingModel->AddLayer(generator->GetLayer());
 
+  // Show everything
   m_Window->show();
-
   m_View->GetScrollWidget()->show();
   m_View->GetFullWidget()->show();
   m_View->GetZoomWidget()->show();
   m_CurveWidget->show();
   
+  // Update the rendering model
   m_RenderingModel->Update();
 
-  // adding histograms
+  // adding histograms rendering
   typename HistogramCurveType::ColorType red,green,blue, gray;
   red.Fill(0);
   red[0]=1.;
@@ -160,17 +190,17 @@ StandardImageViewer<TImage>
   gray.Fill(0.5);
 
   typename HistogramCurveType::Pointer rhistogram = HistogramCurveType::New();
-  rhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(0));
+  rhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(m_RenderingFunction->GetRedChannelIndex()));
   rhistogram->SetHistogramColor(red);
   rhistogram->SetLabelColor(red);
   
   typename HistogramCurveType::Pointer ghistogram = HistogramCurveType::New();
-  ghistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(1));
+  ghistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(m_RenderingFunction->GetGreenChannelIndex()));
   ghistogram->SetHistogramColor(green);
   ghistogram->SetLabelColor(green);
 
   typename HistogramCurveType::Pointer bhistogram = HistogramCurveType::New();
-  bhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(2));
+  bhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(m_RenderingFunction->GetBlueChannelIndex()));
   bhistogram->SetHistogramColor(blue);
   bhistogram->SetLabelColor(blue);
   m_CurveWidget->AddCurve(rhistogram);
@@ -178,8 +208,6 @@ StandardImageViewer<TImage>
   m_CurveWidget->AddCurve(bhistogram);
   m_CurveWidget->SetXAxisLabel("Pixels");
   m_CurveWidget->SetYAxisLabel("Amount");
-
-
 }
 }
 #endif
diff --git a/Testing/Code/Visualization/otbStandardImageViewer.cxx b/Testing/Code/Visualization/otbStandardImageViewer.cxx
index 62b29154c748153471ed6b182d33003b3625a3ce..c3ef6d4ea12c306b759bf44c0c0cf968036fa375 100644
--- a/Testing/Code/Visualization/otbStandardImageViewer.cxx
+++ b/Testing/Code/Visualization/otbStandardImageViewer.cxx
@@ -18,6 +18,9 @@ PURPOSE.  See the above copyright notices for more information.
 #include "otbStandardImageViewer.h"
 #include "otbVectorImage.h"
 #include "otbImageFileReader.h"
+#include "otbVectorData.h"
+#include "otbVectorDataFileReader.h"
+
 
 int otbStandardImageViewer( int argc, char * argv[] )
 {
@@ -26,13 +29,32 @@ int otbStandardImageViewer( int argc, char * argv[] )
   typedef otb::VectorImage<double,2> ImageType;
   typedef otb::ImageFileReader<ImageType> ReaderType;
   typedef otb::StandardImageViewer<ImageType> ViewerType;
+  typedef otb::VectorData<double>             VectorDataType;
+  typedef otb::VectorDataFileReader<VectorDataType> VectorDataFileReaderType;
 
+  VectorDataFileReaderType::Pointer vreader = VectorDataFileReaderType::New();
   ReaderType::Pointer reader = ReaderType::New();
   ViewerType::Pointer viewer = ViewerType::New();
+  VectorDataFileReaderType::Pointer vdreader = VectorDataFileReaderType::New();
 
   reader->SetFileName(argv[1]);
-
   viewer->SetImage(reader->GetOutput());
+
+  if(argc>3)
+    {
+    std::cout<<"Adding a vector layer from file "<<argv[3]<<std::endl;
+    vdreader->SetFileName(argv[3]);
+    viewer->SetVectorData(vdreader->GetOutput());
+    }
+
+  if(argc>4)
+    {
+    std::cout<<"Reprojecting using DEM "<<argv[4]<<std::endl;
+    viewer->SetDEMDirectory(argv[4]);
+    }
+
+  viewer->SetLabel("Testing standard viewer");
+
   viewer->Update();
   
   if(run)