diff --git a/modules/gui/pymod/data_viewer_proxy.cc b/modules/gui/pymod/data_viewer_proxy.cc
index 23551d1277bfa0319b54a562cb68029ffe8404b7..44c7de2174c7a913fc346c7878cb9f269640ec7b 100644
--- a/modules/gui/pymod/data_viewer_proxy.cc
+++ b/modules/gui/pymod/data_viewer_proxy.cc
@@ -30,8 +30,10 @@
 namespace ost { namespace img { namespace gui {
 
 DataViewerProxy::DataViewerProxy(DataViewer* v):
-  ost::gui::SipHandler<ost::img::gui::DataViewer>(v)
-{}
+  ost::gui::SipHandler<ost::img::gui::DataViewer>(v),
+  DataObserver(v->GetData())
+{
+}
 
 
 NormalizerPtr DataViewerProxy::GetNormalizer() const
@@ -58,6 +60,81 @@ Extent DataViewerProxy::GetSelection() const
 {
   return Me()->GetSelection();
 }
+void DataViewerProxy::SetSelection(const Extent& selection)
+{
+  Me()->SetSelection(selection);
+}
+
+void DataViewerProxy::SetSlab(int slab)
+{
+  Me()->SetSlab(slab);
+}
+
+int DataViewerProxy::GetSlab() const
+{
+  return Me()->GetSlab();
+}
+
+void DataViewerProxy::SetZoomScale(Real zoomscale)
+{
+  Me()->SetZoomScale(zoomscale);
+}
+
+Real DataViewerProxy::GetZoomScale() const
+{
+  return Me()->GetZoomScale();
+}
+
+void DataViewerProxy::SetViewerMin(Real min)
+{
+  Me()->SetViewerMin(min);
+}
+
+Real DataViewerProxy::GetViewerMin() const
+{
+  return Me()->GetViewerMin();
+}
+
+void DataViewerProxy::SetViewerMax(Real max)
+{
+  Me()->SetViewerMax(max);
+}
+
+Real DataViewerProxy::GetViewerMax() const
+{
+  return Me()->GetViewerMax();
+}
+
+void DataViewerProxy::SetGamma(Real gamma)
+{
+  Me()->SetGamma(gamma);
+}
+
+Real DataViewerProxy::GetGamma() const
+{
+  return Me()->GetGamma();
+}
+
+void DataViewerProxy::SetInvert(bool invert)
+{
+  Me()->SetInvert(invert);
+}
+
+bool DataViewerProxy::GetInvert() const
+{
+  return Me()->GetInvert();
+}
+
+void DataViewerProxy::SetOffset(const geom::Vec2& offset)
+{
+  Me()->SetOffset(offset);
+}
+
+geom::Vec2 DataViewerProxy::GetOffset() const
+{
+  return Me()->GetOffset();
+}
+
 
 void DataViewerProxy::SetData(const Data& d)
 {
@@ -85,9 +162,9 @@ OverlayManagerPtr DataViewerProxy::GetOverlayManager() const
 }
 
 
-void DataViewerProxy::AddDockWidget(QWidget* w, const QString& name, bool shown)
+void DataViewerProxy::AddDockWidget(QWidget* w, const QString& name, bool shown, int area)
 {
-  Me()->AddDockWidget(w,name, shown);
+  Me()->AddDockWidget(w,name, shown,area);
 }
 
 void DataViewerProxy::RemoveDockWidget(QWidget* w)
@@ -110,6 +187,22 @@ void DataViewerProxy::Hide()
   Me()->hide();
 }
 
+void DataViewerProxy::ObserverUpdate()
+{
+}
+void DataViewerProxy::ObserverUpdate(const Extent& e)
+{
+}
+void DataViewerProxy::ObserverUpdate(const Point& p)
+{
+}
+void DataViewerProxy::ObserverRelease()
+{
+  Release(Me());
+}
 
+object DataViewerProxy::GetQObject(){
+  return ost::gui::get_py_qobject<DataViewer>(Me());
+}
 
 }}}  //ns
diff --git a/modules/gui/pymod/data_viewer_proxy.hh b/modules/gui/pymod/data_viewer_proxy.hh
index 39a5f6c838962281eae1b39defdf1888cd9f523c..77eae302faa85f1749852827bce714ae6648f997 100644
--- a/modules/gui/pymod/data_viewer_proxy.hh
+++ b/modules/gui/pymod/data_viewer_proxy.hh
@@ -48,7 +48,7 @@ namespace ost { namespace img { namespace gui {
 // fw decl
 class DataViewer;
 
-class TEMPLATE_EXPORT DataViewerProxy : public ost::gui::SipHandler<DataViewer>{
+class TEMPLATE_EXPORT DataViewerProxy : public ost::gui::SipHandler<DataViewer>, public DataObserver {
 public:
   DataViewerProxy(DataViewer* v);
 
@@ -63,11 +63,27 @@ public:
   void UpdateView();
 
   Extent GetSelection() const;
+  void SetSelection(const Extent& selection);
+  void SetSlab(int slab);
+  int GetSlab() const;
+  void SetZoomScale(Real zoomscale);
+  Real GetZoomScale() const;
+  void SetViewerMin(Real min);
+  Real GetViewerMin() const;
+  void SetViewerMax(Real max);
+  Real GetViewerMax() const;
+  void SetGamma(Real gamma);
+  Real GetGamma() const;
+  void SetInvert(bool invert);
+  bool GetInvert() const;
+  void SetOffset(const geom::Vec2& offset);
+  geom::Vec2 GetOffset() const;
+
   int AddOverlay(const OverlayPtr& ov, bool make_active=true);
   OverlayManagerPtr GetOverlayManager() const;
   void ClearOverlays();
 
-  void AddDockWidget(QWidget* w, const QString& name, bool shown=true);
+  void AddDockWidget(QWidget* w, const QString& name, bool shown=true, int area=2);
   void RemoveDockWidget(QWidget* w);
 
   void SetAntialiasing(bool f);
@@ -80,6 +96,14 @@ public:
 
   void Hide();  
 
+  //////////////////////
+  // observer interface
+  virtual void ObserverUpdate();
+  virtual void ObserverUpdate(const Extent& e);
+  virtual void ObserverUpdate(const Point& p);
+  virtual void ObserverRelease();
+
+  object GetQObject();
 };
 
 typedef boost::shared_ptr<DataViewerProxy> DataViewerProxyPtr;
diff --git a/modules/gui/pymod/export_data_viewer.cc b/modules/gui/pymod/export_data_viewer.cc
index dbaa30ace761f80c9284b634ddd2d6140f6dda97..b3e6e0b954de0349f09e652a49f46e4592b2ba75 100644
--- a/modules/gui/pymod/export_data_viewer.cc
+++ b/modules/gui/pymod/export_data_viewer.cc
@@ -25,30 +25,28 @@
 #include <boost/python.hpp>
 #include <ost/base.hh>
 #include <ost/gui/data_viewer/data_viewer.hh>
+#include "data_viewer_proxy.hh"
 #include <ost/gui/data_viewer/overlay_manager.hh>
 
-#include "sip_handler.hh"
-
 using namespace boost::python;
 using namespace ost::img;
 using namespace ost;
-using namespace ost::img::gui;
 using namespace ost::gui;
+using namespace ost::img::gui;
 
 namespace {
 
-void add_dock1(DataViewer* p, QWidget* w, const String& name)
+void add_dock1(DataViewerProxy* p, QWidget* w, const String& name) 
 {
   p->AddDockWidget(w,QString::fromStdString(name));
 }
 
-void add_dock2(DataViewer* p, QWidget* w, const String& name, bool s)
+void add_dock2(DataViewerProxy* p, QWidget* w, const String& name, bool s)
 {
   p->AddDockWidget(w,QString::fromStdString(name),s);
 }
 
-
-void add_dock3(DataViewer* p, QWidget* w, const String& name, bool s, int area)
+void add_dock3(DataViewerProxy* p, QWidget* w, const String& name, bool s, int area)
 {
   p->AddDockWidget(w,QString::fromStdString(name),s,area);
 }
@@ -60,53 +58,54 @@ BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(o_AddDockWidget, AddDockWidget, 2, 4)
 
 void export_data_viewer()
 {
-  class_<DataViewer, boost::noncopyable >("DataViewer",no_init)
-    .def("SetData",&DataViewer::SetData)
-    .def("SetName",&DataViewer::SetName)
-    .def("GetOverlayManager",&DataViewer::GetOverlayManager)
-    .def("GetNormalizer",&DataViewer::GetNormalizer,return_value_policy<return_by_value>())
-    .def("Renormalize",&DataViewer::Renormalize)
-    .def("AddOverlay",&DataViewer::AddOverlay,o_AddOverlay())
-    .def("ClearOverlays",&DataViewer::ClearOverlays)
-    .def("GetSelection",&DataViewer::GetSelection)
-    .def("SetSelection",&DataViewer::SetSelection)
-    .def("UpdateView",&DataViewer::UpdateView)
-    .def("Recenter",&DataViewer::Recenter)
-    .def("AddDockWidget",&DataViewer::AddDockWidget,o_AddDockWidget())
+  class_<DataViewerProxy, DataViewerProxyPtr, bases<ost::gui::SipHandlerBase> >("DataViewer",no_init)
+    .def("SetData",&DataViewerProxy::SetData)
+    .def("SetName",&DataViewerProxy::SetName)
+    .def("GetOverlayManager",&DataViewerProxy::GetOverlayManager)
+    .def("GetNormalizer",&DataViewerProxy::GetNormalizer,return_value_policy<return_by_value>())
+    .def("Renormalize",&DataViewerProxy::Renormalize)
+    .def("AddOverlay",&DataViewerProxy::AddOverlay,o_AddOverlay())
+    .def("ClearOverlays",&DataViewerProxy::ClearOverlays)
+    .def("GetSelection",&DataViewerProxy::GetSelection)
+    .def("SetSelection",&DataViewerProxy::SetSelection)
+    .def("UpdateView",&DataViewerProxy::UpdateView)
+    .def("Recenter",&DataViewerProxy::Recenter)
+    .def("AddDockWidget",&DataViewerProxy::AddDockWidget,o_AddDockWidget())
     .def("AddDockWidget",add_dock1)
     .def("AddDockWidget",add_dock2)
     .def("AddDockWidget",add_dock3)
-    .def("SetSlab", &DataViewer::SetSlab)
-    .def("GetSlab", &DataViewer::GetSlab)
-    .add_property("slab", &DataViewer::GetSlab, &DataViewer::SetSlab)
-    .def("SetZoomScale", &DataViewer::SetZoomScale)
-    .def("GetZoomScale", &DataViewer::GetZoomScale)
-    .add_property("zoomscale", &DataViewer::GetZoomScale, &DataViewer::SetZoomScale)
-    .def("SetViewerMin", &DataViewer::SetViewerMin)
-    .def("GetViewerMin", &DataViewer::GetViewerMin)
-    .add_property("viewer_min", &DataViewer::GetViewerMin, &DataViewer::SetViewerMin)
-    .def("SetViewerMax", &DataViewer::SetViewerMax)
-    .def("GetViewerMax", &DataViewer::GetViewerMax)
-    .add_property("viewer_max", &DataViewer::GetViewerMax, &DataViewer::SetViewerMax)
-    .def("SetGamma", &DataViewer::SetGamma)
-    .def("GetGamma", &DataViewer::GetGamma)
-    .add_property("gamma", &DataViewer::GetGamma, &DataViewer::SetGamma)
-    .def("SetInvert", &DataViewer::SetInvert)
-    .def("GetInvert", &DataViewer::GetInvert)
-    .add_property("invert", &DataViewer::GetInvert, &DataViewer::SetInvert)
-    .def("SetOffset", &DataViewer::SetOffset)
-    .def("GetOffset", &DataViewer::GetOffset)
-    .add_property("offset", &DataViewer::GetOffset, &DataViewer::SetOffset)
-    .def("RemoveDockWidget",&DataViewer::RemoveDockWidget)
-    .def("SetAntialiasing",&DataViewer::SetAntialiasing)
-    .def("Show",&DataViewer::show)
-    .def("Hide", &DataViewer::hide)
-    .def("GetQObject",&get_py_qobject<DataViewer>)
-    .add_property("qobject", &get_py_qobject<DataViewer>)
-    /*
-    .def("SetAutoNormalize",&DataViewer::SetAutoNormalize)
-    .def("ShowClickedPosition",&DataViewer::ShowClickedPosition,o_ShowClickedPosition())
-    .def("GetClickedPosition",&DataViewer::GetClickedPosition)
-    */
+    .def("RemoveDockWidget",&DataViewerProxy::RemoveDockWidget)
+    .def("SetAntialiasing",&DataViewerProxy::SetAntialiasing)
+    .def("Show",&DataViewerProxy::Show)
+    .def("Hide", &DataViewerProxy::Hide)
+    .def("SetSlab", &DataViewerProxy::SetSlab)
+    .def("GetSlab", &DataViewerProxy::GetSlab)
+    .add_property("slab", &DataViewerProxy::GetSlab, &DataViewerProxy::SetSlab)
+    .def("SetZoomScale", &DataViewerProxy::SetZoomScale)
+    .def("GetZoomScale", &DataViewerProxy::GetZoomScale)
+    .add_property("zoomscale", &DataViewerProxy::GetZoomScale, &DataViewerProxy::SetZoomScale)
+    .def("SetViewerMin", &DataViewerProxy::SetViewerMin)
+    .def("GetViewerMin", &DataViewerProxy::GetViewerMin)
+    .add_property("viewer_min", &DataViewerProxy::GetViewerMin, &DataViewerProxy::SetViewerMin)
+    .def("SetViewerMax", &DataViewerProxy::SetViewerMax)
+    .def("GetViewerMax", &DataViewerProxy::GetViewerMax)
+    .add_property("viewer_max", &DataViewerProxy::GetViewerMax, &DataViewerProxy::SetViewerMax)
+    .def("SetGamma", &DataViewerProxy::SetGamma)
+    .def("GetGamma", &DataViewerProxy::GetGamma)
+    .add_property("gamma", &DataViewerProxy::GetGamma, &DataViewerProxy::SetGamma)
+    .def("SetInvert", &DataViewerProxy::SetInvert)
+    .def("GetInvert", &DataViewerProxy::GetInvert)
+    .add_property("invert", &DataViewerProxy::GetInvert, &DataViewerProxy::SetInvert)
+    .def("SetOffset", &DataViewerProxy::SetOffset)
+    .def("GetOffset", &DataViewerProxy::GetOffset)
+    .add_property("offset", &DataViewerProxy::GetOffset, &DataViewerProxy::SetOffset)
+    .def("GetQObject",&DataViewerProxy::GetQObject)
+    .add_property("qobject",&DataViewerProxy::GetQObject)
+
+      /*
+    .def("SetAutoNormalize",&DataViewerProxy::SetAutoNormalize)
+    .def("ShowClickedPosition",&DataViewerProxy::ShowClickedPosition,o_ShowClickedPosition())
+    .def("GetClickedPosition",&DataViewerProxy::GetClickedPosition)
+    */    
     ;
 }
diff --git a/modules/gui/pymod/export_gosty.cc b/modules/gui/pymod/export_gosty.cc
index 1cd37fae447b9bd593a82c750196b29ef7a3dc55..7401816de5badf49cd833d958e347596c74c25f9 100644
--- a/modules/gui/pymod/export_gosty.cc
+++ b/modules/gui/pymod/export_gosty.cc
@@ -36,9 +36,7 @@ using namespace boost::python;
 #include "sip_handler.hh"
 
 #if OST_IMG_ENABLED
-  #include <ost/gui/data_viewer/data_viewer.hh>
-#include <ost/img/data.hh>
-#include <ost/gui/data_viewer/data_viewer.hh>
+#include "data_viewer_proxy.hh"
 using namespace ost::img::gui;
 #endif
 
@@ -48,15 +46,13 @@ using namespace ost::gui;
 namespace {
 
 #if OST_IMG_ENABLED
-DataViewer* app_create_data_viewer1(GostyApp* app, 
-                                    const ost::img::Data& d, 
-                                    const QString& name)
+DataViewerProxyPtr app_create_data_viewer1(GostyApp* app, const ost::img::Data& d, const QString& name)
 {
-  return app->CreateDataViewer(d,name);
+  return DataViewerProxyPtr(new DataViewerProxy(app->CreateDataViewer(d,name)));
 }
-DataViewer* app_create_data_viewer2(GostyApp* app, const ost::img::Data& d)
+DataViewerProxyPtr app_create_data_viewer2(GostyApp* app, const ost::img::Data& d)
 {
-  return app->CreateDataViewer(d);
+  return DataViewerProxyPtr(new DataViewerProxy(app->CreateDataViewer(d)));
 }
 #endif
 
@@ -117,8 +113,8 @@ void export_Gosty()
     .add_property("message_widget", make_function(&GostyApp::GetMessageWidget,
         return_value_policy<reference_existing_object>()))
      #if OST_IMG_ENABLED
-    .def("CreateDataViewer", &app_create_data_viewer1,return_value_policy<reference_existing_object>())
-    .def("CreateDataViewer", &app_create_data_viewer2,return_value_policy<reference_existing_object>())
+    .def("CreateDataViewer", &app_create_data_viewer1)
+    .def("CreateDataViewer", &app_create_data_viewer2)
     #endif
     .def("ProcessEvents", &GostyApp::ProcessEvents)           
     .add_property("perspective", 
diff --git a/modules/gui/src/data_viewer/data_viewer.cc b/modules/gui/src/data_viewer/data_viewer.cc
index 64896c8a76022a6098ffc66a18f8b00554b9cca3..82e81fdc7962c6f982e7a09dca59eb897095dade 100644
--- a/modules/gui/src/data_viewer/data_viewer.cc
+++ b/modules/gui/src/data_viewer/data_viewer.cc
@@ -87,6 +87,10 @@ void DataViewer::SetData(const Data& d)
   info_->SetImageInfo(d);
 }
 
+const Data& DataViewer::GetData() const{
+  return panel_->GetObservedData();
+}
+
 NormalizerPtr DataViewer::GetNormalizer() const 
 {
   assert(panel_);
diff --git a/modules/gui/src/data_viewer/data_viewer.hh b/modules/gui/src/data_viewer/data_viewer.hh
index e9e417f6b0c6a0076ab728ae8dd60b0dacabf71d..b01848471b892c0d0fb17ac8aa331645dad5f6ea 100644
--- a/modules/gui/src/data_viewer/data_viewer.hh
+++ b/modules/gui/src/data_viewer/data_viewer.hh
@@ -69,6 +69,9 @@ public:
   //! set new image or function to display
   void SetData(const Data& data);
 
+  //! get the current displayed image
+  const Data& GetData() const;
+
   //! retrieve used normalizer
   NormalizerPtr GetNormalizer() const;