Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 805fdc2cd99d90fe43f515b48ca05c3a3a41ad5c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision e29427a0d9159d203db020168941388686e2332b)
@@ -420,5 +420,5 @@
 
   if (AtomsinSceneMap.empty())
-    emit moleculeEmptied(ObservedMolecule->getMolIndex());
+    emit moleculeEmptied(ObservedMolecule);
 
   emit changed();
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 805fdc2cd99d90fe43f515b48ca05c3a3a41ad5c)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision e29427a0d9159d203db020168941388686e2332b)
@@ -69,7 +69,7 @@
   void hoverChanged(const moleculeId_t, int);
   void indexChanged(GLMoleculeObject_molecule *, const moleculeId_t, const moleculeId_t);
-  void atomClicked(atomId_t no);
-  void moleculeClicked(moleculeId_t no);
-  void moleculeEmptied(moleculeId_t no);
+  void atomClicked(atomId_t);
+  void moleculeClicked(moleculeId_t);
+  void moleculeEmptied(QtObservedMolecule::ptr);
   void IsSelectedChanged();
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 805fdc2cd99d90fe43f515b48ca05c3a3a41ad5c)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision e29427a0d9159d203db020168941388686e2332b)
@@ -105,6 +105,6 @@
   connect(this, SIGNAL(insertMolecule(QtObservedMolecule::ptr)),
       this, SLOT(moleculeInserted(QtObservedMolecule::ptr)) );
-  connect(this, SIGNAL(removeMolecule(const moleculeId_t)),
-      this, SLOT(moleculeRemoved(const moleculeId_t)) );
+  connect(this, SIGNAL(removeMolecule(QtObservedMolecule*)),
+      this, SLOT(moleculeRemoved(QtObservedMolecule*)) );
 
 //  connect(this, SIGNAL(updated()), this, SLOT(update()));
@@ -197,5 +197,10 @@
 {
   const atomId_t atomid = _atom->getAtomIndex();
-  const atomId_t molid = _atom->getAtomMoleculeIndex();
+  const atomId_t atommolid = _atom->getAtomMoleculeIndex();
+  const atomId_t molid = _mol->getMolIndex();
+  ASSERT( molid == atommolid,
+      "GLWorldScene::moleculesAtomInserted() - atom "+toString(atomid)+" claims to belong to mol "
+       +toString(atommolid)+" but signal came from QtObservedMolecule with id "
+       +toString(molid)+".");
   LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(atomid)+".");
 
@@ -216,5 +221,5 @@
 //      LOG(3, "INFO: GLWorldScene: Sending signal moleculesAtomInserted for atom "+toString(_atomid)
 //          +" to molecule in RemovedMolecules.");
-//      const MoleculeNodeMap::iterator removedmoliter = RemovedMolecules.find(molid);
+//      const RemovedMoleculesMap_t::iterator removedmoliter = RemovedMolecules.find(molid);
 //      ASSERT( removedmoliter != RemovedMolecules.end(),
 //          "GLWorldScene::moleculesAtomInserted() - signal from old mol "
@@ -228,17 +233,23 @@
     }
   } else {
-    boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
-    // only record missed state for molecule if (still) present but not instantiated
-    if (QtObservedMoleculeMap.count(molid)) {
-      // store signal for when it is instantiated
-      if (MoleculeMissedStateMap.count(molid) == 0)
-        MoleculeMissedStateMap.insert( std::make_pair(molid ,StateChangeMap_t()) );
-      MoleculeMissedStateMap[molid].insert( std::make_pair(atomid, atomInsertedState) );
-      ASSERT( QtObservedAtomMap[atomid] == _atom,
-          "GLWorldScene::moleculesAtomInserted() - atom "+toString(atomid)
-          +" inserted in molecule "+toString(molid)
-          +" which does not match atom in QtObservedAtomMap.");
-      LOG(3, "INFO: GLWorldScene: Placing atomInserted for atom " << atomid
-           << " and molecule " << molid << " into missed state map.");
+    const RemovedMoleculesMap_t::iterator removedmoliter = RemovedMolecules.find(_mol);
+    if (removedmoliter != RemovedMolecules.end()) {
+      ASSERT( 0,
+          "GLWorldScene::moleculesAtomInserted() - would need to send atomInserted to already removed molecule.");
+    } else {
+      boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
+      // only record missed state for molecule if (still) present but not instantiated
+      if (QtObservedMoleculeMap.count(molid)) {
+        // store signal for when it is instantiated
+        if (MoleculeMissedStateMap.count(molid) == 0)
+          MoleculeMissedStateMap.insert( std::make_pair(molid ,StateChangeMap_t()) );
+        MoleculeMissedStateMap[molid].insert( std::make_pair(atomid, atomInsertedState) );
+        ASSERT( QtObservedAtomMap[atomid] == _atom,
+            "GLWorldScene::moleculesAtomInserted() - atom "+toString(atomid)
+            +" inserted in molecule "+toString(molid)
+            +" which does not match atom in QtObservedAtomMap.");
+        LOG(3, "INFO: GLWorldScene: Placing atomInserted for atom " << atomid
+             << " and molecule " << molid << " into missed state map.");
+      }
     }
   }
@@ -269,5 +280,5 @@
       LOG(3, "INFO: GLWorldScene: Sending signal moleculesAtomRemoved for atom "+toString(_atomid)
           +" to molecule in RemovedMolecules.");
-      const MoleculeNodeMap::iterator removedmoliter = RemovedMolecules.find(molid);
+      const RemovedMoleculesMap_t::iterator removedmoliter = RemovedMolecules.find(_mol);
       ASSERT( removedmoliter != RemovedMolecules.end(),
           "GLWorldScene::moleculesAtomRemoved() - signal from old molecule "
@@ -286,5 +297,5 @@
     }
   } else {
-    const MoleculeNodeMap::iterator removedmoliter = RemovedMolecules.find(molid);
+    const RemovedMoleculesMap_t::iterator removedmoliter = RemovedMolecules.find(_mol);
     if (removedmoliter != RemovedMolecules.end()) {
       ASSERT( removedmoliter != RemovedMolecules.end(),
@@ -345,9 +356,10 @@
   disconnect(eraseiter->second.get(), SIGNAL(indexChanged(const moleculeId_t,const moleculeId_t)),
       this, SLOT(moleculeIndexChanged(const moleculeId_t,const moleculeId_t)) );
+  QtObservedMolecule * mol = eraseiter->second.get();
   QtObservedMoleculeMap.erase(eraseiter);
 
   LOG(3, "INFO: GLWorldScene: Received signal moleculeSignOff for molecule "+toString(_id)+".");
 
-  emit removeMolecule(_id);
+  emit removeMolecule(mol);
 }
 
@@ -452,5 +464,5 @@
   connect (molObject, SIGNAL(atomClicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
   connect (molObject, SIGNAL(moleculeClicked(moleculeId_t)), this, SLOT(moleculeClicked(moleculeId_t)));
-  connect (molObject, SIGNAL(moleculeEmptied(moleculeId_t)), this, SLOT(moleculeEmpty(moleculeId_t)));
+  connect (molObject, SIGNAL(moleculeEmptied(QtObservedMolecule::ptr)), this, SLOT(moleculeEmpty(QtObservedMolecule::ptr)));
   connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
   connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
@@ -471,16 +483,17 @@
 /** Removes a molecule from the scene.
  *
- * @param _id id of molecule to remove
- */
-void GLWorldScene::moleculeRemoved(const moleculeId_t _id)
-{
-  LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_id)+".");
+ * @param _mol QtObservedMolecule instance of molecule to remove
+ */
+void GLWorldScene::moleculeRemoved(QtObservedMolecule* _mol)
+{
+  const moleculeId_t molid = _mol->getMolIndex();
+  LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(molid)+".");
 
   boost::recursive_mutex::scoped_lock lock(MoleculeinSceneMap_mutex);
 
-  MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_id);
+  MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(molid);
   if ( iter != MoleculesinSceneMap.end()) {
-    LOG(1, "DEBUG: Removing GLMoleculeObject_molecule to id " << _id << " from scene.");
-    RemovedMolecules.insert( std::make_pair(_id, iter->second) );
+    LOG(1, "DEBUG: Removing GLMoleculeObject_molecule to id " << molid << " from scene.");
+    RemovedMolecules.insert( std::make_pair(_mol, iter->second) );
     MoleculesinSceneMap.erase(iter);
   }
@@ -489,17 +502,18 @@
   {
     boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
-    MoleculeMissedStateMap.erase(_id);
-  }
-}
-
-void GLWorldScene::moleculeEmpty(const moleculeId_t _id)
-{
-  LOG(3, "INFO: GLWorldScene: Received signal moleculeEmpty for molecule "+toString(_id)+".");
+    MoleculeMissedStateMap.erase(molid);
+  }
+}
+
+void GLWorldScene::moleculeEmpty(QtObservedMolecule::ptr _mol)
+{
+  const moleculeId_t molid = _mol->getMolIndex();
+  LOG(3, "INFO: GLWorldScene: Received signal moleculeEmpty for molecule "+toString(molid)+".");
 
   boost::recursive_mutex::scoped_lock lock(MoleculeinSceneMap_mutex);
 
-  MoleculeNodeMap::iterator iter = RemovedMolecules.find(_id);
+  RemovedMoleculesMap_t::iterator iter = RemovedMolecules.find(_mol.get());
   if ( iter != RemovedMolecules.end()) {
-    LOG(1, "DEBUG: Deleting GLMoleculeObject_molecule to id " << _id);
+    LOG(1, "DEBUG: Deleting GLMoleculeObject_molecule to id " << molid);
     GLMoleculeObject_molecule *molObject = iter->second;
     RemovedMolecules.erase(iter);
@@ -508,5 +522,5 @@
   } else {
     ASSERT(0,
-        "GLWorldScene::moleculeEmpty() - molecule "+toString(_id)+" is empty that is not present.");
+        "GLWorldScene::moleculeEmpty() - molecule "+toString(molid)+" is empty that is not present.");
   }
 
@@ -514,5 +528,5 @@
   {
     boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
-    MoleculeMissedStateMap.erase(_id);
+    MoleculeMissedStateMap.erase(molid);
   }
 
@@ -563,20 +577,4 @@
     }
   }
-  {
-    MoleculeNodeMap::iterator const olditer = RemovedMolecules.find(_oldid);
-    if ( olditer != RemovedMolecules.end()) {
-#ifndef NDEBUG
-      MoleculeNodeMap::iterator const newiter = RemovedMolecules.find(_newid);
-      ASSERT ( newiter == RemovedMolecules.end(),
-          "GLWorldScene::moleculeIndexChanged() - molecule "
-          +toString(_newid)+" already present in RemovedMolecules.");
-#endif
-      LOG(1, "DEBUG: Changing GLMoleculeObject_molecule in RemovedMolecules from "
-          << _oldid << " to id " << _newid);
-      GLMoleculeObject_molecule* const molObject = olditer->second;
-      RemovedMolecules.erase(olditer);
-      RemovedMolecules[_newid] = molObject;
-    }
-  }
 }
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 805fdc2cd99d90fe43f515b48ca05c3a3a41ad5c)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision e29427a0d9159d203db020168941388686e2332b)
@@ -85,12 +85,12 @@
   void hoverChanged(const moleculeId_t, int);
   void insertMolecule(QtObservedMolecule::ptr);
-  void removeMolecule(const moleculeId_t);
+  void removeMolecule(QtObservedMolecule*);
 
 private slots:
   void atomClicked(atomId_t no);
   void moleculeClicked(moleculeId_t no);
-  void moleculeRemoved(const moleculeId_t _id);
+  void moleculeRemoved(QtObservedMolecule* _mol);
   void moleculeSignOff(const moleculeId_t _id);
-  void moleculeEmpty(const moleculeId_t _id);
+  void moleculeEmpty(QtObservedMolecule::ptr _mol);
   void moleculeInserted(QtObservedMolecule::ptr);
   void moleculeSignOn(QtObservedMolecule::ptr);
@@ -137,6 +137,8 @@
   QtObservedMoleculeMap_t QtObservedMoleculeMap;
 
+  //!> map to get from QtObservedMolecule to the visual representant
+  typedef std::map< QtObservedMolecule* , GLMoleculeObject_molecule* > RemovedMoleculesMap_t;
   //!> set of all currently removed molecules
-  MoleculeNodeMap RemovedMolecules;
+  RemovedMoleculesMap_t RemovedMolecules;
 
   //!> flag to indicate whether state map is currently worked on
