Index: src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -74,10 +74,4 @@
   void markObservedValuesAsDisconnected(const id _id);
 
-  /** Inform this container that subjectKilled() was received by one of the ObservedValues.
-   *
-   * \param _id identifier of the receiving instance
-   */
-  void countsubjectKilled(const id _id);
-
   /** Prepares removeal a vector of observed values of an instance  identified by \a _id.
    *
@@ -195,10 +189,4 @@
   CountedObservedValues_t ObservedValues;
 
-  //!> typedef for map with subjectKilledCounts for each instance
-  typedef std::map<id, size_t> subjectKilledCount_t;
-
-  //!> counts how many ObservedValues have already been subjectKilled()
-  subjectKilledCount_t subjectKilledCount;
-
   //!> typedef for the set with ids to be erase
   typedef std::set<id> MarkedForErase_t;
@@ -228,12 +216,4 @@
   bool checkRefCount(const id _id) const;
 
-  /** Internal function to check whether any ObservedValue identified by
-   * \a _id is still signOn() to its associated World instance.
-   *
-   * \param _id identifier of instance
-   * \return true - no more signOn()s, false - else
-   */
-  bool checksubjectKilled(const id _id) const;
-
   /** Internal function to check whether the vector of ObservedValue's
    *  identified by \a _id has been marked for erase.
Index: src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -53,5 +53,5 @@
 void ObservedValuesContainer<T,id>::checkRemoval(const id _id)
 {
-  if (checkRefCount(_id) && checksubjectKilled(_id) && checkMarkedForErase(_id))
+  if (checkRefCount(_id) && checkMarkedForErase(_id))
     removeObservedValues(_id);
 }
@@ -113,36 +113,4 @@
 
 template <class T, typename id>
-#ifdef HAVE_INLINE
-inline
-#endif
-bool ObservedValuesContainer<T,id>::checksubjectKilled(
-    const id _id) const
-{
-  boost::recursive_mutex::scoped_lock lock(atomic_mutex);
-  typename subjectKilledCount_t::const_iterator iter = subjectKilledCount.find(_id);
-  return ((iter != subjectKilledCount.end()) && (iter->second == T::MAX_ObservedTypes));
-}
-
-template <class T, typename id>
-void ObservedValuesContainer<T,id>::countsubjectKilled(const id _id)
-{
-  boost::recursive_mutex::scoped_lock lock(atomic_mutex);
-  LOG(3, "DEBUG: ObservedValuesContainer got subjectKilled() for an observed value of "
-      << NameOfType << " " << _id);
-  typename subjectKilledCount_t::iterator iter = subjectKilledCount.find(_id);
-  if (iter == subjectKilledCount.end()) {
-    std::pair<typename subjectKilledCount_t::iterator, bool> inserter =
-        subjectKilledCount.insert( std::make_pair(_id, 0) );
-    iter = inserter.first;
-  }
-  ASSERT (iter->second < T::MAX_ObservedTypes,
-      "ObservedValuesContainer<T,id>::countsubjectKilled() - all subjectKilled() for "
-      +NameOfType+" "+toString(_id)+" for each observed channel came in already.");
-  ++(iter->second);
-
-  checkRemoval(_id);
-}
-
-template <class T, typename id>
 void ObservedValuesContainer<T,id>::removeObservedValues(const id _id)
 {
@@ -151,5 +119,4 @@
   // call callback function
   onDestroy(_id);
-  subjectKilledCount.erase(_id);
   typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
   iter->second.eraseCurrentValue();
@@ -213,10 +180,7 @@
   const typename CountedObservedValues_t::iterator Colditer = ObservedValues.find(_oldid);
   const typename CountedObservedValues_t::iterator Cnewiter = ObservedValues.find(_newid);
-  const typename subjectKilledCount_t::iterator Solditer = subjectKilledCount.find(_oldid);
-  const typename subjectKilledCount_t::iterator Snewiter = subjectKilledCount.find(_newid);
   const typename MarkedForErase_t::iterator Eolditer = MarkedForErase.find(_oldid);
   const typename MarkedForErase_t::iterator Enewiter = MarkedForErase.find(_newid);
   bool status = ((Colditer != ObservedValues.end()) && (Cnewiter == ObservedValues.end()));
-  status &= ((Solditer != subjectKilledCount.end()) && (Snewiter == subjectKilledCount.end()));
   status &= ((Eolditer != MarkedForErase.end()) && (Enewiter == MarkedForErase.end()));
   // change id here only if still present
@@ -233,9 +197,4 @@
     }
     {
-      const size_t countvalue = Solditer->second;
-      subjectKilledCount.erase(Solditer);
-      subjectKilledCount.insert( std::make_pair(_newid, countvalue) );
-    }
-    {
       MarkedForErase.erase(Eolditer);
       MarkedForErase.insert(_newid);
Index: src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -91,5 +91,6 @@
 
 QtObservedAtom::QtObservedAtom(
-    const ObservedValues_t &_ObservedValues,
+    const atomId_t _id,
+    const atom * const _atom,
     QtObservedInstanceBoard &_board,
     QWidget * _parent) :
@@ -102,7 +103,13 @@
   board(_board),
   BoardIsGone(false),
-  ObservedValues(_ObservedValues)
-{
-  // activating Observer is done by ObservedValueContainer when it's prepared
+  ObservedValues(QtObservedAtom::MAX_ObservedTypes)
+{
+  boost::function<void (const atomId_t)> atomSubjectKilled(
+      boost::bind(&QtObservedAtom::countValuesSubjectKilled,
+          boost::ref(*this),
+          _1));
+  initObservedValues( ObservedValues, _id, _atom, atomSubjectKilled);
+
+  // activating Observer is done by ObservedValueContainer when it's inserted
 }
 
@@ -220,5 +227,24 @@
   ++signedOffChannels;
 
-  if (signedOffChannels == AllsignedOnChannels) {
+  checkForRemoval();
+}
+
+void QtObservedAtom::countValuesSubjectKilled(const atomId_t _id)
+{
+  ASSERT( _id == getAtomIndex(),
+      "QtObservedAtom::countValuesSubjectKilled() - atom "+toString(getAtomIndex())
+      +" received countValuesSubjectKilled for atom id "+toString(_id)+".");
+
+  ++subjectKilledCount;
+
+  checkForRemoval();
+}
+
+#ifdef HAVE_INLINE
+inline
+#endif
+void QtObservedAtom::checkForRemoval()
+{
+  if ((signedOffChannels == AllsignedOnChannels) && (subjectKilledCount == MAX_ObservedTypes)) {
     // remove owner: no more signOff needed
     owner = NULL;
Index: src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -62,10 +62,12 @@
   /** Cstor of QtObservedAtom.
    *
-   * \param _ObservedValues ref to set of observed values for this instance
+   * \param _id id of observed atom
+   * \param _atom ref to observed atom
    * \param _board ref to InstanceBoard for callbacks on occasion of subjectKilled()
    * \param _parent Qt parent to automatically destroy when parent is destroyed
    */
   QtObservedAtom(
-      const ObservedValues_t &_ObservedValues,
+      const atomId_t _id,
+      const atom * const _atom,
       QtObservedInstanceBoard &_board,
       QWidget * _parent=0);
@@ -189,5 +191,5 @@
    * \param _subjectKilled ref to function to call on subjectKilled()
    */
-  static void initObservedValues(
+  void initObservedValues(
       ObservedValues_t &_ObservedValues,
       const atomId_t _id,
@@ -209,6 +211,18 @@
   { BoardIsGone = true; }
 
+  /** Counts the number of subject killed received from the observed values.
+   *
+   * \param _id id to check against ours
+   */
+  void countValuesSubjectKilled(const atomId_t _id);
+
   //!> counts how many ObservedValues have already been subjectKilled()
   mutable size_t subjectKilledCount;
+
+  /** Helper function to check that all subjectKilled have been received for both
+   * this instance and all its internal observed values.
+   *
+   */
+  void checkForRemoval();
 
 private:
Index: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -66,12 +66,4 @@
       *this,
       boost::bind(&QtObservedInstanceBoard::moleculecountsubjectKilled, this, _1)),
-  atomSubjectKilled(
-      boost::bind(&ObservedValuesContainer<QtObservedAtom, atomId_t>::countsubjectKilled,
-          boost::ref(atomObservedValues),
-          _1)),
-  moleculeSubjectKilled(
-      boost::bind(&ObservedValuesContainer<QtObservedMolecule, moleculeId_t>::countsubjectKilled,
-          boost::ref(moleculeObservedValues),
-          _1)),
   lastremovedatom((atomId_t)-1),
   lastremovedmolecule((moleculeId_t)-1)
@@ -105,8 +97,11 @@
   for (SignedOn_t::iterator iter = MoleculeSignedOn.begin(); !MoleculeSignedOn.empty();
       iter = MoleculeSignedOn.begin()) {
-    (*iter)->signOff(this, molecule::IndexChanged);
-    (*iter)->signOff(this, molecule::AtomInserted);
-    (*iter)->signOff(this, molecule::AtomRemoved);
-    MoleculeSignedOn.erase(*iter); //erase all instances
+    Observable * const _observable = *iter;
+    _observable->signOff(this, molecule::IndexChanged);
+    // remove all three remaining instances in multiset
+    for (SignedOn_t::iterator sameiter = MoleculeSignedOn.find(_observable);
+        sameiter != MoleculeSignedOn.end();
+        sameiter = MoleculeSignedOn.find(_observable))
+      MoleculeSignedOn.erase(*sameiter); //erase all instances
   }
 }
@@ -150,20 +145,14 @@
             getMolecule(MoleculeById(_id));
         if (_molecule != NULL) {
-          ObservedValues_t ObservedValues(QtObservedMolecule::MAX_ObservedTypes);
-          LOG(3, "DEBUG: InformationBoard initializes ObservedValues for molecule " << _id);
-          QtObservedMolecule::initObservedValues(
-              ObservedValues,
-              _id,
-              _molecule,
-              moleculeSubjectKilled);
-          QtObservedMolecule::ptr observedmolecule(new QtObservedMolecule(ObservedValues, *this));
+          LOG(3, "DEBUG: InformationBoard initializes QtObservedMolecule for " << _id);
+          QtObservedMolecule::ptr observedmolecule(
+              new QtObservedMolecule(
+                  _id,
+                  _molecule,
+                  *this));
           moleculeObservedValues.insert(_id, observedmolecule);
           // we need to check for index changes
           LOG(3, "DEBUG: InformationBoard signOn()s to molecule " << _id);
           _molecule->signOn(this, molecule::IndexChanged);
-          MoleculeSignedOn.insert( static_cast<Observable *>(const_cast<molecule *>(_molecule)) );
-          _molecule->signOn(this, molecule::AtomInserted);
-          MoleculeSignedOn.insert( static_cast<Observable *>(const_cast<molecule *>(_molecule)) );
-          _molecule->signOn(this, molecule::AtomRemoved);
           MoleculeSignedOn.insert( static_cast<Observable *>(const_cast<molecule *>(_molecule)) );
 
@@ -192,12 +181,7 @@
             getAtom(AtomById(_id));
         if (_atom!= NULL) {
-          ObservedValues_t ObservedValues(QtObservedAtom::MAX_ObservedTypes);
-          LOG(3, "DEBUG: InformationBoard initializes ObservedValues for atom " << _id);
-          QtObservedAtom::initObservedValues(
-              ObservedValues,
-              _id,
-              _atom,
-              atomSubjectKilled);
-          QtObservedAtom::ptr observedatom(new QtObservedAtom(ObservedValues, *this));
+          LOG(3, "DEBUG: InformationBoard initializes QtObservedAtom for " << _id);
+          QtObservedAtom::ptr observedatom(
+              new QtObservedAtom(_id, _atom, *this));
           atomObservedValues.insert(_id, observedatom);
           // we need to check for index changes
Index: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -136,8 +136,4 @@
   ObservedValuesContainer<QtObservedMolecule, moleculeId_t> moleculeObservedValues;
 
-  //!> stored callback function for notifying QtObservedInstanceBoard about subjectKilled in atom
-  boost::function<void (const atomId_t)> atomSubjectKilled;
-  //!> stored callback function for notifying QtObservedInstanceBoard about subjectKilled in molecule
-  boost::function<void (const moleculeId_t)> moleculeSubjectKilled;
   //!> note down atom id of last removed atom to drop its ObservedValues
   atomId_t lastremovedatom;
Index: src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.cpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.cpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -100,5 +100,6 @@
 
 QtObservedMolecule::QtObservedMolecule(
-    const ObservedValues_t &_ObservedValues,
+    const moleculeId_t _id,
+    const molecule * const _mol,
     QtObservedInstanceBoard &_board,
     QWidget * _parent) :
@@ -111,6 +112,12 @@
   board(_board),
   BoardIsGone(false),
-  ObservedValues(_ObservedValues)
-{
+  ObservedValues(QtObservedMolecule::MAX_ObservedTypes)
+{
+  boost::function<void (const atomId_t)> moleculeSubjectKilled(
+      boost::bind(&QtObservedMolecule::countValuesSubjectKilled,
+          boost::ref(*this),
+          _1));
+  initObservedValues(ObservedValues, _id, _mol, moleculeSubjectKilled);
+
   // activating Observer is done by ObservedValueContainer when it's prepared
 }
@@ -171,5 +178,21 @@
   ++signedOffChannels;
 
-  if (signedOffChannels == AllsignedOnChannels) {
+  checkForRemoval();
+}
+
+void QtObservedMolecule::countValuesSubjectKilled(const moleculeId_t _id)
+{
+  ASSERT( _id == getMolIndex(),
+      "QtObservedAtom::countValuesSubjectKilled() - molecule "+toString(getMolIndex())
+      +" received countValuesSubjectKilled for molecule id "+toString(_id)+".");
+
+  ++subjectKilledCount;
+
+  checkForRemoval();
+}
+
+void QtObservedMolecule::checkForRemoval()
+{
+  if ((signedOffChannels == AllsignedOnChannels) && (subjectKilledCount == MAX_ObservedTypes)) {
     // remove owner: no more signOff needed
     owner = NULL;
Index: src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp	(revision 1b07b163ff2a979bea3ff3471229c224b188c9f0)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp	(revision 62a0eef42ed46a0537c81d7f76901e4ce65870a9)
@@ -60,10 +60,12 @@
   /** Cstor of QtObservedMolecule.
    *
-   * \param _ObservedValues ref to set of observed values for this instance
+   * \param _id id of observed molecule
+   * \param _mol ref to observed molecule
    * \param _board ref to InstanceBoard for callbacks on occasion of subjectKilled()
    * \param _parent Qt parent to automatically destroy when parent is destroyed
    */
   QtObservedMolecule(
-      const ObservedValues_t &_ObservedValues,
+      const moleculeId_t _id,
+      const molecule * const _mol,
       QtObservedInstanceBoard &_board,
       QWidget * _parent=0);
@@ -249,6 +251,19 @@
   { BoardIsGone = true; }
 
+
+  /** Counts the number of subject killed received from the observed values.
+   *
+   * \param _id id to check against ours
+   */
+  void countValuesSubjectKilled(const atomId_t _id);
+
   //!> counts how many ObservedValues have already been subjectKilled()
   mutable size_t subjectKilledCount;
+
+  /** Helper function to check that all subjectKilled have been received for both
+   * this instance and all its internal observed values.
+   *
+   */
+  void checkForRemoval();
 
 private:
