Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision db7e6dbec5ed7a09556e844d6574a820fe80de92)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
@@ -50,4 +50,5 @@
   atomref->signOn(this, atomref->getChannel(AtomObservable::PositionChanged));
   atomref->signOn(this, atomref->getChannel(AtomObservable::ElementChanged));
+  atomref->signOn(this, atomref->getChannel(AtomObservable::BondsChanged));
 
   // set the object's id
@@ -126,5 +127,6 @@
 void GLMoleculeObject_atom::recieveNotification(Observable *publisher, Notification_ptr notification)
 {
-  LOG(0, "GLMoleculeObject_atom::recieveNotification() - notification type "
+  LOG(0, "GLMoleculeObject_atom::recieveNotification() - atom "
+      +toString(_atom->getId())+" got notification type "
       +toString(notification->getChannelNo())+".");
   switch (notification->getChannelNo()) {
@@ -137,4 +139,7 @@
     case AtomObservable::PositionChanged:
       resetPosition();
+      break;
+    case AtomObservable::BondsChanged:
+      emit BondsChanged(_atom);
       break;
     default:
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision db7e6dbec5ed7a09556e844d6574a820fe80de92)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
@@ -37,4 +37,5 @@
 signals:
   void clicked(atomId_t);
+  void BondsChanged(const atom *_atom);
 
 private:
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision db7e6dbec5ed7a09556e844d6574a820fe80de92)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
@@ -32,4 +32,5 @@
 #include "atom.hpp"
 #include "Bond/bond.hpp"
+#include "Helpers/helpers.hpp"
 #include "molecule.hpp"
 #include "World.hpp"
@@ -91,10 +92,12 @@
   LOG(0, "GLWorldScene: Received signal atomInserted for atom "+toString(_atom->getId())+".");
   GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(this, _atom);
-  AtomNodeMap::iterator iter = AtomsinMoleculeMap.find(_atom->getId());
-  ASSERT(iter == AtomsinMoleculeMap.end(),
+  AtomNodeMap::iterator iter = AtomsinSceneMap.find(_atom->getId());
+  ASSERT(iter == AtomsinSceneMap.end(),
       "GLWorldScene::atomAdded() - same atom "+_atom->getName()+" added again.");
-  AtomsinMoleculeMap.insert( make_pair(_atom->getId(), atomObject) );
+  AtomsinSceneMap.insert( make_pair(_atom->getId(), atomObject) );
   connect (atomObject, SIGNAL(clicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
   connect (atomObject, SIGNAL(hoverChanged()), this, SIGNAL(hoverChanged()));
+  connect (atomObject, SIGNAL(BondsChanged(const atom *)), this, SLOT(bondsChanged(const atom *)));
+  bondsChanged(_atom);
   emit changed();
 }
@@ -110,18 +113,74 @@
   const BondList& bondlist = _atom->getListOfBonds();
   for (BondList::const_iterator iter = bondlist.begin(); iter != bondlist.end(); ++iter) {
-    bondRemoved(*iter);
+    bondRemoved((*iter)->leftatom->getId(), (*iter)->rightatom->getId());
+    bondRemoved((*iter)->rightatom->getId(), (*iter)->leftatom->getId());
   }
   // remove atoms
-  AtomNodeMap::iterator iter = AtomsinMoleculeMap.find(_atom->getId());
-  ASSERT(iter != AtomsinMoleculeMap.end(),
+  AtomNodeMap::iterator iter = AtomsinSceneMap.find(_atom->getId());
+  ASSERT(iter != AtomsinSceneMap.end(),
       "GLWorldScene::atomRemoved() - atom "+_atom->getName()+" not on display.");
   GLMoleculeObject_atom *atomObject = iter->second;
   atomObject->disconnect();
-  AtomsinMoleculeMap.erase(iter);
+  AtomsinSceneMap.erase(iter);
   delete atomObject;
   emit changed();
 }
 
-/** Adds an bond to the scene.
+/** Updates the bond structure of the signaled \a _atom.
+ *
+ * @param _atom atom whose bonds changed.
+ */
+void GLWorldScene::bondsChanged(const atom *_atom)
+{
+  const atomId_t id = _atom->getId();
+
+  // create list with all present bonds
+  std::set< atomId_t > presentBonds;
+  std::pair< BondIdsMap::const_iterator, BondIdsMap::const_iterator> range =
+      BondIdsinSceneMap.equal_range( id );
+  for (BondIdsMap::const_iterator iter = range.first; iter != range.second; ++iter) {
+    const atomId_t otherid = iter->second;
+#ifndef NDEBUG
+    std::set< atomId_t >::const_iterator iter = presentBonds.find(otherid);
+    ASSERT(iter == presentBonds.end(),
+        "GLWorldScene::BondsChanged() - bond id "+toString(otherid)+" for atom "
+        +toString(id)+" present twice.");
+#endif
+    presentBonds.insert( otherid );
+  }
+  LOG(0, "We have the following bonds: "+toString(presentBonds)+".");
+
+  // search for added bonds
+  const BondList &bondlist = _atom->getListOfBonds();
+  for (BondList::const_iterator bonditer = bondlist.begin();
+      bonditer != bondlist.end();
+      ++bonditer) {
+    const bond *_bond = *bonditer;
+    const atomId_t otherid = _bond->GetOtherAtom(_atom)->getId();
+    const BondIds ids = std::make_pair( id, otherid );
+    BondNodeMap::const_iterator iter = BondsinSceneMap.find(ids);
+    if (iter != BondsinSceneMap.end()) {
+      // bond is already present
+      std::set< atomId_t >::const_iterator iter = presentBonds.find(otherid);
+      ASSERT(iter != presentBonds.end(),
+          "GLWorldScene::BondsChanged() - other id "+toString(otherid)+" for atom "
+          +toString(_atom->getId())+" not present in BondIdsinSceneMap.");
+      presentBonds.erase(otherid);
+      LOG(0, "Removing "+toString(otherid)+" from presentBonds.");
+    } else {
+      // insert new bond
+      bondInserted(_bond);
+    }
+  }
+  LOG(0, "The following bonds should not be present: "+toString(presentBonds)+".");
+
+  // remove all still presentBonds
+  for (std::set< atomId_t >::iterator iter = presentBonds.begin();
+      !presentBonds.empty(); iter = presentBonds.begin()) {
+    bondRemoved( id, *iter );
+  }
+}
+
+/** Adds a bond to the scene.
  *
  * @param _bond bond to add
@@ -129,4 +188,5 @@
 void GLWorldScene::bondInserted(const bond *_bond)
 {
+  LOG(0, "GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
   const double distance =
       _bond->leftatom->getPosition().distance(_bond->rightatom->getPosition())/2.;
@@ -134,50 +194,57 @@
     // left bond
     const BondIds Leftids( make_pair(_bond->leftatom->getId(), _bond->rightatom->getId()) );
-    BondNodeMap::iterator iter = BondsinMoleculeMap.find(Leftids);
-    ASSERT(iter == BondsinMoleculeMap.end(),
+    BondNodeMap::iterator iter = BondsinSceneMap.find(Leftids);
+    ASSERT(iter == BondsinSceneMap.end(),
         "GLWorldScene::bondAdded() - same left-sided bond "+toString(*_bond)+" added again.");
     GLMoleculeObject_bond *bondObject =
         new GLMoleculeObject_bond(this, _bond, distance, GLMoleculeObject_bond::left);
-    BondsinMoleculeMap.insert( make_pair(Leftids, bondObject) );
+    BondsinSceneMap.insert( make_pair(Leftids, bondObject) );
+    BondIdsinSceneMap.insert( Leftids );
   }
   {
     // right bond
     const BondIds Rightids( make_pair(_bond->rightatom->getId(), _bond->leftatom->getId()) );
-    BondNodeMap::iterator iter = BondsinMoleculeMap.find(Rightids);
-    ASSERT(iter == BondsinMoleculeMap.end(),
+    BondNodeMap::iterator iter = BondsinSceneMap.find(Rightids);
+    ASSERT(iter == BondsinSceneMap.end(),
         "GLWorldScene::bondAdded() - same right-sided bond "+toString(*_bond)+" added again.");
     GLMoleculeObject_bond *bondObject =
         new GLMoleculeObject_bond(this, _bond, distance, GLMoleculeObject_bond::right);
-    BondsinMoleculeMap.insert( make_pair(Rightids, bondObject) );
-  }
-  emit changed();
-}
-
-/** Removes an bond from the scene.
+    BondsinSceneMap.insert( make_pair(Rightids, bondObject) );
+    BondIdsinSceneMap.insert( Rightids );
+  }
+  emit changed();
+}
+
+/** Removes a bond from the scene.
  *
  * @param _bond bond to remove
  */
-void GLWorldScene::bondRemoved(const bond *_bond)
-{
+void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
+{
+  LOG(0, "GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(leftnr)+".");
   {
     // left bond
-    const BondIds Leftids( make_pair(_bond->leftatom->getId(), _bond->rightatom->getId()) );
-    BondNodeMap::iterator leftiter = BondsinMoleculeMap.find( Leftids );
-    ASSERT(leftiter != BondsinMoleculeMap.end(),
-        "GLWorldScene::bondRemoved() - bond "+toString(*_bond)+" not on display.");
+    const BondIds Leftids( make_pair(leftnr, rightnr) );
+    BondNodeMap::iterator leftiter = BondsinSceneMap.find( Leftids );
+    ASSERT(leftiter != BondsinSceneMap.end(),
+        "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
+        +toString(rightnr)+" not on display.");
     GLMoleculeObject_bond *bondObject = leftiter->second;
-    BondsinMoleculeMap.erase(leftiter);
+    BondsinSceneMap.erase(leftiter);
     delete bondObject;
   }
-  {
-    // right bond
-    const BondIds Rightids( make_pair(_bond->rightatom->getId(), _bond->leftatom->getId()) );
-    BondNodeMap::iterator rightiter = BondsinMoleculeMap.find( Rightids );
-    ASSERT(rightiter != BondsinMoleculeMap.end(),
-        "GLWorldScene::bondRemoved() - bond "+toString(*_bond)+" not on display.");
-    GLMoleculeObject_bond *bondObject = rightiter->second;
-    BondsinMoleculeMap.erase(rightiter);
-    delete bondObject;
-  }
+  // remove from bond ids
+  std::pair<BondIdsMap::iterator, BondIdsMap::iterator> leftrange =
+      BondIdsinSceneMap.equal_range(leftnr);
+  BondIdsMap::iterator iter;
+  for (iter = leftrange.first; iter != leftrange.second; ++iter) {
+    if (iter->second == rightnr) {
+      BondIdsinSceneMap.erase(iter);
+      break;
+    }
+  }
+  ASSERT(iter != leftrange.second,
+      "GLWorldScene::bondRemoved() - could not find ("
+      +toString(leftnr)+"-"+toString(rightnr)+" in BondIdsinSceneMap.");
   emit changed();
 }
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision db7e6dbec5ed7a09556e844d6574a820fe80de92)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
@@ -64,15 +64,18 @@
   void atomInserted(const atom *_atom);
   void atomRemoved(const atom *_atom);
-  void bondInserted(const bond *_bond);
-  void bondRemoved(const bond *_bond);
+  void bondsChanged(const atom *_atom);
 
 private:
   void init();
+  void bondInserted(const bond *_bond);
+  void bondRemoved(const atomId_t leftnr, const atomId_t rightnr);
 
-  typedef std::pair< size_t, size_t> BondIds;
-  typedef std::map< size_t, GLMoleculeObject_atom* > AtomNodeMap;
+  typedef std::pair< atomId_t, atomId_t> BondIds;
+  typedef std::map< atomId_t, GLMoleculeObject_atom* > AtomNodeMap;
   typedef std::map< BondIds , GLMoleculeObject_bond* > BondNodeMap;
-  AtomNodeMap AtomsinMoleculeMap;
-  BondNodeMap BondsinMoleculeMap;
+  typedef std::multimap< atomId_t, atomId_t > BondIdsMap;
+  AtomNodeMap AtomsinSceneMap;
+  BondIdsMap BondIdsinSceneMap;
+  BondNodeMap BondsinSceneMap;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision db7e6dbec5ed7a09556e844d6574a820fe80de92)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp	(revision 37b257551a03bddeeb79df686a845ed3e736653e)
@@ -46,6 +46,4 @@
   void atomInserted(const atom *_atom);
   void atomRemoved(const atom *_atom);
-  void moleculeInserted(const molecule *_mol);
-  void moleculeRemoved(const molecule *_mol);
 
 protected:
