Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 026bef57c11cf9d09d87056dab378f0b357f2a4c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 8d5fbf175be3a0dab17997f67f03c1284b6174fb)
@@ -53,5 +53,6 @@
 #include "Element/periodentafel.hpp"
 #include "LinearAlgebra/Vector.hpp"
-#include "GLMoleculeObject_bond.hpp"
+#include "UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp"
+#include "UIElements/Views/Qt4/QtInstanceInformationBoard.hpp"
 #include "World.hpp"
 #include "WorldTime.hpp"
@@ -65,4 +66,16 @@
   Observable::channels_t channels;
   channels += AtomObservable::BondsAdded, AtomObservable::BondsRemoved;
+  return channels;
+}
+
+static const Observable::channels_t getAllObservedChannels()
+{
+  Observable::channels_t channels;
+  channels +=
+      AtomObservable::IndexChanged,
+      AtomObservable::PositionChanged,
+      AtomObservable::ElementChanged,
+      AtomObservable::BondsAdded,
+      AtomObservable::BondsRemoved;
   return channels;
 }
@@ -81,23 +94,6 @@
     QGLSceneNode *mesh[],
     QObject *parent,
-    const atomId_t _id) :
-  GLMoleculeObject(mesh, parent),
-  Observer(std::string("GLMoleculeObject_atom")+toString(_id)),
-  atomref(getAtom(_id)),
-  ObservedValues(MAX_ObservedTypes),
-  subjectKilledCount(0),
-  owner(NULL)
-{
-  boost::function<void(const atomId_t)> subjectKilled =
-      boost::bind(&GLMoleculeObject_atom::countsubjectKilled, this, _id);
-  initObservedValues(ObservedValues, _id, atomref, subjectKilled);
-
-  init(_id);
-}
-
-GLMoleculeObject_atom::GLMoleculeObject_atom(
-    QGLSceneNode *mesh[],
-    QObject *parent,
     const atomId_t _id,
+    QtInstanceInformationBoard * _board,
     std::vector<boost::any> _ObservedValues) :
   GLMoleculeObject(mesh, parent),
@@ -106,5 +102,8 @@
   ObservedValues(_ObservedValues),
   subjectKilledCount(0),
-  owner(NULL)
+  owner(NULL),
+  AllsignedOnChannels(getAllObservedChannels().size()),
+  signedOnChannels(0),
+  board(_board)
 {
   init(_id);
@@ -130,4 +129,7 @@
   connect( this, SIGNAL(positionChanged()), this, SLOT(resetPosition()), Qt::QueuedConnection);
   connect( this, SIGNAL(bondsChanged()), this, SLOT(resetPosition()), Qt::QueuedConnection);
+
+  // use that ObservedValues::AtomBonds is always up-to-date
+  resetBonds();
 }
 
@@ -135,10 +137,9 @@
 {
   if (atomref != NULL) {
+    Observable::channels_t channels = getAllObservedChannels();
     owner = static_cast<const Observable *>(atomref);
-    owner->signOn(this, AtomObservable::IndexChanged);
-    owner->signOn(this, AtomObservable::PositionChanged);
-    owner->signOn(this, AtomObservable::ElementChanged);
-    owner->signOn(this, AtomObservable::BondsAdded);
-    owner->signOn(this, AtomObservable::BondsRemoved);
+    for (Observable::channels_t::const_iterator iter = channels.begin();
+        iter != channels.end(); ++iter)
+      owner->signOn(this, *iter);
   }
 }
@@ -149,10 +150,10 @@
   // sign Off
   if (owner != NULL) {
-    owner->signOff(this, AtomObservable::IndexChanged);
-    owner->signOff(this, AtomObservable::PositionChanged);
-    owner->signOff(this, AtomObservable::ElementChanged);
-    owner->signOff(this, AtomObservable::BondsAdded);
-    owner->signOff(this, AtomObservable::BondsRemoved);
+    Observable::channels_t channels = getAllObservedChannels();
+    for (Observable::channels_t::const_iterator iter = channels.begin();
+        iter != channels.end(); ++iter)
+      owner->signOff(this, *iter);
     owner = NULL;
+    signedOnChannels = 0;
   }
 }
@@ -161,5 +162,5 @@
 {
   deactivateObserver();
-  destroyObservedValues(ObservedValues);
+  board->returnAtomObservedValues(getAtomIndex(), ObservedValues);
 }
 
@@ -338,7 +339,12 @@
 void GLMoleculeObject_atom::subjectKilled(Observable *publisher)
 {
-  deactivateObserver();
-
-  countsubjectKilled(getAtomIndex());
+  ++signedOnChannels;
+
+  if (signedOnChannels == AllsignedOnChannels) {
+    // remove owner: no more signOff needed
+    owner = NULL;
+
+    board->atomcountsubjectKilled(getAtomIndex());
+  }
 }
 
@@ -371,12 +377,4 @@
 }
 
-void GLMoleculeObject_atom::countsubjectKilled(const atomId_t)
-{
-  ++subjectKilledCount;
-
-  if (subjectKilledCount > ObservedValues.size())
-    emit InstanceRemoved(getAtomIndex());
-}
-
 void GLMoleculeObject_atom::initObservedValues(
     std::vector<boost::any> &_ObservedValues,
