diff --git a/modules/gfx/src/entity.cc b/modules/gfx/src/entity.cc
index c14e4e16024055a383ae500611f58ae9d77e6f95..18581ab3da301d3af70e189b2e137f18bf1b1fb1 100644
--- a/modules/gfx/src/entity.cc
+++ b/modules/gfx/src/entity.cc
@@ -135,6 +135,10 @@ Entity::Entity(const String& name,
 }
 
 
+Entity::~Entity()
+{
+}
+
 impl::EntityRenderer* Entity::GetOrCreateRenderer(RenderMode::Type rm)
 {
   RendererMap::iterator rit = renderer_.find(rm);
@@ -186,11 +190,11 @@ void Entity::init(RenderMode::Type rm)
   render_mode_=rm;
   trace_.ResetView(this->GetView());
   sel_=this->GetView().CreateEmptyView();  
-  impl::EntityRenderer* r=this->GetOrCreateRenderer(rm);
-  if(!r) return;
 
-  r->AddView(this->GetView());
-  r->UpdateViews();
+  impl::EntityRenderer* renderer=this->GetOrCreateRenderer(rm);
+
+  renderer->AddView(this->GetView());
+  renderer->UpdateViews();
   set_static_max_rad();
   
   Rebuild();
@@ -297,13 +301,17 @@ bool Entity::UpdateIfNeeded() const
     for (RendererMap::iterator i=renderer_.begin(), 
            e=renderer_.end(); i!=e; ++i) {
       EntityRenderer* renderer =i->second;
-      if (renderer->IsEnabled() && renderer->HasDataToRender()) {
-        if (renderer->IsDirty()) {
-          renderer->PrepareRendering();
-          updated=true;
-        }
-        renderer->VA().SetOpacity(opacity_);
+      if (!renderer->IsEnabled())
+        continue;
+      renderer->UpdateViews();
+      if (!renderer->HasDataToRender())
+        continue;
+
+      if (renderer->IsDirty()) {
+        renderer->PrepareRendering();
+        updated=true;
       }
+      renderer->VA().SetOpacity(opacity_);
     }
     if (updated) {
       this->CacheBoundingBox();
@@ -1135,22 +1143,23 @@ bool Entity::GetSeqHack() const
 
 void Entity::do_update_view() const
 {
-  // also signals an update in positions
-  if (update_view_) {
-    update_view_=false;    
-    cached_view_=qv_.GetEntityView();
-    trace_.ResetView(cached_view_);
-    for (RendererMap::iterator i=renderer_.begin(), 
-           e=renderer_.end(); i!=e; ++i) {
-      impl::EntityRenderer* r=i->second;
-      if (r->IsEnabled() && r->HasDataToRender()) {
-        r->ClearViews();
-        r->AddView(cached_view_);
-        r->UpdateViews();
-        r->FlagPositionsDirty();
-        r->PrepareRendering();
-      }
-    }
+  if (!update_view_)
+    return;
+  update_view_=false;
+  cached_view_=qv_.GetEntityView();
+  trace_.ResetView(cached_view_);
+  for (RendererMap::iterator
+       i=renderer_.begin(), e=renderer_.end(); i!=e; ++i) {
+    impl::EntityRenderer* renderer=i->second;
+    if (!renderer->IsEnabled())
+      continue;
+    renderer->ClearViews();
+    renderer->AddView(cached_view_);
+    renderer->UpdateViews();
+    if (!renderer->HasDataToRender())
+      continue;
+    renderer->FlagPositionsDirty();
+    renderer->PrepareRendering();
   }
 }
 
diff --git a/modules/gfx/src/entity.hh b/modules/gfx/src/entity.hh
index a9687c81c6e5d2f7c8da4b3ac67210eb7285fc3d..cddf17d990da1d87b445b177780cde120bacbeb3 100644
--- a/modules/gfx/src/entity.hh
+++ b/modules/gfx/src/entity.hh
@@ -89,6 +89,7 @@ public:
   Entity(const String& name,
          RenderMode::Type m,
          const mol::EntityView& ev);
+  virtual ~Entity();
 
   virtual geom::AlignedCuboid GetBoundingBox(bool use_tf=false) const;
 
diff --git a/modules/gfx/src/entity_fw.hh b/modules/gfx/src/entity_fw.hh
index 5e00ae29cd7ffb15b3c67642cc176d341f6d1586..192ad391322da684abb6590365c8e2b89530ea56 100644
--- a/modules/gfx/src/entity_fw.hh
+++ b/modules/gfx/src/entity_fw.hh
@@ -20,11 +20,13 @@
 #define OST_GFX_ENTITY_FW_HH
 
 #include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
 
 namespace ost { namespace gfx {
 
 class Entity;
 typedef boost::shared_ptr<Entity> EntityP;
+typedef boost::weak_ptr<Entity> EntityW;
 
 }}
 
diff --git a/modules/gfx/src/gfx_node.cc b/modules/gfx/src/gfx_node.cc
index 59b44d162d991620c77bd58ad300f49f5d3fc8de..657068c9ef836eeb73db31a956fa627d1b1e321a 100644
--- a/modules/gfx/src/gfx_node.cc
+++ b/modules/gfx/src/gfx_node.cc
@@ -33,7 +33,8 @@ GfxNode::GfxNode(const String& name):
 {}
 
 GfxNode::~GfxNode()
-{}
+{
+}
 
 GfxNode::GfxNode(const GfxNode& o) {}
 
diff --git a/modules/gfx/src/render_options/render_options.cc b/modules/gfx/src/render_options/render_options.cc
index 660ffa89428a5bcbf5835e4db2f5d3f33fab4c13..5d8e7a72c5a1c11c034d1c2ac4e4a83667d8070f 100644
--- a/modules/gfx/src/render_options/render_options.cc
+++ b/modules/gfx/src/render_options/render_options.cc
@@ -30,32 +30,31 @@ RenderOptions::RenderOptions(){}
 
 bool RenderOptions::AddObserver(EntityP entity)
 {
-  if((std::find( this->observers_.begin(), this->observers_.end(), entity )) == this->observers_.end())
-  {
-    this->observers_.push_back( entity );
-    return true;
+  for (EntityWObservers::const_iterator
+       i = observers_.begin(), e = observers_.end(); i != e; ++i) {
+    if (i->lock() == entity)
+      return false;
   }
-  return false;
+  observers_.push_back(entity);
+  return true;
 }
 
 bool RenderOptions::RemoveObserver(EntityP entity)
 {
-  EntityPObservers::iterator found = std::find( this->observers_.begin(), this->observers_.end(), entity);
-  if( found != this->observers_.end() ){
-
-    this->observers_.erase(found);
-    return true;
+  for (EntityWObservers::iterator
+       i = observers_.begin(), e = observers_.end(); i != e; ++i) {
+    if (i->lock() == entity)
+      observers_.erase(i);
+      return true;
   }
   return false;
 }
 
 void RenderOptions::NotifyStateChange()
 {
-  EntityPObservers::const_iterator observers_it = this->observers_.begin() ;
-  while( observers_it != this->observers_.end() )
-  {
-    ( *observers_it )->OptionsChanged(this->GetRenderMode()) ;
-    observers_it++;
+  for (EntityWObservers::iterator
+       i = observers_.begin(), e = observers_.end(); i != e; ++i) {
+    i->lock()->OptionsChanged(this->GetRenderMode());
   }
 }
 
diff --git a/modules/gfx/src/render_options/render_options.hh b/modules/gfx/src/render_options/render_options.hh
index 0c2515bdb6ec8aa830d7dca2023deeac0e310858..ce9dfc60209876eea3a142f08599022c86e041a2 100644
--- a/modules/gfx/src/render_options/render_options.hh
+++ b/modules/gfx/src/render_options/render_options.hh
@@ -51,8 +51,8 @@ public:
   void NotifyStateChange();
 
 private:
-  typedef std::vector< EntityP > EntityPObservers;
-  EntityPObservers observers_;
+  typedef std::vector< EntityW > EntityWObservers;
+  EntityWObservers observers_;
 
 };
 
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 5c96c47ad84bdbd9cc1198c0531f4669567e2a9a..e9025cd39f7a5f6c9b4235bf995faf77442f287b 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -1043,6 +1043,7 @@ void Scene::Remove(const GfxNodeP& go)
   if(!go) return;
   root_node_->Remove(go);
   this->NotifyObservers(bind(&SceneObserver::NodeRemoved, _1,go));
+  std::cerr << "Scene::Remove(node):" << go.use_count() << std::endl;
 }
 
 void Scene::RemoveAll()
@@ -1058,7 +1059,7 @@ void Scene::Remove(const String& name)
   if(fn.node) {
     root_node_->Remove(name);
     if(GfxObjP go = dyn_cast<GfxObj>(fn.node)) {
-      this->NotifyObservers(bind(&SceneObserver::NodeRemoved, _1,go));
+      this->NotifyObservers(bind(&SceneObserver::NodeRemoved, _1, go));
     }
   }
 }
diff --git a/modules/gui/src/scene_selection.cc b/modules/gui/src/scene_selection.cc
index 2faa79d6c09bbe1c5e3092126cf42a2acbe03bfb..be66a839918dcaa10d6f71db4bcc99ff989f89b6 100644
--- a/modules/gui/src/scene_selection.cc
+++ b/modules/gui/src/scene_selection.cc
@@ -103,6 +103,7 @@ void SceneSelection::CenterOnObjects() {
         geom::AlignedCuboid pair = obj->GetBoundingBox();
         min = geom::Min(min, pair.GetMin());
         max = geom::Max(max, pair.GetMax());
+        std::cerr << obj->GetName() << " " << min << " " << max << std::endl;
         changed=true;
       }
     }
diff --git a/modules/gui/src/scene_win/context_menu.cc b/modules/gui/src/scene_win/context_menu.cc
index 370800556aa052a3f11460a4c0578dfb2935c157..70a8c2bdcd088308fa5073fa6a8093df7fb9fbf6 100644
--- a/modules/gui/src/scene_win/context_menu.cc
+++ b/modules/gui/src/scene_win/context_menu.cc
@@ -199,16 +199,15 @@ void ContextMenu::ShowMenu(const QPoint& pos)
       flags &= ~SINGLE;
     }
     QMenu* menu = new QMenu();
-    QMapIterator<QAction*, ContextActionTypes> i(actions_);
+    QVectorIterator<std::pair<QAction*, ContextActionTypes> > i(actions_);
     flags ^= NOT_VISIBLE;
     flags ^= NOT_HIDDEN;
     while (i.hasNext()) {
-        i.next();
-        if (i.value() == (i.value() & flags)){
-          menu->addAction(i.key());
-        }
+      const std::pair<QAction*, ContextActionTypes>& value = i.next();
+      if (value.second == (value.second & flags)){
+        menu->addAction(value.first);
+      }
     }
-
     if(! menu->actions().empty()){
       menu->popup(pos);
     }
@@ -216,7 +215,7 @@ void ContextMenu::ShowMenu(const QPoint& pos)
 }
 
 void ContextMenu::AddAction(QAction* action,ContextActionTypes type){
-  actions_[action] = type;
+  actions_.push_back(std::make_pair(action, type));
 }
 
 void ContextMenu::AddView(){
diff --git a/modules/gui/src/scene_win/context_menu.hh b/modules/gui/src/scene_win/context_menu.hh
index c145164d7c3303ccca24d447497ffb465252070b..56ca0929a2693f65756584341463c24dfa09f26f 100644
--- a/modules/gui/src/scene_win/context_menu.hh
+++ b/modules/gui/src/scene_win/context_menu.hh
@@ -28,7 +28,7 @@
 #include <ost/gui/scene_win/scene_win_model.hh>
 
 #include <QFlags>
-#include <QMap>
+#include <QVector>
 #include <QAbstractItemModel>
 #include <QTreeView>
 namespace ost { namespace gui {
@@ -53,6 +53,7 @@ enum ContextActionType
   MAP_DSAMPLED_AVAIL=0x4000
 #endif
 };
+
 Q_DECLARE_FLAGS(ContextActionTypes, ContextActionType)
 
 
@@ -73,7 +74,7 @@ private slots:
   void DeleteView();
 
 private:
-  QMap<QAction*, ContextActionTypes> actions_;
+  QVector<std::pair<QAction*, ContextActionTypes> > actions_;
 
   QTreeView* view_;
   SceneWinModel* model_;
diff --git a/modules/gui/src/scene_win/entity_node.cc b/modules/gui/src/scene_win/entity_node.cc
index 02dc97c54f8396bc2e986b208c727a4a52144b43..1fa74f165a1318011fb6ede4708485723469fdc7 100644
--- a/modules/gui/src/scene_win/entity_node.cc
+++ b/modules/gui/src/scene_win/entity_node.cc
@@ -72,7 +72,9 @@ EntityNode::EntityNode(gfx::EntityP& entity, SceneNode* parent):
   custom_view_ = new LabelNode("Custom Views", this);
   model->AddNode(this, custom_view_);
 
-  node = new EntityPartNode("Full View", entity, mol::QueryViewWrapper(entity->GetView()), this);
+  node = new EntityPartNode("Full View", entity,
+                            mol::QueryViewWrapper(entity->GetView()),
+                            this);
   model->AddNode(this, node);
 
   node = new CurrentSelectionNode(entity, this);
diff --git a/modules/gui/src/scene_win/gfx_scene_node.cc b/modules/gui/src/scene_win/gfx_scene_node.cc
index 2b7255f25c663152d5d6eb1e3a247b99bddf131b..ca06e19c844a54e5fc36bd75c627d0cd9d042d5c 100644
--- a/modules/gui/src/scene_win/gfx_scene_node.cc
+++ b/modules/gui/src/scene_win/gfx_scene_node.cc
@@ -25,12 +25,15 @@
 #include <QFont>
 namespace ost { namespace gui {
 
-GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, SceneNode* parent):SceneNode(parent),gfx_node_(gfx_node){}
+GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, SceneNode* parent):
+  SceneNode(parent), gfx_node_(gfx_node) { }
 
-GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, QObject* parent):SceneNode(parent),gfx_node_(gfx_node){}
+GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, QObject* parent):
+  SceneNode(parent), gfx_node_(gfx_node) { }
 
 QVariant GfxSceneNode::GetData(int column, int role){
-  if(column<0 || column > 2)return QVariant();
+  if (column<0 || column > 2)
+    return QVariant();
 
   if (role==Qt::CheckStateRole && column==0) {
     return QVariant(gfx_node_->IsVisible() ? Qt::Checked : Qt::Unchecked);
@@ -52,7 +55,8 @@ int GfxSceneNode::GetColumnCount() const{
   return 2;
 }
 
-bool GfxSceneNode::SetData(int column, const QVariant& value, int role){
+bool GfxSceneNode::SetData(int column, const QVariant& value, int role)
+{
   if (column==0 && role == Qt::CheckStateRole) {
     if (value.toBool()) {
      this->GetParent()->SetData(0,value,Qt::CheckStateRole);
diff --git a/modules/gui/src/scene_win/label_node.cc b/modules/gui/src/scene_win/label_node.cc
index f6d2d72f549b124ca55395fbbe0f97489334ea4a..f71c832680aa5b0a8f601d61173b4f4aa6befbbe 100644
--- a/modules/gui/src/scene_win/label_node.cc
+++ b/modules/gui/src/scene_win/label_node.cc
@@ -52,7 +52,7 @@ bool LabelNode::SetData(int column, const QVariant& value, int role){
     if (value.toBool()) {
       this->GetParent()->SetData(0,value,Qt::CheckStateRole);
     } else {
-      for(int i = 0; i<this->GetChildCount(); i++){
+      for(int i = 0; i<this->children().size(); i++){
         this->GetChild(i)->SetData(0,value,Qt::CheckStateRole);
       }
     }
diff --git a/modules/gui/src/scene_win/scene_node.cc b/modules/gui/src/scene_win/scene_node.cc
index 347b529a59f6d5ec8a03e3ca91fb91de231a455d..70818d1acc3d606e3650983597f234da90bacd2d 100644
--- a/modules/gui/src/scene_win/scene_node.cc
+++ b/modules/gui/src/scene_win/scene_node.cc
@@ -29,27 +29,15 @@ SceneNode::SceneNode(QObject* parent):QObject(parent){
   parent_ = NULL;
 }
 
-SceneNode* SceneNode::GetParent() const{
-  return parent_;
-}
-
-void SceneNode::AddChild(SceneNode* node){
-  nodes_.append(node);
-}
-
-void SceneNode::RemoveChild(SceneNode* node){
-  nodes_.removeAll(node);
-}
-
 int SceneNode::GetChildRow(const SceneNode* node) const{
-  for(int i = 0; i < nodes_.size(); i++){
-    if(nodes_[i] == node)return i;
+  for(int i = 0; i < this->children().size(); i++){
+    if (this->children()[i] == node)
+      return i;
   }
   return -1;
 }
 
-int SceneNode::GetChildCount() const{
-  return nodes_.size();
+SceneNode::~SceneNode() {
 }
 
 int SceneNode::GetRow() const{
@@ -59,26 +47,13 @@ int SceneNode::GetRow() const{
   return 0;
 }
 
-bool SceneNode::IsParent(SceneNode* node) const{
-  if(node == this)return true;
-  for(int i = 0; i< nodes_.size(); i++){
-    if(nodes_[i]==node){
-      return true;
-    }
-    if(nodes_[i]->IsParent(node))
-      return true;
-  }
-  return false;
-}
-
-SceneNode* SceneNode::GetChild(int row) const{
-  if(row>=0 && row<nodes_.size()){
-    return nodes_[row];
-  }
-  return NULL;
+SceneNode* SceneNode::GetChild(int row) const
+{
+  return dynamic_cast<SceneNode*>(this->children()[row]);
 }
 
-QVariant SceneNode::GetData(int column, int role){
+QVariant SceneNode::GetData(int column, int role)
+{
   return QVariant();
 }
 
diff --git a/modules/gui/src/scene_win/scene_node.hh b/modules/gui/src/scene_win/scene_node.hh
index f701e67b5508d7b3486b8d0cb05dc912803a3258..6b183788d5e336f97e9e44e257e752d3f98905c0 100644
--- a/modules/gui/src/scene_win/scene_node.hh
+++ b/modules/gui/src/scene_win/scene_node.hh
@@ -39,13 +39,13 @@ class DLLEXPORT_OST_GUI SceneNode : public QObject {
 public:
   SceneNode(SceneNode* node_parent);
   SceneNode(QObject* parent=0);
+  virtual ~SceneNode();
 
-  SceneNode* GetParent() const;
-  virtual void AddChild(SceneNode* node);
-  virtual void RemoveChild(SceneNode* node);
-  virtual bool IsParent(SceneNode* node) const;
+  SceneNode* GetParent() const { return dynamic_cast<SceneNode*>(this->parent()); }
+  void AddChild(SceneNode* node) {
+    node->setParent(this);
+  }
   virtual SceneNode* GetChild(int row) const;
-  virtual int GetChildCount() const;
   virtual int GetChildRow(const SceneNode* node) const;
   virtual int GetRow() const;
   virtual QVariant GetData(int column, int role);
@@ -54,7 +54,6 @@ public:
   virtual int GetColumnCount() const;
 private:
   SceneNode* parent_;
-  SceneNodeList nodes_;
 };
 
 }}
diff --git a/modules/gui/src/scene_win/scene_win_model.cc b/modules/gui/src/scene_win/scene_win_model.cc
index 08cebc4491118b5656a74443be5a1c8aa1a29b7d..f712174f2e6135717348d9bfc1dfcb65d06fe681 100644
--- a/modules/gui/src/scene_win/scene_win_model.cc
+++ b/modules/gui/src/scene_win/scene_win_model.cc
@@ -116,12 +116,9 @@ QModelIndex SceneWinModel::index(int row, int col,
 {
   SceneNode* parent_node = GetItem(parent);
 
-  SceneNode* child_node = parent_node->GetChild(row);
-  if (child_node) {
-    return createIndex(row, col, child_node);
-  } else {
-    return QModelIndex();    
-  }
+  if (parent_node->children().size() <= row)
+    return QModelIndex();
+  return createIndex(row, col, parent_node->GetChild(row));
 }
 
 QModelIndex SceneWinModel::parent(const QModelIndex& index) const
@@ -141,7 +138,7 @@ int SceneWinModel::rowCount(const QModelIndex& parent) const
 {
   SceneNode* parent_node = GetItem(parent);
 
-  return parent_node->GetChildCount();
+  return parent_node->children().size();
 }
 
 int SceneWinModel::columnCount(const QModelIndex& parent) const
@@ -270,8 +267,8 @@ void SceneWinModel::SelectionChanged(const gfx::GfxObjP& obj,
 
 void SceneWinModel::RenderModeChanged(const gfx::GfxNodeP& node)
 {
-  if(render_observers_.contains(node)){
-    render_observers_[node]->RenderModeChanged();
+  if(render_observers_.contains(node.get())){
+    render_observers_[node.get()]->RenderModeChanged();
   }
 }
 
@@ -288,7 +285,7 @@ bool SceneWinModel::AddNode(SceneNode* parent, SceneNode* child)
 {
   QModelIndex parent_index=this->GetIndexOf(parent);
   if(parent_index.isValid()){
-    int row = parent->GetChildCount();
+    int row = parent->children().size();
     this->beginInsertRows(parent_index,row,row);
     parent->AddChild(child);
     this->endInsertRows();
@@ -305,8 +302,9 @@ bool SceneWinModel::RemoveNode(SceneNode* node)
     QModelIndex parent_index =this->GetIndexOf(parent);
     int row = node->GetRow();
     this->beginRemoveRows(parent_index,row,row);
-    parent->RemoveChild(node);
     this->endRemoveRows();
+    node->setParent(NULL);
+    delete node;
     return true;
   }
   return false;
@@ -315,13 +313,13 @@ bool SceneWinModel::RemoveNode(SceneNode* node)
 
 void SceneWinModel::AttachRenderModeObserver(RenderModesNode* node)
 {
-  render_observers_.insert(node->GetGfxNode(),node);
+  render_observers_.insert(node->GetGfxNode().get(),node);
 }
 
 void SceneWinModel::DetachRenderModeObserver(RenderModesNode* node)
 {
-  if(render_observers_.contains(node->GetGfxNode())){
-    render_observers_.remove(node->GetGfxNode());
+  if(render_observers_.contains(node->GetGfxNode().get())){
+    render_observers_.remove(node->GetGfxNode().get());
   }
 }
 
@@ -351,7 +349,7 @@ QModelIndex SceneWinModel::GetIndex(SceneNode* node, QModelIndex parent,
   if(parent.isValid()){
     SceneNode* parent_node =reinterpret_cast<SceneNode*>(parent.internalPointer());
     if (parent_node == node) return parent;
-    for (int i=parent_node->GetChildCount()-1; i>=0; --i) {
+    for (int i=parent_node->children().size()-1; i>=0; --i) {
       SceneNode* child = parent_node->GetChild(i);
       if(child == node){
         if(column<child->GetColumnCount())
diff --git a/modules/gui/src/scene_win/scene_win_model.hh b/modules/gui/src/scene_win/scene_win_model.hh
index c476b16f2c1b14d8fa5fed73546a51cd172b2f38..3382331640b0e9b74166d784cb43be15095ee349 100644
--- a/modules/gui/src/scene_win/scene_win_model.hh
+++ b/modules/gui/src/scene_win/scene_win_model.hh
@@ -106,7 +106,7 @@ private:
   SceneNode* root_node_;
   SceneNode* scene_node_;
 
-  QMap<gfx::GfxNodeP, RenderModesNode*> render_observers_;
+  QMap<gfx::GfxNode*, RenderModesNode*>    render_observers_;
   QMap<gfx::GfxNode*, SceneNode*>       node_map_;
 };