Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 7a205a4846f42ef74b0d22155039fb2430f0b719)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 8688ef11c8d02f39202bf756a4085f44860a00df)
@@ -65,4 +65,5 @@
 
 #include "ObservedValue_wCallback.hpp"
+#include "ObservedValue_UpdateAtoms.hpp"
 
 using namespace boost::assign;
@@ -109,21 +110,9 @@
    * the class has not been fully constructed yet. "This" itself seems to be working fine.
    */
-  MolIndexUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateIndex, this)
-      ),
-  MolNameUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateName, this)
-      ),
+  ObservedValues(MAX_ObservedTypes),
+  subjectKilledCount(0),
   TesselationHullUpdater(
       boost::bind(&GLMoleculeObject_molecule::updateTesselationHull, this)
       ),
-  BoundingBoxUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateBoundingBox, this)
-      ),
-  PresentAtomsUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateAtoms, this)
-      ),
-  ObservedValues(MAX_ObservedTypes),
-  subjectKilledCount(0),
   TesselationHull(
       molref,
@@ -133,5 +122,7 @@
   hoverAtomId(-1)
 {
-  initObservedValues(_molid);
+  boost::function<void()> subjectKilled =
+      boost::bind(&GLMoleculeObject_molecule::countsubjectKilled, this);
+  initObservedValues(ObservedValues, _molid, molref, subjectKilled);
 
   setObjectId(_molid);
@@ -166,21 +157,9 @@
    * the class has not been fully constructed yet. "This" itself seems to be working fine.
    */
-  MolIndexUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateIndex, this)
-      ),
-  MolNameUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateName, this)
-      ),
+  ObservedValues(MAX_ObservedTypes),
+  subjectKilledCount(0),
   TesselationHullUpdater(
       boost::bind(&GLMoleculeObject_molecule::updateTesselationHull, this)
       ),
-  BoundingBoxUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateBoundingBox, this)
-      ),
-  PresentAtomsUpdater(
-      boost::bind(&GLMoleculeObject_molecule::updateAtoms, this)
-      ),
-  ObservedValues(MAX_ObservedTypes),
-  subjectKilledCount(0),
   TesselationHull(
       molref,
@@ -190,5 +169,7 @@
   hoverAtomId(-1)
 {
-  initObservedValues(_molid);
+  boost::function<void()> subjectKilled =
+      boost::bind(&GLMoleculeObject_molecule::countsubjectKilled, this);
+  initObservedValues(ObservedValues, _molid, molref, subjectKilled);
 
   setObjectId(_molid);
@@ -216,5 +197,5 @@
 {
   deactivateObserver();
-  destroyObservedValues();
+  destroyObservedValues(ObservedValues);
 }
 
@@ -366,5 +347,5 @@
 }
 
-molecule::BoundingBoxInfo GLMoleculeObject_molecule::initBoundingBox() const
+molecule::BoundingBoxInfo GLMoleculeObject_molecule::initBoundingBox()
 {
   molecule::BoundingBoxInfo info;
@@ -374,31 +355,20 @@
 }
 
-molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox() const
-{
-  return getBoundingBox();
-}
-
-GLMoleculeObject_molecule::atoms_t GLMoleculeObject_molecule::updateAtoms()
-{
-  atoms_t current_atomset = getPresentAtoms();
-  const molecule * const mol = getMolecule(getMolIndex());
-  if (mol != NULL) {
-    const atomId_t id = mol->lastChangedAtomId();
-    if (mol->containsAtom(id))
-      current_atomset.insert(id);
-    else
-      current_atomset.erase(id);
-  }
-  return current_atomset;
-}
-
-moleculeId_t GLMoleculeObject_molecule::updateIndex() const
+molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox(
+    const boost::function<const moleculeId_t ()> &_getMolIndex)
+{
+  const molecule * const mol = getMolecule(_getMolIndex());
+  return mol->getBoundingBox();
+}
+
+moleculeId_t GLMoleculeObject_molecule::updateIndex()
 {
   return const_cast<const World &>(World::getInstance()).lastChangedMolId();
 }
 
-std::string GLMoleculeObject_molecule::updateName() const
-{
-  const molecule * const mol = getMolecule(getMolIndex());
+std::string GLMoleculeObject_molecule::updateName(
+    const boost::function<const moleculeId_t ()> &_getMolIndex)
+{
+  const molecule * const mol = getMolecule(_getMolIndex());
   return mol->getName();
 }
@@ -540,5 +510,5 @@
       case World::AtomRemoved:
       {
-        const atomId_t _id = _molecule->lastChangedAtomId();
+//        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.";
@@ -882,46 +852,75 @@
 }
 
-void GLMoleculeObject_molecule::initObservedValues(const moleculeId_t _molid)
-{
-  // fill ObservedValues
-  boost::function<void()> subjectKilled =
-      boost::bind(&GLMoleculeObject_molecule::countsubjectKilled, this);
-  ObservedValues[MolIndex] = new ObservedValue_wCallback<moleculeId_t>(
-      molref,
-      MolIndexUpdater,
-      "MoleculeIndex_"+toString(_molid),
-      _molid,
-      IndexChannels,
-      subjectKilled);
-  ObservedValues[MolName] = new ObservedValue_wCallback<std::string>(
-      molref,
+void GLMoleculeObject_molecule::initObservedValues(
+    std::vector<boost::any> &_ObservedValues,
+    const moleculeId_t _molid,
+    const molecule * const _molref,
+    const boost::function<void()> &_subjectKilled)
+{
+  /* This is an old note from when the code was still part of cstor's initializer body.
+   * TODO: Probably does not apply anymore but has not yet been tested.
+   *
+   * 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.
+   */
+
+  ASSERT( _ObservedValues.size() == MAX_ObservedTypes,
+      "GLMoleculeObject_molecule::initObservedValues() - given ObservedValues has not correct size.");
+
+  // fill ObservedValues: index first
+  const boost::function<moleculeId_t ()> MolIndexUpdater(
+      boost::bind(&GLMoleculeObject_molecule::updateIndex));
+
+  ObservedValue_wCallback<moleculeId_t> * const IndexObservable =
+      new ObservedValue_wCallback<moleculeId_t>(
+        _molref,
+        MolIndexUpdater,
+        "MoleculeIndex_"+toString(_molid),
+        _molid,
+        IndexChannels,
+        _subjectKilled);
+  _ObservedValues[MolIndex] = IndexObservable;
+
+  const boost::function<const moleculeId_t ()> MolIndexGetter =
+      boost::bind(&ObservedValue_wCallback<moleculeId_t>::get,
+          IndexObservable);
+
+  // fill ObservedValues: then all the other that need index
+  const boost::function<std::string ()> MolNameUpdater(
+      boost::bind(&GLMoleculeObject_molecule::updateName, MolIndexGetter));
+  const boost::function<molecule::BoundingBoxInfo ()> BoundingBoxUpdater(
+      boost::bind(&GLMoleculeObject_molecule::updateBoundingBox, MolIndexGetter));
+
+  _ObservedValues[MolName] = new ObservedValue_wCallback<std::string>(
+      _molref,
       MolNameUpdater,
       "MoleculeName_"+toString(_molid),
-      updateName(),
+      MolNameUpdater(),
       NameChannels,
-      subjectKilled);
-  ObservedValues[BoundingBox] = new ObservedValue_wCallback<molecule::BoundingBoxInfo>(
-      molref,
+      _subjectKilled);
+  _ObservedValues[BoundingBox] = new ObservedValue_wCallback<molecule::BoundingBoxInfo>(
+      _molref,
       BoundingBoxUpdater,
       "MoleculeBoundingBox_"+toString(_molid),
       initBoundingBox(),
       BoundingBoxChannels,
-      subjectKilled);
-  ObservedValues[PresentAtoms] = new ObservedValue_wCallback<atoms_t>(
-      molref,
-      PresentAtomsUpdater,
+      _subjectKilled);
+  _ObservedValues[PresentAtoms] = new ObservedValue_UpdateAtoms(
+      _molref,
       "MoleculeAtoms_"+toString(_molid),
-      updateAtoms(),
       AtomsChannels,
-      subjectKilled);
-}
-
-void GLMoleculeObject_molecule::destroyObservedValues()
-{
-  delete boost::any_cast<ObservedValue_wCallback<moleculeId_t> *>(ObservedValues[MolIndex]);
-  delete boost::any_cast<ObservedValue_wCallback<std::string> *>(ObservedValues[MolName]);
-  delete boost::any_cast<ObservedValue_wCallback<molecule::BoundingBoxInfo> *>(ObservedValues[BoundingBox]);
-  delete boost::any_cast<ObservedValue_wCallback<atoms_t> *>(ObservedValues[PresentAtoms]);
-  ObservedValues.clear();
+      _subjectKilled,
+      MolIndexGetter);
+}
+
+void GLMoleculeObject_molecule::destroyObservedValues(
+    std::vector<boost::any> &_ObservedValues)
+{
+  delete boost::any_cast<ObservedValue_wCallback<moleculeId_t> *>(_ObservedValues[MolIndex]);
+  delete boost::any_cast<ObservedValue_wCallback<std::string> *>(_ObservedValues[MolName]);
+  delete boost::any_cast<ObservedValue_wCallback<molecule::BoundingBoxInfo> *>(_ObservedValues[BoundingBox]);
+  delete boost::any_cast<ObservedValue_UpdateAtoms *>(_ObservedValues[PresentAtoms]);
+  _ObservedValues.clear();
 }
 
@@ -943,4 +942,4 @@
 GLMoleculeObject_molecule::atoms_t GLMoleculeObject_molecule::getPresentAtoms() const
 {
-  return boost::any_cast<ObservedValue_wCallback<atoms_t> *>(ObservedValues[PresentAtoms])->get();
-}
+  return boost::any_cast<ObservedValue_UpdateAtoms *>(ObservedValues[PresentAtoms])->get();
+}
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 7a205a4846f42ef74b0d22155039fb2430f0b719)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 8688ef11c8d02f39202bf756a4085f44860a00df)
@@ -20,4 +20,5 @@
 #include <vector>
 #include <boost/any.hpp>
+#include <boost/function.hpp>
 
 #include "CodePatterns/Cacheable.hpp"
@@ -114,11 +115,12 @@
   typedef std::set<atomId_t> atoms_t;
 
-  molecule::BoundingBoxInfo initBoundingBox() const;
+  static molecule::BoundingBoxInfo initBoundingBox();
 
   QGeometryData updateTesselationHull() const;
-  molecule::BoundingBoxInfo updateBoundingBox() const;
-  atoms_t updateAtoms();
-  moleculeId_t updateIndex() const;
-  std::string updateName() const;
+  static molecule::BoundingBoxInfo updateBoundingBox(
+      const boost::function<const moleculeId_t ()> &_getMolIndex);
+  static moleculeId_t updateIndex();
+  static std::string updateName(
+      const boost::function<const moleculeId_t ()> &_getMolIndex);
 
   //!> the Observable we are signed on, also indicates whether we are sign on (not NULL)
@@ -138,10 +140,4 @@
   //!> list of channels when the name needs to update
   static const Observable::channels_t NameChannels;
-
-  boost::function<moleculeId_t ()> MolIndexUpdater;
-  boost::function<std::string ()> MolNameUpdater;
-  boost::function<QGeometryData ()> TesselationHullUpdater;
-  boost::function<molecule::BoundingBoxInfo ()> BoundingBoxUpdater;
-  boost::function<atoms_t ()> PresentAtomsUpdater;
 
 private:
@@ -165,14 +161,23 @@
   std::vector<boost::any> ObservedValues;
 
-  /** Initializes all \a ObservedValues entries.
-   *
+  /** Initializes all \a _ObservedValues entries.
+   *
+   * \param _ObservedValues vector of ObservedValue to be filled
    * \param _moid molecule id
-   */
-  void initObservedValues(const moleculeId_t _molid);
+   * \param _molref reference to molecule
+   * \param _subjectKilled ref to function to call on subjectKilled()
+   */
+  static void initObservedValues(
+      std::vector<boost::any> &_ObservedValues,
+      const moleculeId_t _molid,
+      const molecule * const _molref,
+      const boost::function<void()> &_subjectKilled);
 
   /** Destroys all \a ObservedValues entries.
    *
-   */
-  void destroyObservedValues();
+   * \param _ObservedValues vector of ObservedValue to be destroyed
+   */
+  static void destroyObservedValues(
+      std::vector<boost::any> &_ObservedValues);
 
   /** Getter to molecule index contained in \a ObservedValues.
@@ -212,8 +217,11 @@
   mutable size_t subjectKilledCount;
 
+private:
+
+  boost::function<QGeometryData ()> TesselationHullUpdater;
+
   //!> contains current version of the tesselation hull on request
   Cacheable<QGeometryData> TesselationHull;
 
-private:
   //!> contains the set of atoms displayed
   atoms_t DisplayedAtoms;
Index: src/UIElements/Views/Qt4/Qt3D/ObservedValue_UpdateAtoms.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/ObservedValue_UpdateAtoms.hpp	(revision 8688ef11c8d02f39202bf756a4085f44860a00df)
+++ src/UIElements/Views/Qt4/Qt3D/ObservedValue_UpdateAtoms.hpp	(revision 8688ef11c8d02f39202bf756a4085f44860a00df)
@@ -0,0 +1,86 @@
+/*
+ * ObservedValue_UpdateAtoms.hpp
+ *
+ *  Created on: Oct 17, 2015
+ *      Author: heber
+ */
+
+
+#ifndef OBSERVEDVALUE_UPDATEATOMS_HPP_
+#define OBSERVEDVALUE_UPDATEATOMS_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <set>
+
+#include <boost/function.hpp>
+
+#include "ObservedValue_wCallback.hpp"
+
+#include "Descriptors/MoleculeIdDescriptor.hpp"
+#include "types.hpp"
+#include "World.hpp"
+
+/** This is a specialization of ObservedValue_wCallback for a set of atomic ids.
+ *
+ * The problem is that on an update signal we only get a single id. However, get()
+ * requires us to return a set of ids (namely all contained atoms by id and update
+ * only gives left or added ones).
+ *
+ * Hence, we need to add a member variable storing the current set.
+ *
+ */
+class ObservedValue_UpdateAtoms : public ObservedValue_wCallback< std::set<atomId_t> >
+{
+  typedef std::set<atomId_t> atoms_t;
+
+public:
+  ObservedValue_UpdateAtoms(
+    const Observable * const _owner,
+    const std::string &_name,
+    const Observable::channels_t &_channels,
+    const boost::function<void()> &_callback,
+    const boost::function<const moleculeId_t ()> &_getMolIndex
+    ) :
+      ObservedValue_wCallback<atoms_t>(
+          _owner,
+          boost::bind(&ObservedValue_UpdateAtoms::updateAtoms,
+              this), _name,
+              atoms_t(),
+              _channels,
+              _callback),
+      getMolIndex(_getMolIndex)
+    {}
+
+  virtual ~ObservedValue_UpdateAtoms ()
+  {}
+
+protected:
+  atoms_t updateAtoms()
+  {
+    atoms_t current_atomset = get();
+    const molecule * const mol = const_cast<const World &>(World::getInstance()).
+        getMolecule(MoleculeById(getMolIndex()));
+    if (mol != NULL) {
+      const atomId_t id = mol->lastChangedAtomId();
+      if (mol->containsAtom(id))
+        current_atomset.insert(id);
+      else
+        current_atomset.erase(id);
+    }
+    return current_atomset;
+  }
+
+private:
+
+  //!> contains the set of atoms displayed
+  atoms_t DisplayedAtoms;
+
+  //!> getter function for the molecule index whose current set of atoms we observe
+  const boost::function<const moleculeId_t ()> getMolIndex;
+};
+
+#endif /* OBSERVEDVALUE_UPDATEATOMS_HPP_ */
