Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -48,4 +48,6 @@
 #include <algorithm>
 
+#include <boost/thread/locks.hpp>
+
 #include "Descriptors/MoleculeIdDescriptor.hpp"
 #include "molecule.hpp"
@@ -56,5 +58,6 @@
      const channellist_t &_channellist,
      const enum MoveTypes _movetype,
-     const emitDirtyState_t _emitDirtyState) :
+     const emitDirtyState_t _emitDirtyState,
+     const emitSubjectKilledState_t _emitSubjectKilledState) :
   Observer("QtMoleculeItem"),
   molid(_molid),
@@ -63,5 +66,6 @@
   owner(NULL),
   dirty(true),
-  emitDirtyState(_emitDirtyState)
+  emitDirtyState(_emitDirtyState),
+  emitSubjectKilledState(_emitSubjectKilledState)
 {
   // BUG: We cannot sign on here as then and again we catch "pure virtual function called"
@@ -74,11 +78,22 @@
 void QtMoleculeItem::signOnToMolecule()
 {
+  // count the number of threads entering the function
+  std::cout << "QtMoleculeItem::signOnToMolecule() called for " << this << std::endl;
   const molecule * const mol = const_cast<const World &>(World::getInstance()).
       getMolecule(MoleculeById(molid));
   if (mol != NULL) {
-    owner = static_cast<const Observable *>(mol);
-    for (channellist_t::const_iterator channeliter = channellist.begin();
-        channeliter != channellist.end(); ++channeliter)
-      owner->signOn(this, *channeliter);
+    owner_mutex.lock();
+    if (owner == NULL) {
+      owner_mutex.unlock();
+      const Observable *owner_copy = static_cast<const Observable *>(mol);
+      for (channellist_t::const_iterator channeliter = channellist.begin();
+          channeliter != channellist.end(); ++channeliter)
+        owner_copy->signOn(this, *channeliter);
+      owner_mutex.lock();
+      owner = owner_copy;
+      owner_mutex.unlock();
+      std::cout << "QtMoleculeItem " << this << " has signed on to " << owner << std::endl;
+    } else
+      owner_mutex.unlock();
   }
 }
@@ -86,9 +101,20 @@
 void QtMoleculeItem::signOffFromMolecule()
 {
-  if (owner != NULL) {
+  // prevent via owner that another thread enters the function again
+  // (re-entrancy)
+  const Observable *owner_copy = NULL;
+  {
+    boost::recursive_mutex::scoped_lock lock(owner_mutex);
+    if (owner != NULL) {
+      owner_copy = owner;
+      owner = NULL;
+    }
+  }
+  std::cout << "QtMoleculeItem::signOffFromMolecule() called for " << this << std::endl;
+  if (owner_copy != NULL) {
     for (channellist_t::const_iterator channeliter = channellist.begin();
         channeliter != channellist.end(); ++channeliter)
-      owner->signOff(this, *channeliter);
-    owner = NULL;
+      owner_copy->signOff(this, *channeliter);
+    std::cout << "QtMoleculeItem " << this << " has signed off from " << owner_copy << std::endl;
   }
 }
@@ -140,4 +166,5 @@
   signOffFromMolecule();
   dirty = false;
+  emitSubjectKilledState(getMoleculeId());
 }
 
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -20,4 +20,5 @@
 
 #include <boost/function.hpp>
+#include <boost/thread/recursive_mutex.hpp>
 #include <list>
 #include <string>
@@ -57,9 +58,13 @@
       const enum MoveTypes)> emitDirtyState_t;
 
+  //!> typedef for callback function to model to inform when our subjectKilled() was called
+  typedef const boost::function<void (const moleculeId_t _id)> emitSubjectKilledState_t;
+
   QtMoleculeItem(
       const moleculeId_t _molid,
       const channellist_t &_channellist,
       const enum MoveTypes _movetype,
-      const emitDirtyState_t _emitDirtyState);
+      const emitDirtyState_t _emitDirtyState,
+      const emitSubjectKilledState_t _emitSubjectKilledState);
   virtual ~QtMoleculeItem();
 
@@ -121,4 +126,10 @@
   //!> bound callback function to inform model about change
   const emitDirtyState_t emitDirtyState;
+
+  //!> bound callback function to inform model about change
+  const emitSubjectKilledState_t emitSubjectKilledState;
+
+  //!> this protects the signing on and off
+  mutable boost::recursive_mutex owner_mutex;
 };
 
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItemFactory.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItemFactory.cpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItemFactory.cpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -91,12 +91,13 @@
 QtMoleculeItemFactory::createMoleculeItems(
     const moleculeId_t _molid,
-    const QtMoleculeItem::emitDirtyState_t &_emitDirtyState)
+    const QtMoleculeItem::emitDirtyState_t &_emitDirtyState,
+    const QtMoleculeItem::emitSubjectKilledState_t &_emitSubjectKilledState)
 {
   QList<QStandardItem *> molItems;
-  molItems << new QtMoleculeItem_name(_molid, _emitDirtyState);
-  molItems << new QtMoleculeItem_visibility(_molid, _emitDirtyState);
-  molItems << new QtMoleculeItem_atomcount(_molid, _emitDirtyState);
-  molItems << new QtMoleculeItem_formula(_molid, _emitDirtyState);
-  molItems << new QtMoleculeItem_occurrence(_molid, _emitDirtyState);
+  molItems << new QtMoleculeItem_name(_molid, _emitDirtyState, _emitSubjectKilledState);
+  molItems << new QtMoleculeItem_visibility(_molid, _emitDirtyState, _emitSubjectKilledState);
+  molItems << new QtMoleculeItem_atomcount(_molid, _emitDirtyState, _emitSubjectKilledState);
+  molItems << new QtMoleculeItem_formula(_molid, _emitDirtyState, _emitSubjectKilledState);
+  molItems << new QtMoleculeItem_occurrence(_molid, _emitDirtyState, _emitSubjectKilledState);
   return molItems;
 }
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItemFactory.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItemFactory.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItemFactory.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -47,9 +47,11 @@
    * \param _molid id of molecule
    * \param _emitDirtyState callback function to model to inform about required state update
+   * \param _emitSubjectKilledState callback function to model to inform about called subjectKilled()
    * \return list of prepared items to be appended to a group item
    */
   QList<QStandardItem *> createMoleculeItems(
       const moleculeId_t _molid,
-      const QtMoleculeItem::emitDirtyState_t &_emitDirtyState);
+      const QtMoleculeItem::emitDirtyState_t &_emitDirtyState,
+      const QtMoleculeItem::emitSubjectKilledState_t &_emitSubjectKilledState);
 
   /** Creates all QtMoleculeItem's that make up a row of a group item.
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.cpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -64,10 +64,10 @@
   ChangingChildrensVisibility(false),
   update_timer(NULL),
-  callback_DirtyItems(boost::bind(&QtMoleculeList::informDirtyState, this, _1, _2, _3))
+  callback_DirtyItems(boost::bind(&QtMoleculeList::informDirtyState, this, _1, _2, _3)),
+  callback_subjectKilledItems(boost::bind(&QtMoleculeList::receiveSubjectKilled, this, _1))
 {
   setColumnCount(QtMoleculeItemFactory::COLUMNCOUNT);
 
   World::getInstance().signOn(this, World::MoleculeInserted);
-  World::getInstance().signOn(this, World::MoleculeRemoved);
 
   refill();
@@ -82,5 +82,4 @@
 {
   World::getInstance().signOff(this, World::MoleculeInserted);
-  World::getInstance().signOff(this, World::MoleculeRemoved);
 }
 
@@ -188,4 +187,18 @@
   else
     return ItemToMoleculeId(item);
+}
+
+void QtMoleculeList::receiveSubjectKilled(const moleculeId_t _id)
+{
+  boost::recursive_mutex::scoped_lock lock(map_mutex);
+  KilledItemsPerMolecule_t::iterator iter = KilledItemsPerMolecule.find(_id);
+  if (iter == KilledItemsPerMolecule.end())
+    KilledItemsPerMolecule.insert( std::make_pair(_id, 1));
+  else
+    ++(iter->second);
+  if (iter->second == QtMoleculeItem::COLUMNTYPES_MAX) {
+    boost::recursive_mutex::scoped_lock lock(listAccessing_mutex);
+    removedMolecules.push_back( _id );
+  }
 }
 
@@ -202,12 +215,4 @@
         break;
       }
-      case World::MoleculeRemoved:
-      {
-        boost::recursive_mutex::scoped_lock lock(listAccessing_mutex);
-        const moleculeId_t molid = const_cast<const World &>(World::getInstance()).lastChangedMolId();
-        if (molid != (unsigned int )-1)
-          removedMolecules.push_back( molid ); // remove in any case, as we also got insert
-        break;
-      }
       default:
         ASSERT(0, "QtMoleculeList::recieveNotification() - cannot get here, not subscribed to channel "
@@ -238,5 +243,8 @@
 {
   QList<QStandardItem *> molItems =
-      QtMoleculeItemFactory::getInstance().createMoleculeItems(_molid, callback_DirtyItems);
+      QtMoleculeItemFactory::getInstance().createMoleculeItems(
+          _molid,
+          callback_DirtyItems,
+          callback_subjectKilledItems);
   QtMoleculeItem *mol_item = dynamic_cast<QtMoleculeItem *>(molItems.front());
   ASSERT( mol_item != NULL,
@@ -336,4 +344,5 @@
       MoleculeFormulaMap.clear();
       MoleculeItemBiMap.clear();
+      KilledItemsPerMolecule.clear();
     }
     dirtyMolItems.clear();
@@ -599,40 +608,4 @@
   listAccessing_mutex.unlock();
 
-  /// first check consistency among the sets:
-  /// -# if we remove an item, we don't have to update it before anymore
-  /// -# if we remove an item, we don't have to move it before anymore
-  /// -# if we remove an item, we don't have to change its visibility
-  /// -# don't add molecule that are also removed
-
-  // remove molecules added and removed immediately in both lists
-  // note that newMolecules are all those where a moleculeInserted callback
-  // has been received but not action has been taken (i.e. it is not contained
-  // in any other list so far), toBeRemoved is inserted on moleculeRemoved
-  // and other lists (toBeSetOccurrenceItems) are only filled if the molecule
-  // item has already been instantiated.
-  {
-    std::vector<moleculeId_t> addedremoved;
-    std::sort(newMolecules_copy.begin(), newMolecules_copy.end());
-    std::sort(removedMolecules_copy.begin(), removedMolecules_copy.end());
-    std::set_intersection(
-        newMolecules_copy.begin(), newMolecules_copy.end(),
-        removedMolecules_copy.begin(), removedMolecules_copy.end(),
-        std::back_inserter(addedremoved));
-    {
-      std::vector<moleculeId_t>::iterator removeiter = std::set_difference(
-          newMolecules_copy.begin(), newMolecules_copy.end(),
-          addedremoved.begin(), addedremoved.end(),
-          newMolecules_copy.begin());
-      newMolecules_copy.erase(removeiter, newMolecules_copy.end());
-    }
-    {
-      std::vector<moleculeId_t>::iterator removeiter = std::set_difference(
-          removedMolecules_copy.begin(), removedMolecules_copy.end(),
-          addedremoved.begin(), addedremoved.end(),
-          removedMolecules_copy.begin());
-      removedMolecules_copy.erase(removeiter, removedMolecules_copy.end());
-    }
-  }
-
   // wait till initial refill has been executed
   boost::recursive_mutex::scoped_lock lock(refill_mutex);
@@ -694,8 +667,5 @@
     LOG(1, "Moving item " << molitem);
     const molecule *mol = molitem->getMolecule();
-    if (mol == NULL) {
-      // removeMolecule will remove also from formula<->molecule bimap
-      removeMoleculeItem(molitem);
-    } else {
+    if (mol != NULL) {
       // remove from formula<->molecule bimap with old formula
       LOG(1, "Removing " << formulaiter->second << " for " << formulaiter->first << " from MoleculeFormulaMap.");
@@ -709,16 +679,4 @@
     }
   }
-
-  // throw out items that we added by an update() while we are in this function
-  listAccessing_mutex.lock();
-  for (std::vector<moleculeId_t>::const_iterator removeiter = removedMolecules_copy.begin();
-      removeiter != removedMolecules_copy.end(); ++removeiter) {
-    for (unsigned int i=0;i< QtMoleculeItem::COLUMNTYPES_MAX; ++i)
-        dirtyMolItems.erase( std::make_pair(*removeiter,(QtMoleculeItem::COLUMNTYPES)i) );
-    toBeMovedItems.erase(*removeiter);
-    visibilityMolItems.erase(*removeiter);
-  }
-  listAccessing_mutex.unlock();
-  // after that it is not a problem as items have been removed (hence signOff() was called)
 
   /// 3. remove all items whose molecules have been removed
@@ -734,6 +692,19 @@
       toBeSetOccurrence.insert( formula );
       removeMoleculeItem(item);
-    }
-  }
+      KilledItemsPerMolecule.erase( *removeiter );
+    }
+  }
+
+  // throw out items that we added by an update() while we are in this function
+  listAccessing_mutex.lock();
+  for (std::vector<moleculeId_t>::const_iterator removeiter = removedMolecules_copy.begin();
+      removeiter != removedMolecules_copy.end(); ++removeiter) {
+    for (unsigned int i=0;i< QtMoleculeItem::COLUMNTYPES_MAX; ++i)
+        dirtyMolItems.erase( std::make_pair(*removeiter,(QtMoleculeItem::COLUMNTYPES)i) );
+    toBeMovedItems.erase(*removeiter);
+    visibilityMolItems.erase(*removeiter);
+  }
+  listAccessing_mutex.unlock();
+  // after that it is not a problem as items have been removed (hence signOff() was called)
 
   /// 4. instantiate all new items
Index: src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -112,4 +112,6 @@
       const QtMoleculeItem::MoveTypes _movetype);
 
+  void receiveSubjectKilled(const moleculeId_t _id);
+
   void updateItemStates();
 
@@ -130,4 +132,11 @@
   //!> callback function to hand over to items that inform about requiring update
   const QtMoleculeItem::emitDirtyState_t callback_DirtyItems;
+
+  //!> callback function to hand over to items that inform about called subjectKilled()
+  const QtMoleculeItem::emitSubjectKilledState_t callback_subjectKilledItems;
+
+  typedef std::map<moleculeId_t, unsigned int> KilledItemsPerMolecule_t;
+  //!> takes note of how many items have already been killed for a specific row/molecule
+  KilledItemsPerMolecule_t KilledItemsPerMolecule;
 
   typedef std::set< moleculeId_t > list_of_molecules_t;
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_atomcount.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_atomcount.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_atomcount.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -34,6 +34,7 @@
   QtMoleculeItem_atomcount(
       const moleculeId_t _molid,
-      emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_atomcount, QtMoleculeItem::NeedsMove, _emitDirtyState),
+      const emitDirtyState_t &_emitDirtyState,
+      const emitSubjectKilledState_t &_emitSubjectKilledState) :
+        QtMoleculeItem(_molid, channellist_atomcount, QtMoleculeItem::NeedsMove, _emitDirtyState, _emitSubjectKilledState),
         molref(getMolecule()),
         atomcount(
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_formula.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_formula.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_formula.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -37,6 +37,7 @@
   QtMoleculeItem_formula(
       const moleculeId_t _molid,
-      emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_formula, QtMoleculeItem::NeedsMove, _emitDirtyState),
+      const emitDirtyState_t &_emitDirtyState,
+      const emitSubjectKilledState_t &_emitSubjectKilledState) :
+        QtMoleculeItem(_molid, channellist_formula, QtMoleculeItem::NeedsMove, _emitDirtyState, _emitSubjectKilledState),
         molref(getMolecule()),
         formula(
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_name.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -34,6 +34,7 @@
   QtMoleculeItem_name(
       const moleculeId_t _molid,
-      emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_name, QtMoleculeItem::DoesNotMove, _emitDirtyState),
+      const emitDirtyState_t &_emitDirtyState,
+      const emitSubjectKilledState_t &_emitSubjectKilledState) :
+        QtMoleculeItem(_molid, channellist_name, QtMoleculeItem::DoesNotMove, _emitDirtyState, _emitSubjectKilledState),
         molref(getMolecule()),
         name(
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_occurrence.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_occurrence.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_occurrence.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -28,6 +28,7 @@
   QtMoleculeItem_occurrence(
       const moleculeId_t _molid,
-      emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_occurrence, QtMoleculeItem::DoesNotMove, _emitDirtyState)
+      const emitDirtyState_t &_emitDirtyState,
+      const emitSubjectKilledState_t &_emitSubjectKilledState) :
+        QtMoleculeItem(_molid, channellist_occurrence, QtMoleculeItem::DoesNotMove, _emitDirtyState, _emitSubjectKilledState)
   {
     signOnToMolecule();
Index: src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp
===================================================================
--- src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/MoleculeList/SpecificItems/QtMoleculeItem_visibility.hpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -28,6 +28,7 @@
   QtMoleculeItem_visibility(
       const moleculeId_t _molid,
-      emitDirtyState_t _emitDirtyState) :
-        QtMoleculeItem(_molid, channellist_visibility, QtMoleculeItem::DoesNotMove, _emitDirtyState)
+      const emitDirtyState_t &_emitDirtyState,
+      const emitSubjectKilledState_t &_emitSubjectKilledState) :
+        QtMoleculeItem(_molid, channellist_visibility, QtMoleculeItem::DoesNotMove, _emitDirtyState, _emitSubjectKilledState)
   {
     signOnToMolecule();
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision b9680b48b3c408eb08fa28771d7f329859cf047b)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision cc297688a2f09a635ccb45323617573684f51f9d)
@@ -514,4 +514,7 @@
 {
   const molecule * const _molecule = getMolecule(MolIndex.get());
+  // when molecule is NULL we will soon get destroyed anyway
+  if (_molecule == NULL)
+    return;
   if (publisher == dynamic_cast<const Observable*>(_molecule)){
     // notofication from atom
