Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 8923ad833541d0d5da649e21cb7b6537558a282b)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp	(revision 9c259e4ccaa1f9c8cabd00d1c1ca8e22e40a8199)
@@ -329,7 +329,8 @@
         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been inserted.";
   #endif
-        TesselationHullUptodate = false;
-        isBoundingBoxUptodate = false;
-        atomInserted(_id);
+        QMetaObject::invokeMethod(this,        // pointer to a QObject
+                                  "atomInserted",       // member name (no parameters here)
+                                  Qt::QueuedConnection,     // connection type
+                                  Q_ARG(atomId_t, _id));     // parameters
         break;
       }
@@ -340,7 +341,8 @@
         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been removed.";
   #endif
-        TesselationHullUptodate = false;
-        isBoundingBoxUptodate = false;
-        atomRemoved(_id);
+        QMetaObject::invokeMethod(this,        // pointer to a QObject
+                                  "atomRemoved",       // member name (no parameters here)
+                                  Qt::QueuedConnection,     // connection type
+                                  Q_ARG(atomId_t, _id));     // parameters
         break;
       }
@@ -472,5 +474,9 @@
 void GLMoleculeObject_molecule::atomInserted(const atomicNumber_t _id)
 {
-  LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");
+  LOG(3, "INFO: GLMoleculeObject_molecule: Received signal atomInserted for atom "+toString(_id)+".");
+
+  TesselationHullUptodate = false;
+  isBoundingBoxUptodate = false;
+
   GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(GLMoleculeObject::meshSphere, this, _id);
   ASSERT( atomObject != NULL,
@@ -516,6 +522,9 @@
 void GLMoleculeObject_molecule::atomRemoved(const atomicNumber_t _id)
 {
-  LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+".");
+  LOG(3, "INFO: GLMoleculeObject_molecule: Received signal atomRemoved for atom "+toString(_id)+".");
   // bonds are removed by signal coming from ~bond
+
+  TesselationHullUptodate = false;
+  isBoundingBoxUptodate = false;
 
   if ((unsigned int)m_objectId == _id)
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 8923ad833541d0d5da649e21cb7b6537558a282b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 9c259e4ccaa1f9c8cabd00d1c1ca8e22e40a8199)
@@ -219,4 +219,44 @@
 }
 
+/** Inserts an atom into the scene before molecule is present.
+ *
+ * @param _molid molecule to insert atom for
+ * @param _atomid atom to insert
+ */
+void GLWorldScene::atomInserted(const moleculeId_t _molid, const atomId_t _atomid)
+{
+  LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_atomid)+".");
+
+  // check of molecule is already present
+  if (MoleculesinSceneMap.count(_molid) != 0) {
+    // pass signal through
+  } else {
+    // 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) );
+  }
+}
+
+/** Removes an atom into the scene before molecule is present.
+ *
+ * @param _molid molecule to insert atom for
+ * @param _atomid atom to insert
+ */
+void GLWorldScene::atomRemoved(const moleculeId_t _molid, const atomId_t _atomid)
+{
+  LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_atomid)+".");
+
+  // check of molecule is already present
+  if (MoleculesinSceneMap.count(_molid) != 0) {
+    // pass signal through
+  } else {
+    // 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, atomRemovedState) );
+  }
+}
+
 /** Inserts a molecule into the scene.
  *
@@ -235,4 +275,58 @@
       "GLWorldScene::moleculeInserted - could not create molecule object for "+toString(_id));
   MoleculesinSceneMap.insert( make_pair(_id, molObject) );
+
+  // now handle all state changes that came up before the instantiation
+  if (MoleculeMissedStateMap.count(_id) != 0) {
+    ASSERT( !MoleculeMissedStateMap[_id].empty(),
+        "GLWorldScene::moleculeInserted() - we have an empty state change map for molecule with id "
+        +toString(_id));
+    for (StateChangeMap_t::iterator iter = MoleculeMissedStateMap[_id].begin();
+        !MoleculeMissedStateMap[_id].empty();
+        iter = MoleculeMissedStateMap[_id].begin()) {
+      std::pair<StateChangeMap_t::iterator, StateChangeMap_t::iterator> rangeiter =
+          MoleculeMissedStateMap[_id].equal_range(iter->first);
+      const size_t StateCounts = std::distance(rangeiter.first, rangeiter.second);
+      if (StateCounts > 1) {
+        // more than one state change, have to combine
+        typedef std::map<StateChangeType, size_t> StateChangeAmounts_t;
+        StateChangeAmounts_t StateChangeAmounts;
+        for (StateChangeMap_t::const_iterator stateiter = rangeiter.first;
+            stateiter != rangeiter.second; ++stateiter)
+          ++StateChangeAmounts[stateiter->second];
+        ASSERT( StateChangeAmounts[atomInsertedState] >= StateChangeAmounts[atomRemovedState],
+            "GLWorldScene::moleculeInserted() - more atomRemoved states than atomInserted for atom "
+            +toString(iter->first));
+        if (StateChangeAmounts[atomInsertedState] > StateChangeAmounts[atomRemovedState])
+          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 {
+        // can only be an insertion
+        switch (rangeiter.first->second) {
+          case atomRemovedState:
+            ASSERT( 0,
+                "GLWorldScene::moleculeInserted() - atomRemoved state without atomInserted for atom "
+                +toString(iter->first));
+            break;
+          case atomInsertedState:
+            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
+            break;
+          default:
+            ASSERT( 0,
+                "GLWorldScene::moleculeInserted() - there are unknown change states.");
+            break;
+        }
+      }
+      // removed state changes for this atom
+      MoleculeMissedStateMap[_id].erase(iter);
+    }
+    // remove state change map for the molecule
+    MoleculeMissedStateMap.erase(_id);
+  }
+
   connect (molObject, SIGNAL(changed()), this, SIGNAL(changed()));
   connect (molObject, SIGNAL(changeOccured()), this, SIGNAL(changeOccured()));
@@ -243,4 +337,5 @@
   connect (molObject, SIGNAL(hoverChanged(const atomId_t)), this, SIGNAL(hoverChanged(const atomId_t)));
   connect (molObject, SIGNAL(hoverChanged(const moleculeId_t, int)), this, SIGNAL(hoverChanged(const moleculeId_t, int)));
+
   emit changed();
   emit changeOccured();
@@ -262,4 +357,8 @@
   MoleculesinSceneMap.erase(iter);
   delete molObject;
+
+  // remove any possible state changes left
+  MoleculeMissedStateMap.erase(_id);
+
   emit changed();
   emit changeOccured();
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 8923ad833541d0d5da649e21cb7b6537558a282b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 9c259e4ccaa1f9c8cabd00d1c1ca8e22e40a8199)
@@ -83,4 +83,6 @@
   void moleculeRemoved(const moleculeId_t _id);
   void moleculeInserted(const moleculeId_t _id);
+  void atomRemoved(const moleculeId_t _molid, const atomId_t _atomid);
+  void atomInserted(const moleculeId_t _molid, const atomId_t _atomid);
   void worldSelectionChanged();
   void setSelectionModeAtom();
@@ -104,4 +106,15 @@
   ShapeNodeMap ShapesinSceneMap;
 
+  //!> enumeration of all possible changes molecule might have missed before instantiation
+  enum StateChangeType {
+    atomInsertedState,
+    atomRemovedState,
+    MAX_StateChangeType
+  };
+  typedef std::multimap< atomId_t, StateChangeType> StateChangeMap_t;
+  typedef std::map< moleculeId_t, StateChangeMap_t> MoleculeMissedStateMap_t;
+  //!> map of all missed state changes
+  MoleculeMissedStateMap_t MoleculeMissedStateMap;
+
   SelectionModeType selectionMode;
 };
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 8923ad833541d0d5da649e21cb7b6537558a282b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp	(revision 9c259e4ccaa1f9c8cabd00d1c1ca8e22e40a8199)
@@ -59,4 +59,5 @@
 #include "CodePatterns/Observer/Notification.hpp"
 #include "CodePatterns/Observer/ObserverLog.hpp"
+#include "Descriptors/MoleculeIdDescriptor.hpp"
 #include "molecule.hpp"
 #include "Shapes/ShapeRegistry.hpp"
@@ -90,6 +91,8 @@
   connect(worldscene, SIGNAL(hoverChanged(const moleculeId_t, int)), this, SLOT(sceneHoverSignalled(const moleculeId_t, int)));
   connect(this, SIGNAL(worldSelectionChanged()), worldscene, SLOT(worldSelectionChanged()));
-  connect(this, SIGNAL(moleculeRemoved(const moleculeId_t)), worldscene, SLOT(moleculeRemoved(const moleculeId_t)));
-  connect(this, SIGNAL(moleculeInserted(const moleculeId_t)), worldscene, SLOT(moleculeInserted(const moleculeId_t)));
+  connect(this, SIGNAL(atomRemoved(const moleculeId_t, const atomId_t)), worldscene, SLOT(atomRemoved(const moleculeId_t, const atomId_t)), Qt::DirectConnection);
+  connect(this, SIGNAL(atomInserted(const moleculeId_t, const atomId_t)), worldscene, SLOT(atomInserted(const moleculeId_t, const atomId_t)), Qt::DirectConnection);
+  connect(this, SIGNAL(moleculeRemoved(const moleculeId_t)), worldscene, SLOT(moleculeRemoved(const moleculeId_t)), Qt::DirectConnection);
+  connect(this, SIGNAL(moleculeInserted(const moleculeId_t)), worldscene, SLOT(moleculeInserted(const moleculeId_t)), Qt::DirectConnection);
   //connect(this, SIGNAL(changed()), this, SLOT(updateGL()));
   connect(this, SIGNAL(changed()), this, SLOT(sceneChangeSignalled()));
@@ -114,4 +117,10 @@
 GLWorldView::~GLWorldView()
 {
+  // remove me from all observed molecules
+  for (ObservedMolecules_t::iterator iter = ObservedMolecules.begin();
+      !ObservedMolecules.empty();
+      iter = ObservedMolecules.begin())
+    signOffFromMolecule(*iter);
+
   QSettings settings;
   settings.beginGroup("WorldView");
@@ -324,8 +333,50 @@
 }
 
+void GLWorldView::signOnToMolecule(const molecule *_mol)
+{
+  ASSERT( _mol != NULL,
+      "GLWorldView::signOnToMolecule() - molecule ref is NULL.");
+  _mol->signOn(this, molecule::AtomInserted);
+  _mol->signOn(this, molecule::AtomRemoved);
+
+  ObservedMolecules.insert(const_cast<molecule *>(_mol));
+}
+
+void GLWorldView::signOffFromMolecule(const molecule *_mol)
+{
+  ObservedMolecules_t::const_iterator iter = ObservedMolecules.find(
+      const_cast<molecule *>(_mol));
+  ASSERT( iter != ObservedMolecules.end(),
+      "GLWorldView::signOffFromMolecule() - molecule "+toString(_mol)
+      +" gave subjectKilled we are not signed on.");
+//    LOG(1, "INFO: Erasing " << mol << " from ObservedMolecules.");
+  ObservedMolecules.erase(iter);
+
+  ASSERT( _mol != NULL,
+      "GLWorldView::signOffFromMolecule() - molecule ref is NULL.");
+  _mol->signOff(this, molecule::AtomInserted);
+  _mol->signOff(this, molecule::AtomRemoved);
+}
+
 /**
  * The observable can tell when it dies.
  */
-void GLWorldView::subjectKilled(Observable *publisher) {}
+void GLWorldView::subjectKilled(Observable *publisher)
+{
+  molecule * mol = static_cast<molecule *>(publisher);
+
+//  std::copy(ObservedMolecules.begin(), ObservedMolecules.end(),
+//      std::ostream_iterator<molecule *>(std::cout, "\n"));
+
+  if (mol != NULL) {
+
+    // sign off
+    signOffFromMolecule(mol);
+
+    // emit removed signal
+    const moleculeId_t _id = World::getInstance().lastChanged<molecule>()->getId();
+    emit moleculeRemoved(_id);
+  }
+}
 
 /** Listen to specific changes to the world.
@@ -352,5 +403,11 @@
         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that molecule "+toString(_id)+" has been inserted.";
   #endif
-        emit moleculeInserted(_id);
+        const molecule * const _molecule = const_cast<const World &>(World::getInstance()).
+            getMolecule(MoleculeById(_id));
+        if (_molecule != NULL) {
+          signOnToMolecule(_molecule);
+
+          emit moleculeInserted(_id);
+        }
         break;
       }
@@ -361,4 +418,5 @@
         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that molecule "+toString(_id)+" has been removed.";
   #endif
+        // removed from ObservedMolecules via subjectKilled
         emit moleculeRemoved(_id);
         break;
@@ -383,5 +441,32 @@
         break;
     }
-} else if (dynamic_cast<AtomObservable *>(publisher) != NULL) {
+  } else if (dynamic_cast<molecule *>(publisher) != NULL) {
+    const molecule * mol = const_cast<const molecule * const>(dynamic_cast<molecule *>(publisher));
+    const atomId_t atomid = mol->lastChanged()->getId();
+    const moleculeId_t molid = mol->getId();
+    switch (notification->getChannelNo()) {
+      case molecule::AtomInserted:
+      {
+#ifdef LOG_OBSERVER
+        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this))
+            << " received notification that atom "+toString(atomid)+" has been inserted into molecule "+toString(molid)+".";
+#endif
+        emit atomInserted(molid, atomid);
+        break;
+      }
+      case World::AtomRemoved:
+      {
+#ifdef LOG_OBSERVER
+        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this))
+            << " received notification that atom "+toString(atomid)+" has been removed from molecule "+toString(molid)+".";
+#endif
+        emit atomRemoved(molid, atomid);
+        break;
+      }
+      default:
+        ASSERT(0, "GLWorldView::recieveNotification() - we cannot get here for molecule.");
+        break;
+    }
+  } else if (dynamic_cast<AtomObservable *>(publisher) != NULL) {
     switch (notification->getChannelNo()) {
       case AtomObservable::PositionChanged:
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 8923ad833541d0d5da649e21cb7b6537558a282b)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 9c259e4ccaa1f9c8cabd00d1c1ca8e22e40a8199)
@@ -59,4 +59,6 @@
   void changed();
   void TimeChanged();
+  void atomInserted(const moleculeId_t _molid, const atomId_t _atomid);
+  void atomRemoved(const moleculeId_t _molid, const atomId_t _atomid);
   void moleculeInserted(const moleculeId_t _id);
   void moleculeRemoved(const moleculeId_t _id);
@@ -107,4 +109,7 @@
   void setDomainStatus(const bool status);
 
+  void signOnToMolecule(const molecule *_mol);
+  void signOffFromMolecule(const molecule *_mol);
+
 private:
 
@@ -126,4 +131,8 @@
 
   double defaultEyeSeparation;
+
+  typedef std::multiset<molecule *> ObservedMolecules_t;
+  //!> sorted list of molecules we are sign on to
+  ObservedMolecules_t ObservedMolecules;
 };
 
