Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 9737db9c0d2798f3bb61807cda1a59701dc33939)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 73b13cdd45329e4acbf0a0ca9dd9b780dac892d7)
@@ -156,4 +156,60 @@
   hoverAtomId(-1)
 {
+  setMaterial(getMaterial(1));
+  updateBoundingBox();
+
+  // 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(clicked()), this, SLOT(wasClicked()));
+}
+
+GLMoleculeObject_molecule::GLMoleculeObject_molecule(QGLSceneNode *mesh[], QObject *parent, const moleculeId_t molid) :
+  GLMoleculeObject(mesh, parent),
+  Observer(std::string("GLMoleculeObject_molecule")+toString(molid)),
+  isBoundingBoxUptodate(true),
+  isSignedOn(false),
+  moleculeid(molid),
+  TesselationHullUptodate(true),
+  hoverAtomId(-1)
+{
+  setMaterial(getMaterial(1));
+  updateBoundingBox();
+
+  // 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(clicked()), this, SLOT(wasClicked()));
+}
+
+GLMoleculeObject_molecule::~GLMoleculeObject_molecule()
+{
+  if (isSignedOn) {
+    const molecule *_molecule = const_cast<const World &>(World::getInstance()).
+        getMolecule(MoleculeById(moleculeid));
+    if (_molecule != NULL) {
+      _molecule->signOff(this, molecule::AtomInserted);
+      _molecule->signOff(this, molecule::AtomRemoved);
+      _molecule->signOff(this, molecule::AtomMoved);
+    } else {
+      ELOG(1, "GLMoleculeObject_molecule cannot sign off, molecule with "
+          << moleculeid << " has disappeared.");
+    }
+  }
+  /*_atom->signOff(this, AtomObservable::IndexChanged);
+  _atom->signOff(this, AtomObservable::PositionChanged);
+  _atom->signOff(this, AtomObservable::ElementChanged);
+  _atom->signOff(this, AtomObservable::BondsAdded);*/
+  World::getInstance().signOff(this, World::SelectionChanged);
+}
+
+void GLMoleculeObject_molecule::activateObserver()
+{
   // sign on as observer (obtain non-const instance before)
   const molecule *_molecule = const_cast<const World &>(World::getInstance()).
@@ -171,73 +227,5 @@
   molref->signOn(this, AtomObservable::ElementChanged);
   molref->signOn(this, AtomObservable::BondsAdded);*/
-  setMaterial(getMaterial(1));
   World::getInstance().signOn(this, World::SelectionChanged);
-  updateBoundingBox();
-
-  // 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(clicked()), this, SLOT(wasClicked()));
-}
-
-GLMoleculeObject_molecule::GLMoleculeObject_molecule(QGLSceneNode *mesh[], QObject *parent, const moleculeId_t molid) :
-  GLMoleculeObject(mesh, parent),
-  Observer(std::string("GLMoleculeObject_molecule")+toString(molid)),
-  isBoundingBoxUptodate(true),
-  isSignedOn(false),
-  moleculeid(molid),
-  TesselationHullUptodate(true),
-  hoverAtomId(-1)
-{
-  // sign on as observer (obtain non-const instance before)
-  const molecule *_molecule = const_cast<const World &>(World::getInstance()).
-      getMolecule(MoleculeById(moleculeid));
-  if (_molecule != NULL) {
-    _molecule->signOn(this, molecule::AtomInserted);
-    _molecule->signOn(this, molecule::AtomRemoved);
-    _molecule->signOn(this, molecule::AtomMoved);
-    isSignedOn = true;
-  } else {
-    ELOG(1, "GLMoleculeObject_molecule() - added null object for not present mol id " << moleculeid);
-  }
-  /*molref->signOn(this, AtomObservable::IndexChanged);
-  molref->signOn(this, AtomObservable::PositionChanged);
-  molref->signOn(this, AtomObservable::ElementChanged);
-  molref->signOn(this, AtomObservable::BondsAdded);*/
-  setMaterial(getMaterial(1));
-  World::getInstance().signOn(this, World::SelectionChanged);
-  updateBoundingBox();
-
-  // 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(clicked()), this, SLOT(wasClicked()));
-}
-
-GLMoleculeObject_molecule::~GLMoleculeObject_molecule()
-{
-  if (isSignedOn) {
-    const molecule *_molecule = const_cast<const World &>(World::getInstance()).
-        getMolecule(MoleculeById(moleculeid));
-    if (_molecule != NULL) {
-      _molecule->signOff(this, molecule::AtomInserted);
-      _molecule->signOff(this, molecule::AtomRemoved);
-      _molecule->signOff(this, molecule::AtomMoved);
-    } else {
-      ELOG(1, "GLMoleculeObject_molecule cannot sign off, molecule with "
-          << moleculeid << " has disappeared.");
-    }
-  }
-  /*_atom->signOff(this, AtomObservable::IndexChanged);
-  _atom->signOff(this, AtomObservable::PositionChanged);
-  _atom->signOff(this, AtomObservable::ElementChanged);
-  _atom->signOff(this, AtomObservable::BondsAdded);*/
-  World::getInstance().signOff(this, World::SelectionChanged);
 }
 
@@ -534,5 +522,5 @@
   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
   ASSERT(iter != AtomsinSceneMap.end(),
-      "GLWorldScene::atomRemoved() - atom "+toString(_id)+" not on display.");
+      "GLMoleculeObject_molecule::atomRemoved() - atom "+toString(_id)+" not on display.");
   GLMoleculeObject_atom *atomObject = iter->second;
   AtomsinSceneMap.erase(iter);
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 9737db9c0d2798f3bb61807cda1a59701dc33939)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp	(revision 73b13cdd45329e4acbf0a0ca9dd9b780dac892d7)
@@ -76,4 +76,6 @@
   void setVisible(bool value);
 
+  void activateObserver();
+
 private:
   void addAtomBonds(
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 9737db9c0d2798f3bb61807cda1a59701dc33939)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 73b13cdd45329e4acbf0a0ca9dd9b780dac892d7)
@@ -70,6 +70,7 @@
 using namespace MoleCuilder;
 
-GLWorldScene::GLWorldScene(QObject *parent)
-   : QObject(parent)
+GLWorldScene::GLWorldScene(QObject *parent) :
+    QObject(parent),
+    selectionMode(SelectAtom)
 {
   int sphereDetails[] = {5, 3, 2, 0};
@@ -228,4 +229,6 @@
   LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_atomid)+".");
 
+  boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
+
   // check of molecule is already present
   if (MoleculesinSceneMap.count(_molid) != 0) {
@@ -248,4 +251,6 @@
   LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_atomid)+".");
 
+  boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
+
   // check of molecule is already present
   if (MoleculesinSceneMap.count(_molid) != 0) {
@@ -276,9 +281,10 @@
   MoleculesinSceneMap.insert( make_pair(_id, molObject) );
 
-  // now handle all state changes that came up before the instantiation
-  if (MoleculeMissedStateMap.count(_id) != 0) {
+  // now handle all state changes that came up before the instantiation7
+  while (MoleculeMissedStateMap.count(_id) != 0) {
     ASSERT( !MoleculeMissedStateMap[_id].empty(),
         "GLWorldScene::moleculeInserted() - we have an empty state change map for molecule with id "
         +toString(_id));
+    boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
     for (StateChangeMap_t::iterator iter = MoleculeMissedStateMap[_id].begin();
         !MoleculeMissedStateMap[_id].empty();
@@ -297,9 +303,13 @@
             "GLWorldScene::moleculeInserted() - more atomRemoved states than atomInserted for atom "
             +toString(iter->first));
-        if (StateChangeAmounts[atomInsertedState] > StateChangeAmounts[atomRemovedState])
+        if (StateChangeAmounts[atomInsertedState] > StateChangeAmounts[atomRemovedState]) {
+          LOG(1, "INFO: invoking atomInserted for atom " << iter->first);
           QMetaObject::invokeMethod(molObject,        // pointer to a QObject
                                     "atomInserted",       // member name (no parameters here)
                                     Qt::DirectConnection,     // connection type
                                     Q_ARG(const atomId_t, iter->first));     // parameters
+        } else {
+          LOG(1, "INFO: Atom " << iter->first << " has been inserted and removed already.");
+        }
       } else {
         // can only be an insertion
@@ -311,4 +321,5 @@
             break;
           case atomInsertedState:
+            LOG(1, "INFO: invoking atomInserted for atom " << iter->first);
             QMetaObject::invokeMethod(molObject,        // pointer to a QObject
                                       "atomInserted",       // member name (no parameters here)
@@ -329,4 +340,7 @@
   }
 
+  // now let the molObject sign on to molecule
+  molObject->activateObserver();
+
   connect (molObject, SIGNAL(changed()), this, SIGNAL(changed()));
   connect (molObject, SIGNAL(changeOccured()), this, SIGNAL(changeOccured()));
@@ -359,5 +373,8 @@
 
   // remove any possible state changes left
-  MoleculeMissedStateMap.erase(_id);
+  {
+    boost::recursive_mutex::scoped_lock lock(MoleculeMissedStateMap_mutex);
+    MoleculeMissedStateMap.erase(_id);
+  }
 
   emit changed();
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 9737db9c0d2798f3bb61807cda1a59701dc33939)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 73b13cdd45329e4acbf0a0ca9dd9b780dac892d7)
@@ -19,4 +19,6 @@
 
 #include <iosfwd>
+
+#include <boost/thread/recursive_mutex.hpp>
 
 #include "Bond/bond.hpp"
@@ -116,4 +118,6 @@
   //!> map of all missed state changes
   MoleculeMissedStateMap_t MoleculeMissedStateMap;
+  //!> flag to indicate whether state map is currently worked on
+  boost::recursive_mutex MoleculeMissedStateMap_mutex;
 
   SelectionModeType selectionMode;
