Index: src/Atom/atom.cpp
===================================================================
--- src/Atom/atom.cpp	(revision 640cbdb89dc10dbb4cf5d04d394d31e596e89c46)
+++ src/Atom/atom.cpp	(revision 1187c54972b86c05d22e6c40e217c82f0d98ed65)
@@ -289,9 +289,12 @@
 
 void atom::setMolecule(molecule *_mol){
-  OBSERVE;
-  NOTIFY(MoleculeChanged);
-  // take this atom from the old molecule
-  removeFromMolecule();
-  mol = _mol;
+  {
+    // we must inform about molecule changed before the molecule itself tells about it
+    OBSERVE;
+    NOTIFY(MoleculeChanged);
+    // take this atom from the old molecule
+    removeFromMolecule();
+    mol = _mol;
+  }
   if ((mol) && (!mol->containsAtom(this))) {
     mol->associateAtomWithMolecule(this);
@@ -305,4 +308,6 @@
 void atom::removeFromMolecule(){
   if(mol){
+    OBSERVE;
+    NOTIFY(MoleculeChanged);
     if(mol->containsAtom(this)){
       mol->disassociateAtomWithMolecule(this);
Index: src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp	(revision 640cbdb89dc10dbb4cf5d04d394d31e596e89c46)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp	(revision 1187c54972b86c05d22e6c40e217c82f0d98ed65)
@@ -82,5 +82,5 @@
 QtObservedAtom::AtomElementChannels(1, AtomObservable::ElementChanged);
 const Observable::channels_t
-QtObservedAtom::AtomMoleculeIndexChannels(1, AtomObservable::MoleculeChanged);
+QtObservedAtom::AtomMoleculeChannels(1, AtomObservable::MoleculeChanged);
 const Observable::channels_t
 QtObservedAtom::AtomNameChannels(1, AtomObservable::NameChanged);
@@ -120,5 +120,5 @@
   boost::any_cast<ObservedValue_wCallback<ListOfBonds_t, atomId_t> *>(ObservedValues[AtomBonds])->noteCallBackIsGone();
   boost::any_cast<ObservedValue_wCallback<atomicNumber_t, atomId_t> *>(ObservedValues[AtomElement])->noteCallBackIsGone();
-  boost::any_cast<ObservedValue_wCallback<moleculeId_t, atomId_t> *>(ObservedValues[AtomMoleculeIndex])->noteCallBackIsGone();
+  boost::any_cast<ObservedValue_wCallback<QtObservedMolecule*, atomId_t> *>(ObservedValues[AtomMolecule])->noteCallBackIsGone();
   boost::any_cast<ObservedValue_wCallback<std::string, atomId_t> *>(ObservedValues[AtomName])->noteCallBackIsGone();
   boost::any_cast<ObservedValue_wCallback<Vector, atomId_t> *>(ObservedValues[AtomPosition])->noteCallBackIsGone();
@@ -175,12 +175,17 @@
 }
 
-moleculeId_t QtObservedAtom::updateMoleculeIndex(
+QtObservedMolecule* QtObservedAtom::updateMoleculeIndex(
     const boost::function<const atomId_t ()> &_getAtomIndex)
 {
   const atom * const _atom = getAtomConst(_getAtomIndex());
   if ((_atom != NULL) && (_atom->getMolecule() != NULL)) {
-    return _atom->getMolecule()->getId();
+    const moleculeId_t molid = _atom->getMolecule()->getId();
+      QtObservedMolecule* mol = board.getObservedMolecule(molid).get();
+      if (mol != NULL)
+        return mol;
+      else
+        return (QtObservedMolecule*)NULL;
   } else {
-    return (moleculeId_t)0;
+    return (QtObservedMolecule*)NULL;
   }
 }
@@ -279,5 +284,5 @@
       break;
     case AtomObservable::MoleculeChanged:
-      emit moleculeindexChanged();
+      emit moleculeChanged();
       break;
     case AtomObservable::NameChanged:
@@ -367,6 +372,6 @@
   const boost::function<atomicNumber_t ()> AtomElementUpdater(
       boost::bind(&QtObservedAtom::updateElement, AtomIndexGetter));
-  const boost::function<moleculeId_t ()> AtomMoleculeIndexUpdater(
-      boost::bind(&QtObservedAtom::updateMoleculeIndex, AtomIndexGetter));
+  const boost::function<QtObservedMolecule* ()> AtomMoleculeUpdater(
+      boost::bind(&QtObservedAtom::updateMoleculeIndex, this, AtomIndexGetter));
   const boost::function<std::string ()> AtomNameUpdater(
       boost::bind(&QtObservedAtom::updateName, AtomIndexGetter));
@@ -392,10 +397,10 @@
       _subjectKilled,
       AtomIndexGetter);
-  _ObservedValues[AtomMoleculeIndex] = new ObservedValue_wCallback<moleculeId_t, atomId_t>(
-      _atomref,
-      AtomMoleculeIndexUpdater,
-      "AtomMoleculeIndex"+toString(_id),
-      AtomMoleculeIndexUpdater(),
-      AtomMoleculeIndexChannels,
+  _ObservedValues[AtomMolecule] = new ObservedValue_wCallback<QtObservedMolecule*, atomId_t>(
+      _atomref,
+      AtomMoleculeUpdater,
+      "AtomMolecule"+toString(_id),
+      AtomMoleculeUpdater(),
+      AtomMoleculeChannels,
       _subjectKilled,
       AtomIndexGetter);
@@ -432,5 +437,5 @@
   delete boost::any_cast<ObservedValue_wCallback<ListOfBonds_t, atomId_t> *>(_ObservedValues[AtomBonds]);
   delete boost::any_cast<ObservedValue_wCallback<atomicNumber_t, atomId_t> *>(_ObservedValues[AtomElement]);
-  delete boost::any_cast<ObservedValue_wCallback<moleculeId_t, atomId_t> *>(_ObservedValues[AtomMoleculeIndex]);
+  delete boost::any_cast<ObservedValue_wCallback<QtObservedMolecule*, atomId_t> *>(_ObservedValues[AtomMolecule]);
   delete boost::any_cast<ObservedValue_wCallback<std::string, atomId_t> *>(_ObservedValues[AtomName]);
   delete boost::any_cast<ObservedValue_wCallback<Vector, atomId_t> *>(_ObservedValues[AtomPosition]);
@@ -454,7 +459,7 @@
 }
 
-const moleculeId_t& QtObservedAtom::getAtomMoleculeIndex() const
-{
-  return boost::any_cast<ObservedValue_wCallback<moleculeId_t, atomId_t> *>(ObservedValues[AtomMoleculeIndex])->get();
+QtObservedMolecule* const QtObservedAtom::getAtomMolecule() const
+{
+  return boost::any_cast<ObservedValue_wCallback<QtObservedMolecule*, atomId_t> *>(ObservedValues[AtomMolecule])->get();
 }
 
Index: src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp
===================================================================
--- src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp	(revision 640cbdb89dc10dbb4cf5d04d394d31e596e89c46)
+++ src/UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp	(revision 1187c54972b86c05d22e6c40e217c82f0d98ed65)
@@ -31,4 +31,5 @@
 class atom;
 class QtObservedInstanceBoard;
+class QtObservedMolecule;
 
 /** This instance is the ObservedValue representation of a World's atom.
@@ -122,5 +123,5 @@
    * \return atom's molecule index
    */
-  const moleculeId_t& getAtomMoleculeIndex() const;
+  QtObservedMolecule* const getAtomMolecule() const;
 
   /** Getter to atom's selected status.
@@ -134,5 +135,5 @@
   void bondsChanged();
   void elementChanged();
-  void moleculeindexChanged();
+  void moleculeChanged();
   void nameChanged();
   void positionChanged();
@@ -155,5 +156,5 @@
   static atomicNumber_t updateElement(
       const boost::function<const atomId_t ()> &_getAtomIndex);
-  static moleculeId_t updateMoleculeIndex(
+  QtObservedMolecule* updateMoleculeIndex(
       const boost::function<const atomId_t ()> &_getAtomIndex);
   static std::string updateName(
@@ -173,5 +174,5 @@
     AtomElement,
     //!> contains the current atom's molecule index
-    AtomMoleculeIndex,
+    AtomMolecule,
     //!> contains the current atom position
     AtomName,
@@ -235,5 +236,5 @@
   static const Observable::channels_t AtomElementChannels;
   //!> list of channels when molecule index needs to update
-  static const Observable::channels_t AtomMoleculeIndexChannels;
+  static const Observable::channels_t AtomMoleculeChannels;
   //!> list of channels when name needs to update
   static const Observable::channels_t AtomNameChannels;
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 640cbdb89dc10dbb4cf5d04d394d31e596e89c46)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 1187c54972b86c05d22e6c40e217c82f0d98ed65)
@@ -197,11 +197,15 @@
 {
   const atomId_t atomid = _atom->getAtomIndex();
-  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)+".");
+  QtObservedMolecule* const atommol = _atom->getAtomMolecule();
+  // this ASSERT cannot work: The same molecule may get reassigned to a different
+  // molecule, when e.g. the time step changes (which triggers an update-molecules).
+  // The GUI is slow and may lack behind and thus get  to execute the event
+  // moleculeAtomInserted when the change has been already been done.
+//  ASSERT( (atommol == NULL) || (_mol == atommol),
+//      "GLWorldScene::moleculesAtomInserted() - atom "+toString(atomid)
+//      +" claims to belong to QtObservedMolecule "+toString(atommol)
+//      +" but signal came from QtObservedMolecule "+toString(_mol)+".");
   LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(atomid)+".");
+  const moleculeId_t molid = _mol->getMolIndex();
 
   // check of molecule is already present
Index: src/UIElements/Views/Qt4/QtInfoBox.cpp
===================================================================
--- src/UIElements/Views/Qt4/QtInfoBox.cpp	(revision 640cbdb89dc10dbb4cf5d04d394d31e596e89c46)
+++ src/UIElements/Views/Qt4/QtInfoBox.cpp	(revision 1187c54972b86c05d22e6c40e217c82f0d98ed65)
@@ -139,7 +139,12 @@
     connect(curAtom.get(), SIGNAL(atomRemoved()), this, SLOT(clearAtomTab()));
 
-    const moleculeId_t molid = curAtom->getAtomMoleculeIndex();
+    QtObservedMolecule * const mol = curAtom->getAtomMolecule();
+    const moleculeId_t molid = mol->getMolIndex();
     if (molid != (moleculeId_t)-1) {
       QtObservedMolecule::ptr curMolecule = board->getObservedMolecule(molid);
+      ASSERT( mol == curMolecule.get(),
+          "QtInfoBox::showAtom() - mol "+toString(mol)
+          +" obtained from atom does not match mol "+toString(curMolecule.get())
+          +" obtained via id "+toString(molid));
       if (curMolecule) {
         page_mol = new QtMoleculeInfoPage(curMolecule, this);
