Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 15c8a9b3bc531ef54d3a92deddc382002414247c)
+++ 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,
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 15c8a9b3bc531ef54d3a92deddc382002414247c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 8d5fbf175be3a0dab17997f67f03c1284b6174fb)
@@ -38,10 +38,6 @@
       QGLSceneNode *mesh[],
       QObject *parent,
-      const atomId_t id
-      );
-  GLMoleculeObject_atom(
-      QGLSceneNode *mesh[],
-      QObject *parent,
       const atomId_t id,
+      QtInstanceInformationBoard * _board,
       std::vector<boost::any> _ObservedValues
       );
@@ -75,5 +71,4 @@
   void elementChanged();
   void bondsChanged();
-  void InstanceRemoved(const atomId_t);
 
 private:
@@ -173,14 +168,4 @@
   ListOfBonds_t getAtomBonds() const;
 
-  /** Counts how many ObservedValues got subjectKilled.
-   *
-   * This is used to give InstanceRemoved() signal only when each and every
-   * ObservedValue (and the instance itself) has been subjectKilled by the
-   * monitored Observable. Only then can we safely remove the instance.
-   *
-   * \param _atomid id of atom who signalled subjectKilled()
-   */
-  void countsubjectKilled(const atomId_t _atomid);
-
   //!> counts how many ObservedValues have already been subjectKilled()
   mutable size_t subjectKilledCount;
@@ -199,4 +184,10 @@
   //!> the Observable we are signed on, also indicates whether we are sign on (not NULL)
   const Observable *owner;
+
+  //!> we get multiple subjectKilled(), count and call callback() only on last
+  const unsigned int AllsignedOnChannels;
+  unsigned int signedOnChannels;
+
+  QtInstanceInformationBoard * board;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 15c8a9b3bc531ef54d3a92deddc382002414247c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 8d5fbf175be3a0dab17997f67f03c1284b6174fb)
@@ -55,4 +55,5 @@
 #include "LinearAlgebra/Line.hpp"
 #include "LinearAlgebra/Vector.hpp"
+#include "UIElements/Views/Qt4/QtInstanceInformationBoard.hpp"
 #include "World.hpp"
 
@@ -69,4 +70,11 @@
 const Observable::channels_t
 GLMoleculeObject_bond::BondElementChannels(1, AtomObservable::ElementChanged);
+
+static GLMoleculeObject_bond::bondIds_t getBondIdsForIds(
+    const boost::function<const atomId_t()> &_left,
+    const boost::function<const atomId_t()> &_right)
+{
+  return std::make_pair(_left(), _right());
+}
 
 GLMoleculeObject_bond::GLMoleculeObject_bond(
@@ -87,5 +95,10 @@
   subjectKilledCount(0),
   leftobservable_enabled(false),
-  rightobservable_enabled(false)
+  rightobservable_enabled(false),
+  board_subjectKilled(
+      boost::bind(
+          static_cast<void (GLMoleculeObject_bond::*) ()>(
+              &GLMoleculeObject_bond::countsubjectKilled),
+          this))
 {
   boost::function<void(const atomId_t &)> leftsubjectKilled =
@@ -123,5 +136,6 @@
     const bondIds_t bondIds,
     const enum SideOfBond side,
-    std::vector<boost::any> &_ObservedValues) :
+    std::vector<boost::any> &_ObservedValues,
+    const boost::function<void (const bondIds_t)> &_subjectKilled) :
   GLMoleculeObject(mesh, parent),
   Observer(std::string("GLMoleculeObject_bond")
@@ -136,5 +150,6 @@
   subjectKilledCount(0),
   leftobservable_enabled(false),
-  rightobservable_enabled(false)
+  rightobservable_enabled(false),
+  board_subjectKilled(_subjectKilled)
 {
   init();
@@ -209,5 +224,5 @@
   removeChannels();
   // check whether we should be removed
-  countsubjectKilled(std::make_pair(getleftIndex(), getrightIndex()));
+  board_subjectKilled(std::make_pair(getleftIndex(), getrightIndex()));
 }
 
@@ -389,11 +404,4 @@
 }
 
-static GLMoleculeObject_bond::bondIds_t getBondIdsForIds(
-    const boost::function<const atomId_t ()> _left,
-    const boost::function<const atomId_t ()> _right)
-{
-  return std::make_pair( _left(), _right());
-}
-
 void GLMoleculeObject_bond::initObservedValues(
     std::vector<boost::any> &_ObservedValues,
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 15c8a9b3bc531ef54d3a92deddc382002414247c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 8d5fbf175be3a0dab17997f67f03c1284b6174fb)
@@ -18,4 +18,5 @@
 #include <vector>
 #include <boost/any.hpp>
+#include <boost/function.hpp>
 
 #include "CodePatterns/Observer/Observer.hpp"
@@ -49,5 +50,6 @@
       const bondIds_t bondIds,
       const enum SideOfBond side,
-      std::vector<boost::any> &_ObservedValues);
+      std::vector<boost::any> &_ObservedValues,
+      const boost::function<void (const bondIds_t)> &_subjectKilled);
   virtual ~GLMoleculeObject_bond();
 
@@ -255,4 +257,7 @@
   //!> list of channels when element needs to update
   static const Observable::channels_t BondElementChannels;
+
+  //!> callback function to inform about subjectKilled()
+  const boost::function<void (const bondIds_t)> board_subjectKilled;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 15c8a9b3bc531ef54d3a92deddc382002414247c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 8d5fbf175be3a0dab17997f67f03c1284b6174fb)
@@ -45,4 +45,5 @@
 
 #include "CodePatterns/Assert.hpp"
+#include "CodePatterns/IteratorAdaptors.hpp"
 #include "CodePatterns/Log.hpp"
 #include "CodePatterns/Observer/Notification.hpp"
@@ -61,4 +62,5 @@
 #include "Tesselation/BoundaryTriangleSet.hpp"
 #include "Tesselation/CandidateForTesselation.hpp"
+#include "UIElements/Views/Qt4/QtInstanceInformationBoard.hpp"
 #include "Atom/TesselPoint.hpp"
 #include "World.hpp"
@@ -70,11 +72,4 @@
 
 #include "GLMoleculeObject_atom.hpp"
-
-static Observable::channels_t getAtomsChannels()
-{
-  Observable::channels_t channels;
-  channels += molecule::AtomInserted, molecule::AtomRemoved;
-  return channels;
-}
 
 static Observable::channels_t getAllAtomicChangesChannels()
@@ -85,6 +80,12 @@
 }
 
+static Observable::channels_t getAllAtomicObservedChannels()
+{
+  Observable::channels_t channels;
+  channels += molecule::AtomInserted, molecule::AtomRemoved, molecule::AtomMoved;
+  return channels;
+}
+
 // static instances
-const Observable::channels_t GLMoleculeObject_molecule::AtomsChannels(getAtomsChannels());
 const Observable::channels_t GLMoleculeObject_molecule::HullChannels(getAllAtomicChangesChannels());
 const Observable::channels_t GLMoleculeObject_molecule::BoundingBoxChannels(1, molecule::BoundingBoxChanged);
@@ -101,5 +102,9 @@
 }
 
-GLMoleculeObject_molecule::GLMoleculeObject_molecule(QObject *parent, const moleculeId_t _molid) :
+GLMoleculeObject_molecule::GLMoleculeObject_molecule(
+    QObject *parent,
+    const moleculeId_t _molid,
+    QtInstanceInformationBoard * _board,
+    std::vector<boost::any> _ObservedValues) :
   GLMoleculeObject((QGLSceneNode *)NULL, parent),
   Observer(std::string("GLMoleculeObject_molecule")+toString(_molid)),
@@ -110,5 +115,5 @@
    * the class has not been fully constructed yet. "This" itself seems to be working fine.
    */
-  ObservedValues(MAX_ObservedTypes),
+  ObservedValues(_ObservedValues),
   subjectKilledCount(0),
   TesselationHullUpdater(
@@ -120,10 +125,46 @@
       "MoleculeTesselationHull_"+toString(_molid),
       HullChannels),
-  hoverAtomId(-1)
-{
-  boost::function<void(const moleculeId_t)> subjectKilled =
-      boost::bind(&GLMoleculeObject_molecule::countsubjectKilled, this, _molid);
-  initObservedValues(ObservedValues, _molid, molref, subjectKilled);
-
+  hoverAtomId(-1),
+  AllsignedOnChannels(getAllAtomicObservedChannels().size()),
+  signedOnChannels(0),
+  board(_board)
+{
+  init(_molid);
+}
+
+GLMoleculeObject_molecule::GLMoleculeObject_molecule(
+    QGLSceneNode *mesh[],
+    QObject *parent,
+    const moleculeId_t _molid,
+    QtInstanceInformationBoard * _board,
+    std::vector<boost::any> _ObservedValues) :
+  GLMoleculeObject(mesh, parent),
+  Observer(std::string("GLMoleculeObject_molecule")+toString(_molid)),
+  owner(NULL),
+  molref(getMolecule(_molid)),
+  /* We must not use boost::cref(this) as "this" has not been properly constructed and seemingly
+   * boost::cref tries to do some magic to grasp the inheritance hierarchy which fails because
+   * the class has not been fully constructed yet. "This" itself seems to be working fine.
+   */
+  ObservedValues(_ObservedValues),
+  subjectKilledCount(0),
+  TesselationHullUpdater(
+      boost::bind(&GLMoleculeObject_molecule::updateTesselationHull, this)
+      ),
+  TesselationHull(
+      molref,
+      TesselationHullUpdater,
+      "MoleculeTesselationHull_"+toString(_molid),
+      HullChannels),
+  hoverAtomId(-1),
+  AllsignedOnChannels(getAllAtomicObservedChannels().size()),
+  signedOnChannels(0),
+  board(_board)
+{
+  init(_molid);
+}
+
+void GLMoleculeObject_molecule::init(const moleculeId_t _molid)
+{
   setObjectId(_molid);
   setMaterial(getMaterial(1));
@@ -133,4 +174,6 @@
   // initially, atoms and bonds should be visible
   m_visible = false;
+
+  activateObserver();
 
   connect (this, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
@@ -147,57 +190,8 @@
 }
 
-GLMoleculeObject_molecule::GLMoleculeObject_molecule(
-    QGLSceneNode *mesh[],
-    QObject *parent,
-    const moleculeId_t _molid) :
-  GLMoleculeObject(mesh, parent),
-  Observer(std::string("GLMoleculeObject_molecule")+toString(_molid)),
-  owner(NULL),
-  molref(getMolecule(_molid)),
-  /* We must not use boost::cref(this) as "this" has not been properly constructed and seemingly
-   * boost::cref tries to do some magic to grasp the inheritance hierarchy which fails because
-   * the class has not been fully constructed yet. "This" itself seems to be working fine.
-   */
-  ObservedValues(MAX_ObservedTypes),
-  subjectKilledCount(0),
-  TesselationHullUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateTesselationHull, this)
-      ),
-  TesselationHull(
-      molref,
-      TesselationHullUpdater,
-      "MoleculeTesselationHull_"+toString(_molid),
-      HullChannels),
-  hoverAtomId(-1)
-{
-  boost::function<void(const moleculeId_t)> subjectKilled =
-      boost::bind(&GLMoleculeObject_molecule::countsubjectKilled, this, _molid);
-  initObservedValues(ObservedValues, _molid, molref, subjectKilled);
-
-  setObjectId(_molid);
-  setMaterial(getMaterial(1));
-
-  m_selected = const_cast<const World &>(World::getInstance()).isMoleculeSelected(_molid);
-
-  // initially, atoms and bonds should be visible
-  m_visible = false;
-
-  connect (this, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
-  connect (this, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
-  connect (this, SIGNAL(TesselationHullChanged()), this, SLOT(resetTesselationHull()), Qt::QueuedConnection);
-  connect (this, SIGNAL(BoundingBoxChanged()), this, SLOT(resetBoundingBox()), Qt::QueuedConnection);
-  connect (this, SIGNAL(IdChanged()), this, SLOT(resetIndex()), Qt::QueuedConnection);
-  connect (this, SIGNAL(AtomInserted(const atomId_t)), this, SLOT(atomInserted(const atomId_t)), Qt::QueuedConnection);
-  connect (this, SIGNAL(AtomInserted(const atomId_t)), this, SLOT(resetAtoms()), Qt::QueuedConnection);
-  connect (this, SIGNAL(AtomRemoved(const atomId_t)), this, SLOT(resetAtoms()), Qt::QueuedConnection);
-  connect (this, SIGNAL(AtomRemoved(const atomId_t)), this, SLOT(atomRemoved(const atomId_t)), Qt::QueuedConnection);
-
-  connect( this, SIGNAL(clicked()), this, SLOT(wasClicked()));
-}
-
 GLMoleculeObject_molecule::~GLMoleculeObject_molecule()
 {
   deactivateObserver();
-  destroyObservedValues(ObservedValues);
+  board->returnMoleculeObservedValues(getMolIndex(), ObservedValues);
 }
 
@@ -205,9 +199,10 @@
 {
   if (owner != NULL) {
-    owner->signOff(this, molecule::AtomInserted);
-    owner->signOff(this, molecule::AtomRemoved);
-    owner->signOff(this, molecule::AtomMoved);
-    owner->signOff(this, molecule::IndexChanged);
+    Observable::channels_t channels = getAllAtomicObservedChannels();
+    for (Observable::channels_t::const_iterator iter = channels.begin();
+        iter != channels.end(); ++iter)
+      owner->signOff(this, *iter);
     owner = NULL;
+    signedOnChannels = 0;
   }
 }
@@ -218,9 +213,9 @@
   const molecule * const _molecule = getMolecule(getMolIndex());
   if (_molecule != NULL) {
+    Observable::channels_t channels = getAllAtomicObservedChannels();
     owner = static_cast<const Observable *>(_molecule);
-    owner->signOn(this, molecule::AtomInserted);
-    owner->signOn(this, molecule::AtomRemoved);
-    owner->signOn(this, molecule::AtomMoved);
-    owner->signOn(this, molecule::IndexChanged);
+    for (Observable::channels_t::const_iterator iter = channels.begin();
+        iter != channels.end(); ++iter)
+      owner->signOn(this, *iter);
   } else {
     ELOG(1, "GLMoleculeObject_molecule() - added null object for not present mol id " << getMolIndex());
@@ -244,32 +239,4 @@
     BondsinSceneMap[ids]->resetWidth();
   }
-}
-
-void GLMoleculeObject_molecule::addAtomBonds(
-    const atomId_t _id)
-{
-  const atom * const Walker = const_cast<const World &>(World::getInstance()).
-      getAtom(AtomById(_id));
-  if (Walker != NULL) {
-    const bool atom_present = AtomsinSceneMap.count(_id);
-    const BondList &bondlist = Walker->getListOfBonds();
-    for (BondList::const_iterator bonditer = bondlist.begin();
-        (bonditer != bondlist.end()) && atom_present;
-        ++bonditer) {
-      const bond::ptr _bond = *bonditer;
-      // check if OtherAtom's sphere is already present
-      const atom *OtherAtom = _bond->GetOtherAtom(Walker);
-      const bool otheratom_present = AtomsinSceneMap.count(OtherAtom->getId());
-      if (otheratom_present && atom_present) {
-        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == Walker) ?
-            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
-        const GLMoleculeObject_bond::SideOfBond otherside = (_bond->leftatom == Walker) ?
-            GLMoleculeObject_bond::right : GLMoleculeObject_bond::left;
-        addAtomBonds(_bond, side);
-        addAtomBonds(_bond, otherside);
-      }
-    }
-  } else
-    ELOG(1, "GLMoleculeObject_atom disappeared while about to add bonds.");
 }
 
@@ -389,29 +356,4 @@
 }
 
-void GLMoleculeObject_molecule::resetAtoms()
-{
-  const atoms_t atoms = getPresentAtoms();
-  std::vector<atomId_t> InsertedAtoms;
-  std::vector<atomId_t> RemovedAtoms;
-  // obtain all newly inserted and removed atoms
-  std::set_difference(
-      atoms.begin(), atoms.end(),
-      DisplayedAtoms.begin(), DisplayedAtoms.end(),
-      std::back_inserter(InsertedAtoms));
-  std::set_difference(
-      DisplayedAtoms.begin(), DisplayedAtoms.end(),
-      atoms.begin(), atoms.end(),
-      std::back_inserter(RemovedAtoms));
-  // remove the atoms
-  std::for_each(RemovedAtoms.begin(), RemovedAtoms.end(),
-      boost::bind(&GLMoleculeObject_molecule::atomRemoved, this, _1));
-  // insert the atoms
-  std::for_each(InsertedAtoms.begin(), InsertedAtoms.end(),
-      boost::bind(&GLMoleculeObject_molecule::atomInserted, this, _1));
-  DisplayedAtoms = atoms;
-
-  emit changed();
-}
-
 void GLMoleculeObject_molecule::resetIndex()
 {
@@ -479,8 +421,12 @@
 void GLMoleculeObject_molecule::subjectKilled(Observable *publisher)
 {
-  // remove owner: no more signOff needed
-  owner = NULL;
-
-  countsubjectKilled(getMolIndex());
+  ++signedOnChannels;
+
+  if (signedOnChannels == AllsignedOnChannels) {
+    // remove owner: no more signOff needed
+    owner = NULL;
+
+    board->moleculecountsubjectKilled(getMolIndex());
+  }
 }
 
@@ -492,5 +438,5 @@
     return;
   if (publisher == dynamic_cast<const Observable*>(_molecule)){
-    // notofication from atom
+    // notification from atom
 #ifdef LOG_OBSERVER
     observerLog().addMessage() << "++ Update of Observer "<< observerLog().getName(static_cast<Observer *>(this))
@@ -500,28 +446,8 @@
     switch (notification->getChannelNo()) {
       case molecule::AtomInserted:
-      {
-        const atomId_t _id = _molecule->lastChangedAtomId();
-  #ifdef LOG_OBSERVER
-        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been inserted.";
-  #endif
-        emit AtomInserted(_id);
-        emit TesselationHullChanged();
-        emit BoundingBoxChanged();
-        break;
-      }
-      case World::AtomRemoved:
-      {
-//        const atomId_t _id = _molecule->lastChangedAtomId();
-  #ifdef LOG_OBSERVER
-        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been removed.";
-  #endif
-        emit TesselationHullChanged();
-        emit BoundingBoxChanged();
-        break;
-      }
+      case molecule::AtomRemoved:
       case molecule::AtomMoved:
       {
   #ifdef LOG_OBSERVER
-        const atomId_t _id = _molecule->lastChangedAtomId();
         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been inserted.";
   #endif
@@ -638,5 +564,11 @@
   LOG(3, "INFO: GLMoleculeObject_molecule: Received signal atomInserted for atom "+toString(_id)+".");
 
-  GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(GLMoleculeObject::meshSphere, this, _id);
+  GLMoleculeObject_atom *atomObject =
+      new GLMoleculeObject_atom(
+          GLMoleculeObject::meshSphere,
+          this,
+          _id,
+          board,
+          board->getAtomObservedValues(_id));
   ASSERT( atomObject != NULL,
       "GLMoleculeObject_molecule::atomInserted - could not create atom object for "+toString(_id));
@@ -657,12 +589,9 @@
   connect (atomObject, SIGNAL(BondsRemoved(const atomId_t, const atomId_t)), this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
   connect (atomObject, SIGNAL(indexChanged(GLMoleculeObject_atom*, const atomId_t, const atomId_t)), this, SLOT(changeAtomId(GLMoleculeObject_atom*, const atomId_t, const atomId_t)));
-  connect (atomObject, SIGNAL(InstanceRemoved(const atomId_t)), this, SIGNAL(AtomRemoved(const atomId_t)));
 
   if (m_objectId  == -1)
     setObjectId(_id);
 
-  // add all bonds
-  addAtomBonds(_id);
-
+  emit changed();
   emit changeOccured();
 }
@@ -691,4 +620,5 @@
   delete atomObject;
 
+  emit changed();
   emit changeOccured();
 }
@@ -766,4 +696,5 @@
     iter->second->resetWidth();
   }
+  emit changed();
   emit changeOccured();
 }
@@ -790,4 +721,5 @@
   }
 
+  emit changed();
   emit changeOccured();
 }
@@ -800,4 +732,7 @@
   // then emit onward
   GLMoleculeObject::setVisible(value);
+
+  emit changed();
+  emit changeOccured();
 }
 
@@ -844,12 +779,4 @@
       getMolecule(MoleculeById(_id));
   return mol;
-}
-
-void GLMoleculeObject_molecule::countsubjectKilled(const moleculeId_t)
-{
-  ++subjectKilledCount;
-
-  if (subjectKilledCount > ObservedValues.size())
-    emit InstanceRemoved(getMolIndex());
 }
 
@@ -911,10 +838,4 @@
       _subjectKilled,
       MolIndexGetter);
-  _ObservedValues[PresentAtoms] = new ObservedValue_UpdateAtoms(
-      _molref,
-      "MoleculeAtoms_"+toString(_molid),
-      AtomsChannels,
-      _subjectKilled,
-      MolIndexGetter);
 }
 
@@ -925,5 +846,4 @@
   delete boost::any_cast<ObservedValue_wCallback<std::string, moleculeId_t> *>(_ObservedValues[MolName]);
   delete boost::any_cast<ObservedValue_wCallback<molecule::BoundingBoxInfo, moleculeId_t> *>(_ObservedValues[BoundingBox]);
-  delete boost::any_cast<ObservedValue_UpdateAtoms *>(_ObservedValues[PresentAtoms]);
   _ObservedValues.clear();
 }
@@ -946,4 +866,8 @@
 GLMoleculeObject_molecule::atoms_t GLMoleculeObject_molecule::getPresentAtoms() const
 {
-  return boost::any_cast<ObservedValue_UpdateAtoms *>(ObservedValues[PresentAtoms])->get();
-}
+  atoms_t returnAtomIds;
+  returnAtomIds.insert(
+      MapKeyConstIterator<AtomNodeMap::const_iterator>(const_cast<const AtomNodeMap &>(AtomsinSceneMap).begin()),
+      MapKeyConstIterator<AtomNodeMap::const_iterator>(const_cast<const AtomNodeMap &>(AtomsinSceneMap).end()));
+  return returnAtomIds;
+}
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 15c8a9b3bc531ef54d3a92deddc382002414247c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 8d5fbf175be3a0dab17997f67f03c1284b6174fb)
@@ -42,9 +42,13 @@
   GLMoleculeObject_molecule(
       QObject *parent,
-      const moleculeId_t molid);
+      const moleculeId_t molid,
+      QtInstanceInformationBoard * _board,
+      std::vector<boost::any> _ObservedValues);
   GLMoleculeObject_molecule(
       QGLSceneNode *mesh[],
       QObject *parent,
-      const moleculeId_t molid);
+      const moleculeId_t molid,
+      QtInstanceInformationBoard * _board,
+      std::vector<boost::any> _ObservedValues);
   virtual ~GLMoleculeObject_molecule();
 
@@ -78,5 +82,4 @@
   void AtomRemoved(const atomId_t _id);
   void IdChanged();
-  void InstanceRemoved(const moleculeId_t);
 
 private slots:
@@ -99,5 +102,4 @@
   void resetTesselationHull();
   void resetBoundingBox();
-  void resetAtoms();
   void resetIndex();
   void resetName();
@@ -111,4 +113,6 @@
   static const molecule * const getMolecule(const moleculeId_t _id);
 
+  void init(const moleculeId_t _molid);
+
 private:
   void addAtomBonds(
@@ -116,5 +120,4 @@
       const GLMoleculeObject_bond::SideOfBond _side
       );
-  void addAtomBonds(const atomId_t _id);
 
   //!> typedef for the internal set of atoms
@@ -130,4 +133,10 @@
       const boost::function<const moleculeId_t ()> &_getMolIndex);
 
+  /** Getter to contained atoms contained in \a ObservedValues.
+   *
+   * \return molecule's contained atoms
+   */
+  atoms_t getPresentAtoms() const;
+
   //!> the Observable we are signed on, also indicates whether we are sign on (not NULL)
   const Observable * owner;
@@ -136,6 +145,4 @@
   const molecule * const molref;
 
-  //!> list of channels when contained atoms needs to update
-  static const Observable::channels_t AtomsChannels;
   //!> list of channels when tesselation hull needs to update
   static const Observable::channels_t HullChannels;
@@ -159,6 +166,4 @@
     //!> contains newest version of the bounding box on request
     BoundingBox,
-    //!> contains the current live set of atoms for the molecule
-    PresentAtoms,
     //!> gives the size of the enumeration
     MAX_ObservedTypes
@@ -206,20 +211,4 @@
   molecule::BoundingBoxInfo getBoundingBox() const;
 
-  /** Getter to contained atoms contained in \a ObservedValues.
-   *
-   * \return molecule's contained atoms
-   */
-  atoms_t getPresentAtoms() const;
-
-  /** Counts how many ObservedValues got subjectKilled.
-   *
-   * This is used to give InstanceRemoved() signal only when each and every
-   * ObservedValue (and the instance itself) has been subjectKilled by the
-   * monitored Observable. Only then can we safely remove the instance.
-   *
-   * \param _molid molecule id who signalled subjectKilled()
-   */
-  void countsubjectKilled(const moleculeId_t _molid);
-
   //!> counts how many ObservedValues have already been subjectKilled()
   mutable size_t subjectKilledCount;
@@ -241,4 +230,10 @@
 
   atomId_t hoverAtomId;
+
+  //!> we get multiple subjectKilled(), count and call callback() only on last
+  const unsigned int AllsignedOnChannels;
+  unsigned int signedOnChannels;
+
+  QtInstanceInformationBoard * board;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 15c8a9b3bc531ef54d3a92deddc382002414247c)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 8d5fbf175be3a0dab17997f67f03c1284b6174fb)
@@ -94,6 +94,4 @@
     GLMoleculeObject::meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true);
   }
-  connect(board, SIGNAL(moleculeIndexChanged(const moleculeId_t, const moleculeId_t)),
-      this, SLOT(moleculeIndexChanged(const moleculeId_t, const moleculeId_t)));
   connect(board, SIGNAL(moleculeInserted(const moleculeId_t)),
       this, SLOT(moleculeInserted(const moleculeId_t)));
@@ -102,4 +100,8 @@
   connect(board, SIGNAL(moleculeIndexChanged(const moleculeId_t, const moleculeId_t)),
       this, SLOT(moleculeIndexChanged(const moleculeId_t, const moleculeId_t)));
+  connect(board, SIGNAL(atomInserted(const moleculeId_t, const atomId_t)),
+      this, SLOT(atomInserted(const moleculeId_t, const atomId_t)), Qt::DirectConnection);
+  connect(board, SIGNAL(atomRemoved(const moleculeId_t, const atomId_t)),
+      this, SLOT(atomRemoved(const moleculeId_t, const atomId_t)), Qt::DirectConnection);
 
 //  connect(this, SIGNAL(updated()), this, SLOT(update()));
@@ -199,6 +201,12 @@
 
   // check of molecule is already present
-  if (MoleculesinSceneMap.count(_molid) != 0) {
+  MoleculeNodeMap::iterator moliter = MoleculesinSceneMap.find(_molid);
+  if (moliter != MoleculesinSceneMap.end()) {
     // pass signal through
+    GLMoleculeObject_molecule *molObject = moliter->second;
+    QMetaObject::invokeMethod(molObject,        // pointer to a QObject
+                              "atomInserted",       // member name (no parameters here)
+                              Qt::QueuedConnection,     // connection type
+                              Q_ARG(const atomId_t, _atomid));     // parameters
   } else {
     // store signal for when it is instantiated
@@ -221,6 +229,12 @@
 
   // check of molecule is already present
-  if (MoleculesinSceneMap.count(_molid) != 0) {
+  MoleculeNodeMap::iterator moliter = MoleculesinSceneMap.find(_molid);
+  if (moliter != MoleculesinSceneMap.end()) {
     // pass signal through
+    GLMoleculeObject_molecule *molObject = moliter->second;
+    QMetaObject::invokeMethod(molObject,        // pointer to a QObject
+                              "atomRemoved",       // member name (no parameters here)
+                              Qt::QueuedConnection,     // connection type
+                              Q_ARG(const atomId_t, _atomid));     // parameters
   } else {
     // store signal for when it is instantiated
@@ -259,5 +273,9 @@
   GLMoleculeObject_molecule *molObject =
       new GLMoleculeObject_molecule(
-          GLMoleculeObject::meshEmpty, this, _id);
+          GLMoleculeObject::meshEmpty,
+          this,
+          _id,
+          board,
+          board->getMoleculeObservedValues(_id));
   ASSERT( molObject != NULL,
       "GLWorldScene::moleculeInserted - could not create molecule object for "+toString(_id));
@@ -290,5 +308,5 @@
           QMetaObject::invokeMethod(molObject,        // pointer to a QObject
                                     "atomInserted",       // member name (no parameters here)
-                                    Qt::DirectConnection,     // connection type
+                                    Qt::QueuedConnection,     // connection type
                                     Q_ARG(const atomId_t, iter->first));     // parameters
         } else {
@@ -307,5 +325,5 @@
             QMetaObject::invokeMethod(molObject,        // pointer to a QObject
                                       "atomInserted",       // member name (no parameters here)
-                                      Qt::DirectConnection,     // connection type
+                                      Qt::QueuedConnection,     // connection type
                                       Q_ARG(const atomId_t, iter->first));     // parameters
             break;
@@ -323,7 +341,4 @@
   }
 
-  // now let the molObject sign on to molecule
-  molObject->activateObserver();
-
   connect (molObject, SIGNAL(changed()), this, SIGNAL(changed()));
   connect (molObject, SIGNAL(changeOccured()), this, SIGNAL(changeOccured()));
@@ -335,4 +350,8 @@
   connect (molObject, SIGNAL(hoverChanged(const moleculeId_t, int)), this, SIGNAL(hoverChanged(const moleculeId_t, int)));
   connect (molObject, SIGNAL(hoverChanged(const moleculeId_t, int)), this, SIGNAL(hoverChanged(const moleculeId_t, int)));
+  connect(board, SIGNAL(atomInserted(const atomId_t)),
+      molObject, SLOT(atomInserted(const atomId_t)));
+  connect(board, SIGNAL(atomRemoved(const atomId_t)),
+      molObject, SLOT(atomRemoved(const atomId_t)));
 
   emit changed();
