diff --git a/modules/gui/pymod/data_viewer_proxy.cc b/modules/gui/pymod/data_viewer_proxy.cc
index 44c7de2174c7a913fc346c7878cb9f269640ec7b..9ee1c099aff32fdf1be85223af69f5bd4c89499e 100644
--- a/modules/gui/pymod/data_viewer_proxy.cc
+++ b/modules/gui/pymod/data_viewer_proxy.cc
@@ -23,186 +23,178 @@
 */
 
 #include <ost/message.hh>
-//#include <ost/gui/snapshot.hh>
 
 #include "data_viewer_proxy.hh"
 
 namespace ost { namespace img { namespace gui {
 
 DataViewerProxy::DataViewerProxy(DataViewer* v):
-  ost::gui::SipHandler<ost::img::gui::DataViewer>(v),
-  DataObserver(v->GetData())
+  viewer_ptr_(v)
 {
 }
 
 
 NormalizerPtr DataViewerProxy::GetNormalizer() const
 {
-  return Me()->GetNormalizer();
+  return viewer()->GetNormalizer();
 }
 
 void DataViewerProxy::Renormalize()
 {
-  Me()->Renormalize();
+  viewer()->Renormalize();
 }
 
 void DataViewerProxy::UpdateView()
 {
-  Me()->UpdateView();
+  viewer()->UpdateView();
 }
 
 void DataViewerProxy::Recenter()
 {
-  Me()->Recenter();
+  viewer()->Recenter();
 }
 
 Extent DataViewerProxy::GetSelection() const
 {
-  return Me()->GetSelection();
+  return viewer()->GetSelection();
 }
 void DataViewerProxy::SetSelection(const Extent& selection)
 {
-  Me()->SetSelection(selection);
+  viewer()->SetSelection(selection);
 }
 
 void DataViewerProxy::SetSlab(int slab)
 {
-  Me()->SetSlab(slab);
+  viewer()->SetSlab(slab);
 }
 
 int DataViewerProxy::GetSlab() const
 {
-  return Me()->GetSlab();
+  return viewer()->GetSlab();
 }
 
 void DataViewerProxy::SetZoomScale(Real zoomscale)
 {
-  Me()->SetZoomScale(zoomscale);
+  viewer()->SetZoomScale(zoomscale);
 }
 
 Real DataViewerProxy::GetZoomScale() const
 {
-  return Me()->GetZoomScale();
+  return viewer()->GetZoomScale();
 }
 
 void DataViewerProxy::SetViewerMin(Real min)
 {
-  Me()->SetViewerMin(min);
+  viewer()->SetViewerMin(min);
 }
 
 Real DataViewerProxy::GetViewerMin() const
 {
-  return Me()->GetViewerMin();
+  return viewer()->GetViewerMin();
 }
 
 void DataViewerProxy::SetViewerMax(Real max)
 {
-  Me()->SetViewerMax(max);
+  viewer()->SetViewerMax(max);
 }
 
 Real DataViewerProxy::GetViewerMax() const
 {
-  return Me()->GetViewerMax();
+  return viewer()->GetViewerMax();
 }
 
 void DataViewerProxy::SetGamma(Real gamma)
 {
-  Me()->SetGamma(gamma);
+  viewer()->SetGamma(gamma);
 }
 
 Real DataViewerProxy::GetGamma() const
 {
-  return Me()->GetGamma();
+  return viewer()->GetGamma();
 }
 
 void DataViewerProxy::SetInvert(bool invert)
 {
-  Me()->SetInvert(invert);
+  viewer()->SetInvert(invert);
 }
 
 bool DataViewerProxy::GetInvert() const
 {
-  return Me()->GetInvert();
+  return viewer()->GetInvert();
 }
 
 void DataViewerProxy::SetOffset(const geom::Vec2& offset)
 {
-  Me()->SetOffset(offset);
+  viewer()->SetOffset(offset);
 }
 
 geom::Vec2 DataViewerProxy::GetOffset() const
 {
-  return Me()->GetOffset();
+  return viewer()->GetOffset();
 }
 
 
-void DataViewerProxy::SetData(const Data& d)
+void DataViewerProxy::SetData(const ImageHandle& d)
 {
-  Me()->SetData(d);
+  viewer()->SetData(d);
 }
 
 void DataViewerProxy::SetName(const String& name)
 {
-  Me()->SetName(name);
+  viewer()->SetName(name);
 }
 
 int DataViewerProxy::AddOverlay(const OverlayPtr& ov, bool make_active)
 {
-  return Me()->AddOverlay(ov,make_active);
+  return viewer()->AddOverlay(ov,make_active);
 }
 
 void DataViewerProxy::ClearOverlays()
 {
-  Me()->ClearOverlays();
+  viewer()->ClearOverlays();
 }
 
 OverlayManagerPtr DataViewerProxy::GetOverlayManager() const
 {
-  return Me()->GetOverlayManager();
+  return viewer()->GetOverlayManager();
 }
 
 
 void DataViewerProxy::AddDockWidget(QWidget* w, const QString& name, bool shown, int area)
 {
-  Me()->AddDockWidget(w,name, shown,area);
+  viewer()->AddDockWidget(w,name, shown,area);
 }
 
 void DataViewerProxy::RemoveDockWidget(QWidget* w)
 {
-  Me()->RemoveDockWidget(w);
+  viewer()->RemoveDockWidget(w);
 }
 
 void DataViewerProxy::SetAntialiasing(bool f)
 {
-  Me()->SetAntialiasing(f);
+  viewer()->SetAntialiasing(f);
 }
 
 void DataViewerProxy::Show()
 {
-  Me()->show();
+  viewer()->show();
 }
 
 void DataViewerProxy::Hide() 
 {
-  Me()->hide();
+  viewer()->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());
+  return ost::gui::get_py_qobject<DataViewer>(viewer());
 }
 
+DataViewer* DataViewerProxy::viewer() const
+{
+  if(!viewer_ptr_){
+     throw Error("DataViewer no longer exists");
+  }
+  return viewer_ptr_;
+}
 }}}  //ns
diff --git a/modules/gui/pymod/data_viewer_proxy.hh b/modules/gui/pymod/data_viewer_proxy.hh
index 77eae302faa85f1749852827bce714ae6648f997..de1cd16fd74831cc371033451c3c93724c244386 100644
--- a/modules/gui/pymod/data_viewer_proxy.hh
+++ b/modules/gui/pymod/data_viewer_proxy.hh
@@ -28,6 +28,7 @@
 #define IMG_GUI_DATA_VIEWER_PROXY_H
 
 #include <boost/shared_ptr.hpp>
+#include <QPointer>
 
 #include <ost/img/point.hh>
 #include <ost/img/extent.hh>
@@ -48,13 +49,13 @@ namespace ost { namespace img { namespace gui {
 // fw decl
 class DataViewer;
 
-class TEMPLATE_EXPORT DataViewerProxy : public ost::gui::SipHandler<DataViewer>, public DataObserver {
+class TEMPLATE_EXPORT DataViewerProxy  {
 public:
   DataViewerProxy(DataViewer* v);
 
   // data viewer interface
 
-  void SetData(const Data& data);
+  void SetData(const ImageHandle& data);
   void SetName(const String& name);
 
   NormalizerPtr GetNormalizer() const;
@@ -96,14 +97,10 @@ 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();
+protected:
+  QPointer<DataViewer> viewer_ptr_;
+  DataViewer* viewer() const;
 };
 
 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 b3e6e0b954de0349f09e652a49f46e4592b2ba75..e1b047d84cd09022b75a953bbeb25fdf631304d5 100644
--- a/modules/gui/pymod/export_data_viewer.cc
+++ b/modules/gui/pymod/export_data_viewer.cc
@@ -58,7 +58,7 @@ BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(o_AddDockWidget, AddDockWidget, 2, 4)
 
 void export_data_viewer()
 {
-  class_<DataViewerProxy, DataViewerProxyPtr, bases<ost::gui::SipHandlerBase> >("DataViewer",no_init)
+  class_<DataViewerProxy, DataViewerProxyPtr >("DataViewer",no_init)
     .def("SetData",&DataViewerProxy::SetData)
     .def("SetName",&DataViewerProxy::SetName)
     .def("GetOverlayManager",&DataViewerProxy::GetOverlayManager)
diff --git a/modules/gui/pymod/export_gosty.cc b/modules/gui/pymod/export_gosty.cc
index 7401816de5badf49cd833d958e347596c74c25f9..adc5594a8454dfb71042755a10c28e1818229e5d 100644
--- a/modules/gui/pymod/export_gosty.cc
+++ b/modules/gui/pymod/export_gosty.cc
@@ -46,11 +46,11 @@ using namespace ost::gui;
 namespace {
 
 #if OST_IMG_ENABLED
-DataViewerProxyPtr app_create_data_viewer1(GostyApp* app, const ost::img::Data& d, const QString& name)
+DataViewerProxyPtr app_create_data_viewer1(GostyApp* app, const ost::img::ImageHandle& d, const QString& name)
 {
   return DataViewerProxyPtr(new DataViewerProxy(app->CreateDataViewer(d,name)));
 }
-DataViewerProxyPtr app_create_data_viewer2(GostyApp* app, const ost::img::Data& d)
+DataViewerProxyPtr app_create_data_viewer2(GostyApp* app, const ost::img::ImageHandle& d)
 {
   return DataViewerProxyPtr(new DataViewerProxy(app->CreateDataViewer(d)));
 }
diff --git a/modules/gui/src/data_viewer/argand.cc b/modules/gui/src/data_viewer/argand.cc
index 6fceabe8f36723f1e0006c5e394cffa891cecb26..585283e2f4ecb3e8fc93c56875b2845431ffee09 100644
--- a/modules/gui/src/data_viewer/argand.cc
+++ b/modules/gui/src/data_viewer/argand.cc
@@ -31,7 +31,7 @@
 #include <QResizeEvent>
 namespace ost { namespace img { namespace gui {
 
-Argand::Argand(const Data& data, QWidget* p):
+Argand::Argand(const ImageHandle& data, QWidget* p):
   QWidget(p),
   DataObserver(data),
   extent_(),
diff --git a/modules/gui/src/data_viewer/argand.hh b/modules/gui/src/data_viewer/argand.hh
index 492bce04fa481f20e4bc9963ac5142aee81339df..8f09c241499b55a900e1a33b560f726cfedd5ba7 100644
--- a/modules/gui/src/data_viewer/argand.hh
+++ b/modules/gui/src/data_viewer/argand.hh
@@ -41,7 +41,7 @@ class DLLEXPORT_OST_GUI Argand: public QWidget, public DataObserver
 {
   Q_OBJECT;
 public:
-  Argand(const Data& data, QWidget* p);
+  Argand(const ImageHandle& data, QWidget* p);
   ~Argand();
 
   // QWidget interface
diff --git a/modules/gui/src/data_viewer/data_viewer.cc b/modules/gui/src/data_viewer/data_viewer.cc
index 82e81fdc7962c6f982e7a09dca59eb897095dade..a13a6d7ab900d2952a9249ba06d13a5b2b5c91e3 100644
--- a/modules/gui/src/data_viewer/data_viewer.cc
+++ b/modules/gui/src/data_viewer/data_viewer.cc
@@ -60,7 +60,7 @@ int ipow(int base, unsigned int exponent){
 }
 }
 
-DataViewer::DataViewer(QWidget* p, const Data& data, const QString& name):
+DataViewer::DataViewer(QWidget* p, const ImageHandle& data, const QString& name):
   ost::gui::MainWindow(p,0),
   name_(name),
   panel_(new DataViewerPanel(data,this)),
@@ -80,14 +80,14 @@ DataViewer::~DataViewer()
 {
 }
 
-void DataViewer::SetData(const Data& d)
+void DataViewer::SetData(const ImageHandle& d)
 {
   panel_->SetData(d);
   fft_->SetData(d);
   info_->SetImageInfo(d);
 }
 
-const Data& DataViewer::GetData() const{
+const ImageHandle& DataViewer::GetData() const{
   return panel_->GetObservedData();
 }
 
@@ -267,7 +267,7 @@ void DataViewer::SetAntialiasing(bool f)
 //////////////////////////
 // private methods
 
-void DataViewer::build(const Data& data) 
+void DataViewer::build(const ImageHandle& data)
 {
   build_menu();
 
diff --git a/modules/gui/src/data_viewer/data_viewer.hh b/modules/gui/src/data_viewer/data_viewer.hh
index b01848471b892c0d0fb17ac8aa331645dad5f6ea..6b056de385de7b07a0fe53fcf3746e2b4bad4ce3 100644
--- a/modules/gui/src/data_viewer/data_viewer.hh
+++ b/modules/gui/src/data_viewer/data_viewer.hh
@@ -67,10 +67,10 @@ public:
   virtual ~DataViewer();
 
   //! set new image or function to display
-  void SetData(const Data& data);
+  void SetData(const ImageHandle& data);
 
   //! get the current displayed image
-  const Data& GetData() const;
+  const ImageHandle& GetData() const;
 
   //! retrieve used normalizer
   NormalizerPtr GetNormalizer() const;
@@ -154,7 +154,7 @@ public slots:
 
  protected:
   //! initialize with data to view, plus a name
-  DataViewer(QWidget* p, const Data& data, const QString& name="");
+  DataViewer(QWidget* p, const ImageHandle& data, const QString& name="");
 
  private:
   // inhibit coping and assignement
@@ -176,7 +176,7 @@ public slots:
   QLabel* slablabel_;
   QPoint lastmouse_;
 
-  void build(const Data& data);
+  void build(const ImageHandle& data);
 
   void build_menu();
 };
diff --git a/modules/gui/src/data_viewer/data_viewer_panel.cc b/modules/gui/src/data_viewer/data_viewer_panel.cc
index 06a58bb1eb46ca12278277524cf94ca459f9607c..9de780147ac2c43179d6f4d2cd80d36029c439d7 100644
--- a/modules/gui/src/data_viewer/data_viewer_panel.cc
+++ b/modules/gui/src/data_viewer/data_viewer_panel.cc
@@ -21,7 +21,7 @@
 
 namespace ost { namespace img { namespace gui {
 
-DataViewerPanel::DataViewerPanel(const Data& d, QWidget* p):
+DataViewerPanel::DataViewerPanel(const ImageHandle& d, QWidget* p):
   DataViewerPanelBase(d,p)
 {}
 
diff --git a/modules/gui/src/data_viewer/data_viewer_panel.hh b/modules/gui/src/data_viewer/data_viewer_panel.hh
index e72530e36b7810f8a6557740ec0af8abfad16c75..71fe55351ca6038afc73d138d4f9cca87d78b3d9 100644
--- a/modules/gui/src/data_viewer/data_viewer_panel.hh
+++ b/modules/gui/src/data_viewer/data_viewer_panel.hh
@@ -28,7 +28,7 @@ namespace ost { namespace img { namespace gui {
 class DLLEXPORT_OST_GUI DataViewerPanel: public DataViewerPanelBase
 {
 public:
-  DataViewerPanel(const Data& d, QWidget* parent);
+  DataViewerPanel(const ImageHandle& d, QWidget* parent);
 };
 
 }}}  //ns
diff --git a/modules/gui/src/data_viewer/data_viewer_panel_base.cc b/modules/gui/src/data_viewer/data_viewer_panel_base.cc
index 98e285db0cb9997f115c75af7dc610da96272952..3f145e555ed84c3d216fc0382b5f46d4f01de7ce 100644
--- a/modules/gui/src/data_viewer/data_viewer_panel_base.cc
+++ b/modules/gui/src/data_viewer/data_viewer_panel_base.cc
@@ -43,7 +43,7 @@
 namespace ost { namespace img { namespace gui {
 
 
-DataViewerPanelBase::DataViewerPanelBase(const Data& data,QWidget* parent):
+DataViewerPanelBase::DataViewerPanelBase(const ImageHandle& data,QWidget* parent):
   QWidget(parent),
   DataObserver(data),
   popupmenu_(new QMenu(this)),
@@ -171,7 +171,7 @@ DataViewerPanelBase::~DataViewerPanelBase()
   delete pixmap_;
 }
 
-void DataViewerPanelBase::SetData(const Data& d)
+void DataViewerPanelBase::SetData(const ImageHandle& d)
 {
   SetObservedData(d);
   update_min_max();
diff --git a/modules/gui/src/data_viewer/data_viewer_panel_base.hh b/modules/gui/src/data_viewer/data_viewer_panel_base.hh
index d6d125e460930f8aae2c07ed2d75d4d1cb2a5f18..699efd372cad4dc5b0a9f26a205b4487f5b33168 100644
--- a/modules/gui/src/data_viewer/data_viewer_panel_base.hh
+++ b/modules/gui/src/data_viewer/data_viewer_panel_base.hh
@@ -32,6 +32,7 @@
 
 #include <ost/base.hh>
 #include <ost/img/extent.hh>
+#include <ost/img/data_observer.hh>
 #include <ost/img/normalizer_impl.hh>
 #include <ost/img/raster_image/raster_image.hh>
 
@@ -56,10 +57,10 @@ class DLLEXPORT_OST_GUI DataViewerPanelBase: public QWidget,
   Q_OBJECT;
 
 public:
-  DataViewerPanelBase(const Data& data,QWidget* parent);
+  DataViewerPanelBase(const ImageHandle& data,QWidget* parent);
   virtual ~DataViewerPanelBase();
 
-  virtual void SetData(const Data& d);
+  virtual void SetData(const ImageHandle& d);
 
   //////////////////
   // event handling
diff --git a/modules/gui/src/data_viewer/fft_panel.cc b/modules/gui/src/data_viewer/fft_panel.cc
index 17dd63b4a9da18678ae40f712241b1c9a2a98f67..554cc67c2a6c5ec3a62139042a9c66e0ae7172d3 100644
--- a/modules/gui/src/data_viewer/fft_panel.cc
+++ b/modules/gui/src/data_viewer/fft_panel.cc
@@ -32,7 +32,7 @@
 
 namespace ost { namespace img { namespace gui {
     
-FFTPanel::FFTPanel(const Data& parent_data, QWidget* parent):
+FFTPanel::FFTPanel(const ImageHandle& parent_data, QWidget* parent):
   DataViewerPanelBase(parent_data,parent),
   size_(std::min<int>(256,std::min<int>(parent_data.GetSize()[0],parent_data.GetSize()[1]))),
   parent_position_(parent_data.GetExtent().GetCenter()),
@@ -95,7 +95,7 @@ unsigned int FFTPanel::GetFFTSize()
   return size_;
 }
 
-void FFTPanel::SetData(const Data& parent_data)
+void FFTPanel::SetData(const ImageHandle& parent_data)
 {
   parent_observer_=ParentDataObserver(parent_data);
 }
diff --git a/modules/gui/src/data_viewer/fft_panel.hh b/modules/gui/src/data_viewer/fft_panel.hh
index 2add54b8d2ca8140a078249250382751dc18ae3e..75a30fed87e8a1018887d10a56fd7e0465674ce0 100644
--- a/modules/gui/src/data_viewer/fft_panel.hh
+++ b/modules/gui/src/data_viewer/fft_panel.hh
@@ -25,6 +25,7 @@
 */
 
 #include <ost/gui/module_config.hh>
+#include <ost/img/data_observer.hh>
 #include "data_viewer_panel_base.hh"
 
 namespace ost { namespace img { namespace gui {
@@ -32,7 +33,7 @@ namespace ost { namespace img { namespace gui {
 class ParentDataObserver: public DataObserver
 {
 public:
-  ParentDataObserver(const Data& d):DataObserver(d){}
+  ParentDataObserver(const ImageHandle& d):DataObserver(d){}
   virtual void ObserverRelease()
   {
    // Noop as parent takes care of this.
@@ -44,12 +45,12 @@ class DLLEXPORT_OST_GUI FFTPanel: public DataViewerPanelBase
 Q_OBJECT
 
 public:
-  FFTPanel(const Data& parent_data, QWidget* parent);
+  FFTPanel(const ImageHandle& parent_data, QWidget* parent);
   virtual ~FFTPanel();
   void SetFFTSize(unsigned int size);
   unsigned int GetFFTSize();
   virtual void ObserverUpdate();
-  virtual void SetData(const Data& parent_data);
+  virtual void SetData(const ImageHandle& parent_data);
 
 public slots:
   void SetPosition(const Point& p);
diff --git a/modules/gui/src/gosty_app.cc b/modules/gui/src/gosty_app.cc
index ac5ce3105fec41b031796ae17e86712b7af2ad7e..2c1b644ec94221e4e18ff7ece0957e8cacdef3da 100644
--- a/modules/gui/src/gosty_app.cc
+++ b/modules/gui/src/gosty_app.cc
@@ -109,12 +109,14 @@ SequenceViewer* GostyApp::GetSequenceViewer()
 }
 
 #if OST_IMG_ENABLED
-ost::img::gui::DataViewer* GostyApp::CreateDataViewer(const ost::img::Data& d, const QString& name)
+ost::img::gui::DataViewer* GostyApp::CreateDataViewer(const ost::img::ImageHandle& d, const QString& name)
 {
   ost::img::gui::DataViewer* viewer=new ost::img::gui::DataViewer(main_,d,name);
   QMdiSubWindow* mdi=new QMdiSubWindow(this->GetPerspective()->GetMainArea());
   mdi->setWindowTitle(name);
   mdi->setWidget(viewer);
+  viewer->setAttribute(Qt::WA_DeleteOnClose);
+  mdi->setAttribute(Qt::WA_DeleteOnClose);
   viewer->setParent(mdi);
   this->GetPerspective()->GetMainArea()->addSubWindow(mdi);
   mdi->showMaximized();
diff --git a/modules/gui/src/gosty_app.hh b/modules/gui/src/gosty_app.hh
index 787404aa34abefc5df6a628929284eb8fc8735ed..a635c407ae9cd3e75570101b73aeb3948f0f5910 100644
--- a/modules/gui/src/gosty_app.hh
+++ b/modules/gui/src/gosty_app.hh
@@ -46,7 +46,7 @@ namespace ost {
 
 namespace img { 
 
-class Data;
+class ImageHandle;
 
 namespace gui { 
 class DataViewer; 
@@ -124,7 +124,7 @@ public:
 #if OST_IMG_ENABLED
   /// \brief create new DataViewer
   /// 
-  ost::img::gui::DataViewer* CreateDataViewer(const ost::img::Data& d, const QString& name="");
+  ost::img::gui::DataViewer* CreateDataViewer(const ost::img::ImageHandle& d, const QString& name="");
 #endif
 
   /// \brief give the application time to run the mainloop and process events
diff --git a/modules/img/base/src/data_observer.cc b/modules/img/base/src/data_observer.cc
index 804056db48593dd92ebe6a69bd1c85de3bce0f7f..4d42d66213ae5e60f4ae131f76229576c0caa957 100644
--- a/modules/img/base/src/data_observer.cc
+++ b/modules/img/base/src/data_observer.cc
@@ -30,54 +30,54 @@
 
 namespace ost { namespace img {
 
-DataObserver::DataObserver(const Data& d):
-  data_(boost::cref(d)) 
+DataObserver::DataObserver(const ImageHandle& d):
+  data_(d)
 {
-  data_.get().Attach(this);
+  data_.Attach(this);
 }
 
 DataObserver::DataObserver(const DataObserver& o):
   data_(o.data_) 
 {
-  data_.get().Attach(this);
+  data_.Attach(this);
 }
 
 DataObserver& DataObserver::operator=(const DataObserver& o)
 {
   if(this!=&o) {
-    data_.get().Detach(this);
+    data_.Detach(this);
     data_=o.data_;
-    data_.get().Attach(this);
+    data_.Attach(this);
   }
   return *this;
 }
 
 DataObserver::~DataObserver() 
 {
-  data_.get().Detach(this);
+  data_.Detach(this);
 }
 
 void DataObserver::ObserverInvalidate()
 {
-  data_=boost::cref(NullData::Instance());
+  data_=ImageHandle();
 }
 
-const Data& DataObserver::GetObservedData() const 
+const ImageHandle& DataObserver::GetObservedData() const
 {
   if(!is_valid()) {
     std::cerr << "invalid observed data access" << std::endl;
     throw InvalidObserver("GetData called for invalidated observer");
   }
-  return data_.get();
+  return data_;
 }
 
-void DataObserver::SetObservedData(const Data& d) 
+void DataObserver::SetObservedData(const ImageHandle& d)
 {
   if(is_valid()) {
-    data_.get().Detach(this);
+    data_.Detach(this);
   }
-  data_ = boost::cref(d);
-  data_.get().Attach(this);
+  data_ = d;
+  data_.Attach(this);
 }
 
 void DataObserver::ObserverUpdate()
@@ -97,7 +97,7 @@ void DataObserver::ObserverUpdate(const Point&)
 
 bool DataObserver::is_valid() const 
 {
-  return data_.get_pointer() != &NullData::Instance();
+  return data_.IsValid();
 }
 
 }} // namespace
diff --git a/modules/img/base/src/data_observer.hh b/modules/img/base/src/data_observer.hh
index c99e2f5855eb719a056b839730acaec8b6e47a01..0d369a2bdadf2597c60a12e06922b65d91d57cc3 100644
--- a/modules/img/base/src/data_observer.hh
+++ b/modules/img/base/src/data_observer.hh
@@ -27,9 +27,8 @@
 #ifndef IMG_DATA_OBSERVER
 #define IMG_DATA_OBSERVER
 
-#include <boost/ref.hpp>
 
-#include "data.hh"
+#include "image_handle.hh"
 
 namespace ost { namespace img {
 
@@ -63,7 +62,7 @@ class DLLEXPORT_OST_IMG_BASE DataObserver {
   /*!
     requires reference to data, then attaches itself to data
   */
-  DataObserver(const Data& d);
+  DataObserver(const ImageHandle& d);
 
   DataObserver(const DataObserver& o);
 
@@ -92,7 +91,7 @@ class DLLEXPORT_OST_IMG_BASE DataObserver {
   void ObserverInvalidate();
   
   //! Returns data that is observed
-  virtual const Data& GetObservedData() const;
+  virtual const ImageHandle& GetObservedData() const;
 
   bool IsDataValid() const {return is_valid();}
 
@@ -102,12 +101,12 @@ class DLLEXPORT_OST_IMG_BASE DataObserver {
   /*!
     Automatically unregister previously observed data
   */
-  void SetObservedData(const Data& d);
+  void SetObservedData(const ImageHandle& d);
 
   bool is_valid() const;
 
 private:
-  boost::reference_wrapper<const Data> data_;
+  ImageHandle data_;
 
 };
 
diff --git a/modules/img/base/src/image_handle.cc b/modules/img/base/src/image_handle.cc
index 94709ec95172939c64c313df6e5f258acafd2601..c0059be0b852490c5e50306fffab6fca18f23208 100644
--- a/modules/img/base/src/image_handle.cc
+++ b/modules/img/base/src/image_handle.cc
@@ -21,7 +21,7 @@
 /*
   image handle and const handle
 
-  Author: Ansgar Philippsen
+  Author: Ansgar Philippsen, Andreas Schenk
 */
 
 #include <ost/message.hh>
@@ -37,6 +37,7 @@
 #include "image_impl.hh"
 #include "observable.hh"
 #include "paste_impl.hh"
+#include "data_observer.hh"
 
 #include "image_state/image_state_factory.hh"
 #include "image_state/image_state_base.hh"
diff --git a/modules/img/base/src/image_handle.hh b/modules/img/base/src/image_handle.hh
index 13a6cb2429674bcb6864eac57055278439e2e727..847d897c40b88b7ed3bf0c31516e048c922c967c 100644
--- a/modules/img/base/src/image_handle.hh
+++ b/modules/img/base/src/image_handle.hh
@@ -23,7 +23,7 @@
 
   offers the Image interface
 
-  Author: Ansgar Philippsen
+  Author: Ansgar Philippsen, Andreas Schenk
 */
 
 #ifndef IMG_IMAGE_HANDLE_H
@@ -37,7 +37,6 @@
 
 #include "data.hh"
 #include "observable.hh"
-#include "data_observer.hh"
 #include "extent_iterator.hh"
 
 #include "image_state/image_state_visitor_fw.hh"
@@ -69,6 +68,7 @@ class ModIPAlgorithm;
 class ConstModIPAlgorithm;
 class ModOPAlgorithm;
 class ConstModOPAlgorithm;
+class DataObserver;
 
 //! Exception thrown upon invalid image handle usage
 class DLLEXPORT InvalidImageHandle: public Error {