Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 57a77028e5559bee9b5052cdd1e9b9a70c695bd2)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 2ad1ec843e429f317a78f5fdd2e2b6a4926d4afb)
@@ -30,7 +30,10 @@
 #include "CodePatterns/Observer/Notification.hpp"
 
+#include "Atom/atom.hpp"
+#include "Bond/bond.hpp"
 #include "Descriptors/AtomIdDescriptor.hpp"
 #include "Element/element.hpp"
 #include "LinearAlgebra/Vector.hpp"
+#include "GLMoleculeObject_bond.hpp"
 #include "World.hpp"
 
@@ -45,5 +48,7 @@
 
 GLMoleculeObject_atom::GLMoleculeObject_atom(QObject *parent, const atom *atomref) :
-  GLMoleculeObject(createAtom(parent), parent), Observer("GLMoleculeObject_atom"), _atom(atomref)
+  GLMoleculeObject(createAtom(parent), parent),
+  Observer(std::string("GLMoleculeObject_atom")+toString(atomref->getId())),
+  _atom(atomref)
 {
   // sign on as observer (obtain non-const instance before)
@@ -51,5 +56,5 @@
   atomref->signOn(this, AtomObservable::PositionChanged);
   atomref->signOn(this, AtomObservable::ElementChanged);
-  atomref->signOn(this, AtomObservable::BondsChanged);
+  atomref->signOn(this, AtomObservable::BondsAdded);
 
   // set the object's id
@@ -66,5 +71,5 @@
   _atom->signOff(this, AtomObservable::PositionChanged);
   _atom->signOff(this, AtomObservable::ElementChanged);
-  _atom->signOff(this, AtomObservable::BondsChanged);
+  _atom->signOff(this, AtomObservable::BondsAdded);
 }
 
@@ -153,7 +158,14 @@
       resetPosition();
       break;
-    case AtomObservable::BondsChanged:
-      emit BondsChanged(_atom);
-      break;
+    case AtomObservable::BondsAdded:
+      {
+        ASSERT(!_atom->getListOfBonds().empty(),
+            "GLMoleculeObject_atom::recieveNotification() - received BondsAdded but ListOfBonds is empty.");
+        const bond * _bond = *(_atom->getListOfBonds().rbegin());
+        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == _atom) ?
+            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
+        emit BondsInserted(_bond, side);
+        break;
+      }
     default:
       //setProperties();
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 57a77028e5559bee9b5052cdd1e9b9a70c695bd2)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp	(revision 2ad1ec843e429f317a78f5fdd2e2b6a4926d4afb)
@@ -18,5 +18,8 @@
 #include "CodePatterns/Observer/Observer.hpp"
 
-#include "Atom/atom.hpp"
+#include "GLMoleculeObject_bond.hpp"
+
+class atom;
+class bond;
 
 class GLMoleculeObject_atom : public GLMoleculeObject, public Observer
@@ -37,5 +40,5 @@
 signals:
   void clicked(atomId_t);
-  void BondsChanged(const atom *_atom);
+  void BondsInserted(const bond *_bond, const GLMoleculeObject_bond::SideOfBond side);
 
 private:
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 57a77028e5559bee9b5052cdd1e9b9a70c695bd2)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 2ad1ec843e429f317a78f5fdd2e2b6a4926d4afb)
@@ -31,4 +31,5 @@
 #include "CodePatterns/Assert.hpp"
 #include "CodePatterns/Log.hpp"
+#include "CodePatterns/Observer/Notification.hpp"
 #include "Atom/atom.hpp"
 #include "Bond/bond.hpp"
@@ -49,11 +50,20 @@
 }
 
-GLMoleculeObject_bond::GLMoleculeObject_bond(QObject *parent, const bond *bondref, double distance, enum SideOfBond side) :
-  GLMoleculeObject(createBond(parent, distance), parent), _bond(bondref)
+GLMoleculeObject_bond::GLMoleculeObject_bond(QObject *parent, const bond *bondref, const double distance, const enum SideOfBond side) :
+  GLMoleculeObject(createBond(parent, distance), parent),
+  Observer(std::string("GLMoleculeObject_bond")
+      +toString(bondref->leftatom->getId())
+      +std::string("-")
+      +toString(bondref->rightatom->getId())),
+  _bond(bondref),
+  BondSide(side)
 {
+  // sign on as observer (obtain non-const instance before)
+  _bond->signOn(this, BondObservable::BondRemoved);
+
   Vector Position;
   Vector OtherPosition;
   size_t elementno = 0;
-  switch (side) {
+  switch (BondSide) {
     case left:
       Position = _bond->leftatom->getPosition();
@@ -77,5 +87,5 @@
     default:
       ASSERT(0,
-          "GLMoleculeObject_bond::GLMoleculeObject_bond() - side is not a valid argument: "+toString(side)+".");
+          "GLMoleculeObject_bond::GLMoleculeObject_bond() - side is not a valid argument: "+toString(BondSide)+".");
       break;
   }
@@ -113,2 +123,64 @@
   setRotationAngle(alpha/M_PI*180.);
 }
+
+GLMoleculeObject_bond::~GLMoleculeObject_bond()
+{
+  // sign on as observer (obtain non-const instance before)
+  _bond->signOff(this, BondObservable::BondRemoved);
+
+  LOG(2, "INFO: Destroying  GLMoleculeObject_bond to bond " << *_bond << " and side " << BondSide << ".");
+}
+
+void GLMoleculeObject_bond::update(Observable *publisher)
+{
+#ifdef LOG_OBSERVER
+  observerLog().addMessage() << "++ Update of Observer " << observerLog().getName(this) << " from bond " << *_bond << ".";
+#endif
+}
+
+void GLMoleculeObject_bond::subjectKilled(Observable *publisher)
+{
+  LOG(2, "INFO: Received subjectKilled from " << *_bond << ".");
+  switch (BondSide) {
+    case left:
+      emit BondRemoved(_bond->leftatom->getId(), _bond->rightatom->getId());
+      break;
+    case right:
+      emit BondRemoved(_bond->rightatom->getId(), _bond->leftatom->getId());
+      break;
+    default:
+      ASSERT(0,
+          "GLMoleculeObject_bond::subjectKilled() - side is not a valid argument: "+toString(BondSide)+".");
+      break;
+  }
+  delete this;
+}
+
+void GLMoleculeObject_bond::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
+#ifdef LOG_OBSERVER
+  observerLog().addMessage() << "++ Update of Observer "<< observerLog().getName(this)
+      << " received notification from bond " << *_bond << " for channel "
+      << notification->getChannelNo() << ".";
+#endif
+  switch (notification->getChannelNo()) {
+    case BondObservable::BondRemoved:
+      LOG(2, "INFO: Received notification of BondRemoved from " << *_bond << ".");
+      switch (BondSide) {
+        case left:
+          emit BondRemoved(_bond->leftatom->getId(), _bond->rightatom->getId());
+          break;
+        case right:
+          emit BondRemoved(_bond->rightatom->getId(), _bond->leftatom->getId());
+          break;
+        default:
+          ASSERT(0,
+              "GLMoleculeObject_bond::recieveNotification() - side is not a valid argument: "+toString(BondSide)+".");
+          break;
+      }
+      delete this;
+      break;
+    default:
+      break;
+  }
+}
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 57a77028e5559bee9b5052cdd1e9b9a70c695bd2)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 2ad1ec843e429f317a78f5fdd2e2b6a4926d4afb)
@@ -16,7 +16,11 @@
 #include "GLMoleculeObject.hpp"
 
+#include "CodePatterns/Observer/Observer.hpp"
+
+#include "types.hpp"
+
 class bond;
 
-class GLMoleculeObject_bond : public GLMoleculeObject
+class GLMoleculeObject_bond : public GLMoleculeObject, public Observer
 {
   Q_OBJECT
@@ -24,10 +28,18 @@
   enum SideOfBond { left, right };
 
-  GLMoleculeObject_bond(QObject *parent, const bond *bondref, double distance, enum SideOfBond side);
-  virtual ~GLMoleculeObject_bond() {}
+  GLMoleculeObject_bond(QObject *parent, const bond *bondref, const double distance, const enum SideOfBond side);
+  virtual ~GLMoleculeObject_bond();
 
+  // Observer functions
+  void update(Observable *publisher);
+  void subjectKilled(Observable *publisher);
+  void recieveNotification(Observable *publisher, Notification_ptr notification);
+
+signals:
+  void BondRemoved(const atomId_t leftnr, const atomId_t rightnr);
 
 private:
   const bond *_bond;
+  const enum SideOfBond BondSide;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 57a77028e5559bee9b5052cdd1e9b9a70c695bd2)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 2ad1ec843e429f317a78f5fdd2e2b6a4926d4afb)
@@ -39,5 +39,13 @@
 #include "World.hpp"
 
+#include <iostream>
+
 using namespace MoleCuilder;
+
+std::ostream &operator<<(std::ostream &ost, const GLWorldScene::BondIds &t)
+{
+  ost << t.first << "," << t.second;
+  return ost;
+}
 
 GLWorldScene::GLWorldScene(QObject *parent)
@@ -74,5 +82,13 @@
 
         // create bond objects in scene
-        bondsChanged(*atomiter);
+        const BondList &bondlist = (*atomiter)->getListOfBonds();
+        for (BondList::const_iterator bonditer = bondlist.begin();
+            bonditer != bondlist.end();
+            ++bonditer) {
+          const bond *_bond = *bonditer;
+          const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
+              GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
+          bondInserted(_bond, side);
+        }
       }
     }
@@ -94,6 +110,6 @@
   connect (atomObject, SIGNAL(clicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
   connect (atomObject, SIGNAL(hoverChanged()), this, SIGNAL(changed()));
-  connect (atomObject, SIGNAL(BondsChanged(const atom *)), this, SLOT(bondsChanged(const atom *)));
-  bondsChanged(_atom);
+  connect (atomObject, SIGNAL(BondsInserted(const bond *, const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const bond *, const GLMoleculeObject_bond::SideOfBond)));
+  //bondsChanged(_atom);
   emit changeOccured();
 }
@@ -106,10 +122,5 @@
 {
   LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_atom->getId())+".");
-  // remove all its bonds
-  const BondList& bondlist = _atom->getListOfBonds();
-  for (BondList::const_iterator iter = bondlist.begin(); iter != bondlist.end(); ++iter) {
-    bondRemoved((*iter)->leftatom->getId(), (*iter)->rightatom->getId());
-    bondRemoved((*iter)->rightatom->getId(), (*iter)->leftatom->getId());
-  }
+  // bonds are removed by signal coming from ~bond
   // remove atoms
   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_atom->getId());
@@ -123,91 +134,37 @@
 }
 
-/** 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(3, "INFO: 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);
-    }
-  }
-  if (!presentBonds.empty())
-    ELOG(2, "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
- */
-void GLWorldScene::bondInserted(const bond *_bond)
+ * @param side which side of the bond (left or right)
+ */
+void GLWorldScene::bondInserted(const bond *_bond, const enum GLMoleculeObject_bond::SideOfBond side)
 {
   LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
+  //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
   const double distance =
       _bond->leftatom->getPosition().distance(_bond->rightatom->getPosition())/2.;
-  {
-    // left bond
-    const BondIds Leftids( make_pair(_bond->leftatom->getId(), _bond->rightatom->getId()) );
-    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);
-    BondsinSceneMap.insert( make_pair(Leftids, bondObject) );
-    BondIdsinSceneMap.insert( Leftids );
+
+  BondIds ids;
+  switch (side) {
+    case GLMoleculeObject_bond::left:
+      ids = std::make_pair(_bond->leftatom->getId(), _bond->rightatom->getId());
+      break;
+    case GLMoleculeObject_bond::right:
+      ids = std::make_pair(_bond->rightatom->getId(), _bond->leftatom->getId());
+      break;
   }
-  {
-    // right bond
-    const BondIds Rightids( make_pair(_bond->rightatom->getId(), _bond->leftatom->getId()) );
-    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);
-    BondsinSceneMap.insert( make_pair(Rightids, bondObject) );
-    BondIdsinSceneMap.insert( Rightids );
-  }
+#ifndef NDEBUG
+  BondNodeMap::iterator iter = BondsinSceneMap.find(ids);
+  ASSERT(iter == BondsinSceneMap.end(),
+      "GLWorldScene::bondAdded() - same left-sided bond "+toString(*_bond)+" added again.");
+#endif
+  GLMoleculeObject_bond *bondObject =
+      new GLMoleculeObject_bond(this, _bond, distance, side);
+  connect (
+      bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
+      this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
+  BondsinSceneMap.insert( make_pair(ids, bondObject) );
+//    BondIdsinSceneMap.insert( Leftids );
   emit changeOccured();
 }
@@ -219,5 +176,5 @@
 void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
 {
-  LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(leftnr)+".");
+  LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(rightnr)+".");
   {
     // left bond
@@ -227,21 +184,10 @@
         "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
         +toString(rightnr)+" not on display.");
-    GLMoleculeObject_bond *bondObject = leftiter->second;
+    //GLMoleculeObject_bond *bondObject = leftiter->second;
     BondsinSceneMap.erase(leftiter);
-    delete bondObject;
+    //delete bondObject; // is done by signal from bond itself
+    //LOG(4, "INFO: Still present bonds " << BondsinSceneMap << ".");
   }
-  // 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 changeOccured();
 }
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 57a77028e5559bee9b5052cdd1e9b9a70c695bd2)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp	(revision 2ad1ec843e429f317a78f5fdd2e2b6a4926d4afb)
@@ -20,4 +20,8 @@
 #include "molecule.hpp"
 
+#include <iosfwd>
+
+#include "GLMoleculeObject_bond.hpp"
+
 class atom;
 
@@ -28,5 +32,4 @@
 class GLMoleculeObject;
 class GLMoleculeObject_atom;
-class GLMoleculeObject_bond;
 
 /** This class contains a list of all molecules in the world.
@@ -65,21 +68,21 @@
   void atomInserted(const atom *_atom);
   void atomRemoved(const atom *_atom);
-  void bondsChanged(const atom *_atom);
+  void bondInserted(const bond *_bond, const GLMoleculeObject_bond::SideOfBond side);
+  void bondRemoved(const atomId_t leftnr, const atomId_t rightnr);
 
 private:
   void init();
-  void bondInserted(const bond *_bond);
-  void bondRemoved(const atomId_t leftnr, const atomId_t rightnr);
 
+private:
   typedef std::pair< atomId_t, atomId_t> BondIds;
+  friend std::ostream &operator<<(std::ostream &ost, const BondIds &t);
+
   typedef std::map< atomId_t, GLMoleculeObject_atom* > AtomNodeMap;
   typedef std::map< BondIds , GLMoleculeObject_bond* > BondNodeMap;
-  typedef std::multimap< atomId_t, atomId_t > BondIdsMap;
   AtomNodeMap AtomsinSceneMap;
-  BondIdsMap BondIdsinSceneMap;
   BondNodeMap BondsinSceneMap;
 };
 
-
+std::ostream &operator<<(std::ostream &ost, const GLWorldScene::BondIds &t);
 
 #endif /* GLWORLDSCENE_HPP_ */
