diff --git a/Code/Visualization/otbImageLayerRenderingModel.h b/Code/Visualization/otbImageLayerRenderingModel.h
index cb040493996a70c9d99ff372f4df0010f071d3c1..b9a7dfb5905ad31c27227a83fd7e4bf7a47705c4 100644
--- a/Code/Visualization/otbImageLayerRenderingModel.h
+++ b/Code/Visualization/otbImageLayerRenderingModel.h
@@ -18,12 +18,13 @@
 #ifndef __otbImageLayerRenderingModel_h
 #define __otbImageLayerRenderingModel_h
 
-#include "otbMVCModelBase.h"
+#include "otbMVCModel.h"
 #include "otbLayerBasedModel.h"
 #include "otbImageLayerBase.h"
 #include "otbObjectList.h"
 #include "otbImageLayerRenderingModelListener.h"
 #include "otbBlendingImageFilter.h"
+#include "otbListenerBase.h"
 
 namespace otb
 {
@@ -43,7 +44,7 @@ namespace otb
 template <class TOutputImage = otb::Image<itk::RGBAPixel<unsigned char>,2 >,
           class TLayer = otb::ImageLayerBase<TOutputImage>  >
 class ImageLayerRenderingModel
-  : public MVCModelBase<ImageLayerRenderingModelListener>, public LayerBasedModel< TLayer >
+  : public MVCModel<ListenerBase>, public LayerBasedModel< TLayer >
 {
 public:
   /** Standard class typedefs */
@@ -74,7 +75,8 @@ public:
   typedef typename LayerListType::ConstIterator LayerIteratorType;
 
   /** Listener typedef */
-  typedef ImageLayerRenderingModelListener          ListenerType;
+//  typedef ImageLayerRenderingModelListener          ListenerType;
+  typedef ListenerBase ListenerType;
 
   /** Blending filter typedef */
   typedef otb::BlendingImageFilter<OutputImageType> BlendingFilterType;
@@ -109,46 +111,46 @@ public:
 
   /** Update will render all visible layers, rasterize all visible
    * layers and notify all listeners. */
-  void Update(void);
+  virtual void Update(void);
 
   /** Change the Scaled extract region by giving the center of the
    * region */
-  void SetScaledExtractRegionCenter(const IndexType & index);
+  virtual void SetScaledExtractRegionCenter(const IndexType & index);
 
   /** Change the extract region by giving the center of the
    * region */
-  void SetExtractRegionCenter(const IndexType & index);
+  virtual void SetExtractRegionCenter(const IndexType & index);
 
   /** Change the extract region by giving the 2 points of the
    * region */
-  void SetExtractRegionByIndex(const IndexType & startIndex, const IndexType & stopIndex );
+  virtual void SetExtractRegionByIndex(const IndexType & startIndex, const IndexType & stopIndex );
 
   /** Get the sumbsampling rate */
-  unsigned int GetSubsamplingRate();
+  virtual unsigned int GetSubsamplingRate();
 
   /** Filters Initialisation. */
-  void Init();
+  virtual void Init();
 
 protected:
   /** Constructor */
   ImageLayerRenderingModel();
   /** Destructor */
-  ~ImageLayerRenderingModel();
+  virtual ~ImageLayerRenderingModel();
 
   /** Printself method */
-  void          PrintSelf(std::ostream& os, itk::Indent indent) const;
+  virtual void          PrintSelf(std::ostream& os, itk::Indent indent) const;
 
   /** Renders all visible layers */
-   void         RenderVisibleLayers(void);
+  virtual void         RenderVisibleLayers(void);
 
   /** Rasterize visible layers */
-   void         RasterizeVisibleLayers(void);
+  virtual void         RasterizeVisibleLayers(void);
 
   /** Notify a registered listener */
-   void         Notify(ListenerType * listener);
+  virtual  void         Notify(ListenerType * listener);
 
   /** Constrains the given region to the largest possible one. */
-  RegionType    ConstrainRegion(const RegionType & region, const RegionType & largest);
+  virtual RegionType    ConstrainRegion(const RegionType & region, const RegionType & largest);
 
 private:
   ImageLayerRenderingModel(const Self&);     // purposely not implemented
diff --git a/Code/Visualization/otbImageLayerRenderingModel.txx b/Code/Visualization/otbImageLayerRenderingModel.txx
index f00ff1103f5553e662162604bdfd3397d00c37b6..29933ed0fb3bc4837032d84f6268ee9f0369b004 100644
--- a/Code/Visualization/otbImageLayerRenderingModel.txx
+++ b/Code/Visualization/otbImageLayerRenderingModel.txx
@@ -247,7 +247,7 @@ ImageLayerRenderingModel<TOutputImage, TLayer>
 {
   // Notify the listener
   otbMsgDevMacro(<<"ImageLayerRenderingModel::Notify(): Notifying listener");
-  listener->ImageLayerRenderingModelNotify();
+  listener->Notify();
 }
 
 
diff --git a/Code/Visualization/otbImageLayerRenderingModelListener.h b/Code/Visualization/otbImageLayerRenderingModelListener.h
index ccdbb1ee563e7ef2ff3676ee91f5bfc364bcc30d..8a366574ec2ae98748496d0369489cea7a44c362 100644
--- a/Code/Visualization/otbImageLayerRenderingModelListener.h
+++ b/Code/Visualization/otbImageLayerRenderingModelListener.h
@@ -35,7 +35,7 @@ public:
   typedef ImageLayerRenderingModelListener Self;
 
   // Update the display
-  virtual void ImageLayerRenderingModelNotify() = 0;
+  virtual void Notify() = 0;
 
 protected:
   /** Constructor */
diff --git a/Code/Visualization/otbImageView.h b/Code/Visualization/otbImageView.h
index ae5abf511d820a1fd5dcb345d554a32916c17634..05d12e5e148388d4a0de8c116deef3f22278aff3 100644
--- a/Code/Visualization/otbImageView.h
+++ b/Code/Visualization/otbImageView.h
@@ -19,7 +19,8 @@
 #define __otbImageView_h
 
 #include "otbImageWidget.h"
-#include "otbImageLayerRenderingModelListener.h"
+// #include "otbImageLayerRenderingModelListener.h"
+#include "otbListenerBase.h"
 #include "otbImageWidgetController.h"
 #include "otbRegionGlComponent.h"
 
@@ -34,7 +35,7 @@ namespace otb
 
 template <class TViewerModel >
 class ImageView
-  : public ImageLayerRenderingModelListener, public itk::Object
+  : public ListenerBase, public itk::Object
 {
 public:
   /** Standard class typedefs */
@@ -121,7 +122,7 @@ public:
   void UpdateZoomWidget();
 
   /** Handle notification from the viewer */
-  virtual void ImageLayerRenderingModelNotify();
+  virtual void Notify();
 
 private:
   ImageView(const Self&);      // purposely not implemented
diff --git a/Code/Visualization/otbImageView.txx b/Code/Visualization/otbImageView.txx
index 511c294df5a3d3f6361eaec617260ba218b89e41..b0ef1beaee2d4732d57046ce1bd04619a3d6efa0 100644
--- a/Code/Visualization/otbImageView.txx
+++ b/Code/Visualization/otbImageView.txx
@@ -93,7 +93,7 @@ ImageView<TViewerModel>
 template < class TViewerModel >
 void
 ImageView<TViewerModel>
-::ImageLayerRenderingModelNotify()
+::Notify()
 {
   this->Update();
 }
diff --git a/Code/Visualization/otbMVCModelBase.h b/Code/Visualization/otbMVCModel.h
similarity index 73%
rename from Code/Visualization/otbMVCModelBase.h
rename to Code/Visualization/otbMVCModel.h
index 4d3a586ff1ad238140c04e63087cf859a8b21a8f..2014766ff875d6b8e7dd8ec91e4d0c36226531ed 100644
--- a/Code/Visualization/otbMVCModelBase.h
+++ b/Code/Visualization/otbMVCModel.h
@@ -15,24 +15,31 @@ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 PURPOSE.  See the above copyright notices for more information.
 
 =========================================================================*/
-#ifndef __otbMVCModelBase_h
-#define __otbMVCModelBase_h
+#ifndef __otbMVCModel_h
+#define __otbMVCModel_h
 
 #include <set>
+#include "itkObject.h"
+#include "itkObjectFactory.h"
 
 namespace otb
 {
-/** \class MVCModelBase
- * \brief Interface class for MVC based modelling.
- *  Implements the registration and
+/** \class MVCModel
+ *
+ * Base class for MVC based modelling. Implements the registration and
  * Unregistration of listeners, as well as the NotifyAll method. A valid listener must
  * implement a Notify() method.
- *  \ingroup Visualization
  */
 template <class TListener>
-class MVCModelBase
+class MVCModel
 {
 public:
+  /** Standard class typedefs */
+  typedef MVCModel    Self;
+  typedef itk::Object Superclass;
+  typedef itk::SmartPointer<Self> Pointer;
+  typedef itk::SmartPointer<const Self> ConstPointer;
+
   // Define the listener type
   typedef TListener ListenerType;
 
@@ -68,15 +75,22 @@ public:
   }
 
   /** Notify changes to a given listerner */
-  virtual void Notify(ListenerType * listener) {};
+  virtual void Notify(ListenerType * listener)
+  {
+     listener->Notify();
+  };
 
 protected:
   /** Constructor */
-  MVCModelBase() {}
+  MVCModel() {}
   /** Destructor */
-  virtual ~MVCModelBase() {}
+  virtual ~MVCModel() {}
 
 private:
+  MVCModel(const Self&); //purposely not implemented
+  void operator=(const Self&); //purposely not implemented
+
+
   /** Registered liteners */
   ListenersSetType m_RegisteredListeners;
 };
diff --git a/Code/Visualization/otbPixelDescriptionModel.h b/Code/Visualization/otbPixelDescriptionModel.h
index 87b9412b4d8c3f45cb5749023fd9c42076071d3e..7e825368a9b9b6af29612162ca18a52c80e27789 100644
--- a/Code/Visualization/otbPixelDescriptionModel.h
+++ b/Code/Visualization/otbPixelDescriptionModel.h
@@ -18,7 +18,7 @@
 #ifndef __otbPixelDescriptionModel_h
 #define __otbPixelDescriptionModel_h
 
-#include "otbMVCModelBase.h"
+#include "otbMVCModel.h"
 #include "otbLayerBasedModel.h"
 #include "otbPixelDescriptionModelListener.h"
 #include "otbImageLayerBase.h"
@@ -35,7 +35,7 @@ namespace otb
 
 template <class TOutputImage >
 class PixelDescriptionModel
-  : public MVCModelBase<PixelDescriptionModelListener>, public LayerBasedModel< ImageLayerBase< TOutputImage > >
+  : public MVCModel<PixelDescriptionModelListener>, public LayerBasedModel< ImageLayerBase< TOutputImage > >
 {
 public:
   /** Standard class typedefs */
diff --git a/Code/Visualization/otbPixelDescriptionModel.txx b/Code/Visualization/otbPixelDescriptionModel.txx
index ac20aecec746c8050d428582fc897fd288bca124..932c7768d685598814e08367b6ae8236d49e673d 100644
--- a/Code/Visualization/otbPixelDescriptionModel.txx
+++ b/Code/Visualization/otbPixelDescriptionModel.txx
@@ -81,7 +81,7 @@ void
 PixelDescriptionModel<TOutputImage>
 ::Notify(ListenerType * listener)
 {
-  listener->PixelDescriptionModelNotify();
+  listener->Notify();
 }
 
 } // end namespace otb
diff --git a/Code/Visualization/otbPixelDescriptionModelListener.h b/Code/Visualization/otbPixelDescriptionModelListener.h
index 383412433c240a027253401b33979675585567f6..6bb2f2279d8d633fef3a4076eaeccf23c5b77fbb 100644
--- a/Code/Visualization/otbPixelDescriptionModelListener.h
+++ b/Code/Visualization/otbPixelDescriptionModelListener.h
@@ -34,7 +34,7 @@ public:
   typedef PixelDescriptionModelListener Self;
 
   // Update the display
-  virtual void PixelDescriptionModelNotify() = 0;
+  virtual void Notify() = 0;
 
 protected:
   /** Constructor */
diff --git a/Code/Visualization/otbPixelDescriptionView.h b/Code/Visualization/otbPixelDescriptionView.h
index 346ecd7c749ece8e166eb33b3c347077722e5c82..e9b3604c5c3612b5cba5d6e3d0d45df2f929837d 100644
--- a/Code/Visualization/otbPixelDescriptionView.h
+++ b/Code/Visualization/otbPixelDescriptionView.h
@@ -81,7 +81,7 @@ public:
   ~PixelDescriptionView();
 
   /** Handle notification from the viewer */
-  virtual void PixelDescriptionModelNotify();
+  virtual void Notify();
 
 private:
   PixelDescriptionView(const Self&);      // purposely not implemented
diff --git a/Code/Visualization/otbPixelDescriptionView.txx b/Code/Visualization/otbPixelDescriptionView.txx
index 5df637accf54c278fe4f5a031ad257cd50d15831..99642d6c41454e2a01ab7494b67902a4e41b9a21 100644
--- a/Code/Visualization/otbPixelDescriptionView.txx
+++ b/Code/Visualization/otbPixelDescriptionView.txx
@@ -65,7 +65,7 @@ PixelDescriptionView<TInputPixelDescription>
 template < class TInputPixelDescription >
 void
 PixelDescriptionView<TInputPixelDescription>
-::PixelDescriptionModelNotify()
+::Notify()
 {
   this->Update();
 }