Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision 9176598b2abdf3b63b4901d8c0078619f061e6fb)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp	(revision c606650feaa9bde232bfc4e765e72313fb562e6b)
@@ -116,30 +116,31 @@
   size_t elementno = 0;
   const atom *_atom = World::getInstance().getAtom(AtomById(atomicid));
+  const element *_type = NULL;
   if (_atom != NULL) {
-    const element *_type = _atom->getType();
-    if (_type != NULL) {
-      elementno = _type->getAtomicNumber();
-    } else { // if no element yet, set to hydrogen
-      elementno = 1;
-    }
-    LOG(4, "INFO: GLMoleculeObject_atom::resetIndex() - new element number is "+toString(elementno)+".");
-
-    // set materials
-    QGLMaterial *elementmaterial = getMaterial(elementno);
-    ASSERT(elementmaterial != NULL,
-        "GLMoleculeObject_atom::GLMoleculeObject_atom() - QGLMaterial ref from getter function is NULL.");
-    setMaterial(elementmaterial);
-
-    // set scale
-    double radius = 0.;
-    if (_type != NULL) {
-      radius = _type->getVanDerWaalsRadius();
-    } else {
-      radius = 0.5;
-    }
-    setScale( radius / 4. );
+    _type = _atom->getType();
   } else {
     ELOG(2, "Atom with id "+toString(atomicid)+" is already gone.");
   }
+  if (_type != NULL) {
+    elementno = _type->getAtomicNumber();
+  } else { // if no element yet, set to hydrogen
+    elementno = 1;
+  }
+  LOG(4, "INFO: GLMoleculeObject_atom::resetIndex() - new element number is "+toString(elementno)+".");
+
+  // set materials
+  QGLMaterial *elementmaterial = getMaterial(elementno);
+  ASSERT(elementmaterial != NULL,
+      "GLMoleculeObject_atom::GLMoleculeObject_atom() - QGLMaterial ref from getter function is NULL.");
+  setMaterial(elementmaterial);
+
+  // set scale
+  double radius = 0.;
+  if (_type != NULL) {
+    radius = _type->getVanDerWaalsRadius();
+  } else {
+    radius = 0.5;
+  }
+  setScale( radius / 4. );
 }
 
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 9176598b2abdf3b63b4901d8c0078619f061e6fb)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision c606650feaa9bde232bfc4e765e72313fb562e6b)
@@ -48,4 +48,5 @@
 #include "CodePatterns/Observer/Notification.hpp"
 #include "CodePatterns/Observer/ObserverLog.hpp"
+#include "Descriptors/AtomIdDescriptor.hpp"
 #include "Atom/atom.hpp"
 #include "Bond/bond.hpp"
@@ -54,4 +55,5 @@
 #include "LinearAlgebra/Line.hpp"
 #include "LinearAlgebra/Vector.hpp"
+#include "World.hpp"
 
 GLMoleculeObject_bond::GLMoleculeObject_bond(QGLSceneNode *mesh[], QObject *parent, const bond::ptr bondref, const enum SideOfBond side) :
@@ -62,30 +64,44 @@
       +toString(bondref->rightatom->getId())),
   _bond(*bondref),
-  leftatom(bondref->leftatom),
-  rightatom(bondref->rightatom),
+  leftobservable(bondref->leftatom),
+  rightobservable(bondref->rightatom),
   leftatomId(bondref->leftatom->getId()),
   rightatomId(bondref->rightatom->getId()),
-  BondSide(side)
+  BondSide(side),
+  leftobservable_enabled(false),
+  rightobservable_enabled(false),
+  bond_enabled(false)
 {
   // sign on as observer (obtain non-const instance before)
+  _bond.signOn(this);
   _bond.signOn(this, BondObservable::BondRemoved);
   _bond.signOn(this, BondObservable::DegreeChanged);
-  leftatom->signOn(this, AtomObservable::PositionChanged);
-  leftatom->signOn(this, AtomObservable::ElementChanged);
-  rightatom->signOn(this, AtomObservable::PositionChanged);
-  rightatom->signOn(this, AtomObservable::ElementChanged);
+  bond_enabled = true;
+  leftobservable->signOn(this);
+  leftobservable->signOn(this, AtomObservable::PositionChanged);
+  leftobservable->signOn(this, AtomObservable::ElementChanged);
+  leftobservable_enabled = true;
+  rightobservable->signOn(this);
+  rightobservable->signOn(this, AtomObservable::PositionChanged);
+  rightobservable->signOn(this, AtomObservable::ElementChanged);
+  rightobservable_enabled = true;
 
   size_t elementno = 0;
   switch (BondSide) {
     case left:
-      if (_bond.rightatom->getType() != NULL) {
-        elementno = _bond.rightatom->getType()->getAtomicNumber();
+    {
+      const atom *_rightatom = World::getInstance().getAtom(AtomById(rightatomId));
+      if (_rightatom->getType() != NULL) {
+        elementno = _rightatom->getType()->getAtomicNumber();
       } else { // if not element yet set, set to hydrogen
         elementno = 1;
       }
       break;
+    }
     case right:
-      if (_bond.leftatom->getType() != NULL) {
-        elementno = _bond.leftatom->getType()->getAtomicNumber();
+    {
+      const atom *_leftatom = World::getInstance().getAtom(AtomById(leftatomId));
+      if (_leftatom->getType() != NULL) {
+        elementno = _leftatom->getType()->getAtomicNumber();
       } else { // if not element yet set, set to hydrogen
         elementno = 1;
@@ -93,4 +109,5 @@
 
       break;
+    }
     default:
       ASSERT(0,
@@ -107,4 +124,80 @@
 
 GLMoleculeObject_bond::~GLMoleculeObject_bond()
+{
+  LOG(3, "DEBUG: Destroying  GLMoleculeObject_bond to bond " << &_bond << " and side " << BondSide << ".");
+  // signOff() if not already done
+  removeLeftAtom();
+  removeRightAtom();
+  removeBond();
+  removeChannels();
+}
+
+void GLMoleculeObject_bond::removeLeftAtom()
+{
+  // at this point both atoms should still be alive, hence we may safely sign off
+  // from the AtomObservable itself
+  if (leftobservable_enabled) {
+    const atom *_leftatom = World::getInstance().getAtom(AtomById(leftatomId));
+    if (_leftatom != NULL) {
+      _leftatom->signOff(this);
+    } else {
+      ELOG(2, "Left atom of bond with id "+toString(leftatomId)+" is already gone.");
+    }
+  }
+}
+
+void GLMoleculeObject_bond::removeRightAtom()
+{
+  // at this point both atoms should still be alive, hence we may safely sign off
+  // from the AtomObservable itself
+  if (rightobservable_enabled) {
+    const atom *_rightatom = World::getInstance().getAtom(AtomById(rightatomId));
+    if (_rightatom != NULL) {
+      _rightatom->signOff(this);
+    } else {
+      ELOG(2, "Right atom of bond with id "+toString(rightatomId)+" is already gone.");
+    }
+  }
+}
+
+void GLMoleculeObject_bond::removeBond()
+{
+  if (bond_enabled)
+    _bond.signOff(this);
+}
+
+void GLMoleculeObject_bond::removeChannels()
+{
+  // at this point both atoms should still be alive, hence we may safely sign off
+  // from the AtomObservable itself
+  if (leftobservable_enabled) {
+    const atom *_leftatom = World::getInstance().getAtom(AtomById(leftatomId));
+    if (_leftatom != NULL) {
+      _leftatom->signOff(this, AtomObservable::PositionChanged);
+      _leftatom->signOff(this, AtomObservable::ElementChanged);
+    } else {
+      ELOG(2, "Left atom of bond with id "+toString(leftatomId)+" is already gone.");
+    }
+    leftobservable_enabled = false;
+  }
+  if (rightobservable_enabled) {
+    const atom *_rightatom = World::getInstance().getAtom(AtomById(rightatomId));
+    if (_rightatom != NULL) {
+      _rightatom->signOff(this, AtomObservable::PositionChanged);
+      _rightatom->signOff(this, AtomObservable::ElementChanged);
+    } else {
+      ELOG(2, "Right atom of bond with id "+toString(rightatomId)+" is already gone.");
+    }
+    rightobservable_enabled = false;
+  }
+  if (bond_enabled) {
+    _bond.signOff(this, BondObservable::BondRemoved);
+    _bond.signOff(this, BondObservable::DegreeChanged);
+    bond_enabled = false;
+  }
+}
+
+
+void GLMoleculeObject_bond::removeMe()
 {
   // sign off
@@ -122,11 +215,4 @@
       break;
   }
-  _bond.signOff(this, BondObservable::BondRemoved);
-  _bond.signOff(this, BondObservable::DegreeChanged);
-  leftatom->signOff(this, AtomObservable::PositionChanged);
-  leftatom->signOff(this, AtomObservable::ElementChanged);
-  rightatom->signOff(this, AtomObservable::PositionChanged);
-  rightatom->signOff(this, AtomObservable::ElementChanged);
-  LOG(3, "DEBUG: Destroying  GLMoleculeObject_bond to bond " << &_bond << " and side " << BondSide << ".");
 }
 
@@ -138,12 +224,12 @@
         << observerLog().getName(static_cast<Observer*>(this))
         << " from bond.";
-  } else if (publisher == leftatom) {
-    observerLog().addMessage() << "++ Update of Observer "
-        << observerLog().getName(static_cast<Observer*>(this))
-        << " from leftatom " << _bond.leftatom->getId() << ".";
-  } else if (publisher == rightatom) {
+  } else if (publisher == leftobservable) {
+    observerLog().addMessage() << "++ Update of Observer "
+        << observerLog().getName(static_cast<Observer*>(this))
+        << " from leftatom " << leftatomId << ".";
+  } else if (publisher == rightobservable) {
     observerLog().addMessage() << "++ Update of Observer " <<
         observerLog().getName(static_cast<Observer*>(this))
-        << " from rightatom " << _bond.rightatom->getId() << ".";
+        << " from rightatom " << rightatomId << ".";
   } else
     observerLog().addMessage() << "++ Update of Observer " <<
@@ -154,5 +240,39 @@
 void GLMoleculeObject_bond::subjectKilled(Observable *publisher)
 {
-  delete this;
+  // assume subjectKilled() is from Observable's own subjectKilled(), not notifications
+  // but we must always signOff from all other sources!
+  if (publisher == static_cast<const Observable *>(&_bond)) {
+#ifdef LOG_OBSERVER
+    observerLog().addMessage() << "++ subjectKilled of Observer "
+        << observerLog().getName(static_cast<Observer*>(this))
+        << " from bond.";
+#endif
+    removeLeftAtom();
+    removeRightAtom();
+  } else if (publisher == leftobservable) {
+#ifdef LOG_OBSERVER
+    observerLog().addMessage() << "++ subjectKilled of Observer "
+        << observerLog().getName(static_cast<Observer*>(this))
+        << " from leftatom " << leftatomId << ".";
+#endif
+    removeRightAtom();
+    removeBond();
+  } else if (publisher == rightobservable) {
+#ifdef LOG_OBSERVER
+    observerLog().addMessage() << "++ subjectKilled of Observer " <<
+        observerLog().getName(static_cast<Observer*>(this))
+        << " from rightatom " << rightatomId << ".";
+#endif
+    removeLeftAtom();
+    removeBond();
+  } else {
+#ifdef LOG_OBSERVER
+    observerLog().addMessage() << "++ subjectKilled of Observer " <<
+    observerLog().getName(static_cast<Observer*>(this)) << " from unknown source.";
+#endif
+  }
+  // then indicate to remove us
+  removeChannels();
+  removeMe();
 }
 
@@ -165,13 +285,13 @@
         << " received notification from bond for channel "
         << notification->getChannelNo() << ".";
-  } else if (publisher == leftatom) {
-    observerLog().addMessage() << "++ Update of Observer "
-        << observerLog().getName(static_cast<Observer*>(this))
-        << " received notification from leftatom " << _bond.leftatom->getId() << " for channel "
+  } else if (publisher == leftobservable) {
+    observerLog().addMessage() << "++ Update of Observer "
+        << observerLog().getName(static_cast<Observer*>(this))
+        << " received notification from leftatom " << leftatomId << " for channel "
         << notification->getChannelNo() << ".";
-  } else if (publisher == rightatom) {
-    observerLog().addMessage() << "++ Update of Observer "
-        << observerLog().getName(static_cast<Observer*>(this))
-        << " received notification from rightatom " << _bond.rightatom->getId() << " for channel "
+  } else if (publisher == rightobservable) {
+    observerLog().addMessage() << "++ Update of Observer "
+        << observerLog().getName(static_cast<Observer*>(this))
+        << " received notification from rightatom " << rightatomId << " for channel "
         << notification->getChannelNo() << ".";
   } else
@@ -185,5 +305,5 @@
     switch (notification->getChannelNo()) {
     case BondObservable::BondRemoved:
-      delete this;
+//      removeMe();
       break;
     case BondObservable::DegreeChanged:
@@ -231,12 +351,16 @@
   Vector Position;
   Vector OtherPosition;
+  const atom *_leftatom = World::getInstance().getAtom(AtomById(leftatomId));
+  Vector LeftPos = _leftatom->getPosition();
+  const atom *_rightatom = World::getInstance().getAtom(AtomById(rightatomId));
+  Vector RightPos = _rightatom->getPosition();
   switch (BondSide) {
     case left:
-      Position = _bond.leftatom->getPosition();
-      OtherPosition = _bond.rightatom->getPosition();
+      Position = LeftPos;
+      OtherPosition = RightPos;
       break;
     case right:
-      Position = _bond.rightatom->getPosition();
-      OtherPosition = _bond.leftatom->getPosition();
+      Position = RightPos; 
+      OtherPosition = LeftPos;
       break;
     default:
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 9176598b2abdf3b63b4901d8c0078619f061e6fb)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision c606650feaa9bde232bfc4e765e72313fb562e6b)
@@ -51,4 +51,22 @@
   void resetWidth();
 
+  /** This must be called from subjectKilled() only.
+   *
+   * We remove from all other Observables in a controlled manner.
+   * However, we assume that either bond, leftobservable, or rightobservable
+   * called subjectKilled(). Hence, we may still signOff() from all noifications
+   * but not from the calling Observable.
+   *
+   * removeLeftAtom(), removeRightAtom(), removeBond(), and removeChannels()
+   * must have been called before (or one of the subjects has been killed).
+   *
+   */
+  void removeMe();
+  void removeLeftAtom();
+  void removeRightAtom();
+  void removeChannels();
+  void removeBond();
+
+private:
   const bond& _bond;
   /** Observable instance inside atom_observable for left bond partner.
@@ -57,5 +75,5 @@
    *
    */
-  const Observable *leftatom;
+  const Observable *leftobservable;
   /** Observable instance inside atom_observable for right bond partner.
    * We require this knowledge as subjectKilled is called by Observable, not
@@ -63,5 +81,5 @@
    *
    */
-  const Observable *rightatom;
+  const Observable *rightobservable;
   //!> id of left bond partner for safely emitting BondRemoved sigbal
   const atomId_t leftatomId;
@@ -69,4 +87,11 @@
   const atomId_t rightatomId;
   const enum SideOfBond BondSide;
+
+  //!> indicate whether we are signed in to leftobservable
+  bool leftobservable_enabled;
+  //!> indicate whether we are signed in to rightobservable
+  bool rightobservable_enabled;
+  //!> indicate whether we are signed in to _bond
+  bool bond_enabled;
 };
 
Index: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision 9176598b2abdf3b63b4901d8c0078619f061e6fb)
+++ src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp	(revision c606650feaa9bde232bfc4e765e72313fb562e6b)
@@ -295,7 +295,7 @@
         "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
         +toString(rightnr)+" not on display.");
-    //GLMoleculeObject_bond::ptr bondObject = leftiter->second;
+    GLMoleculeObject_bond *bondObject = leftiter->second;
     BondsinSceneMap.erase(leftiter);
-    //delete bondObject; // is done by signal from bond itself
+    delete bondObject; // is done by signal from bond itself
     //LOG(4, "INFO: Still present bonds " << BondsinSceneMap << ".");
   }
