Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 411202d11c9be919e416a6a7fdea33997c3baa52)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 70db8f3d2544d28a29353cbdfd3c39dd4ea5002a)
@@ -60,17 +60,23 @@
       +std::string("-")
       +toString(bondref->rightatom->getId())),
-  _bond(bondref),
+  _bond(*bondref),
+  leftatom(bondref->leftatom),
+  rightatom(bondref->rightatom),
+  leftatomId(bondref->leftatom->getId()),
+  rightatomId(bondref->rightatom->getId()),
   BondSide(side)
 {
   // sign on as observer (obtain non-const instance before)
-  _bond->signOn(this, BondObservable::BondRemoved);
-  _bond->leftatom->signOn(this, AtomObservable::PositionChanged);
-  _bond->rightatom->signOn(this, AtomObservable::PositionChanged);
+  _bond.signOn(this, BondObservable::BondRemoved);
+  leftatom->signOn(this, AtomObservable::PositionChanged);
+  leftatom->signOn(this, AtomObservable::ElementChanged);
+  rightatom->signOn(this, AtomObservable::PositionChanged);
+  rightatom->signOn(this, AtomObservable::ElementChanged);
 
   size_t elementno = 0;
   switch (BondSide) {
     case left:
-      if (_bond->rightatom->getType() != NULL) {
-        elementno = _bond->rightatom->getType()->getAtomicNumber();
+      if (_bond.rightatom->getType() != NULL) {
+        elementno = _bond.rightatom->getType()->getAtomicNumber();
       } else { // if not element yet set, set to hydrogen
         elementno = 1;
@@ -78,6 +84,6 @@
       break;
     case right:
-      if (_bond->leftatom->getType() != NULL) {
-        elementno = _bond->leftatom->getType()->getAtomicNumber();
+      if (_bond.leftatom->getType() != NULL) {
+        elementno = _bond.leftatom->getType()->getAtomicNumber();
       } else { // if not element yet set, set to hydrogen
         elementno = 1;
@@ -99,42 +105,49 @@
 GLMoleculeObject_bond::~GLMoleculeObject_bond()
 {
-  // sign on as observer (obtain non-const instance before)
-  if (_bond){
-    _bond->signOff(this, BondObservable::BondRemoved);
-    _bond->leftatom->signOff(this, AtomObservable::PositionChanged);
-    _bond->rightatom->signOff(this, AtomObservable::PositionChanged);
-    LOG(2, "INFO: Destroying  GLMoleculeObject_bond to bond " << *_bond << " and side " << BondSide << ".");
-  }else{
-    LOG(2, "INFO: Destroying  GLMoleculeObject_bond (bond already killed).");
-  }
-}
-
-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 << ".");
+  // sign off
   switch (BondSide) {
     case left:
-      emit BondRemoved(_bond->leftatom->getId(), _bond->rightatom->getId());
+      emit BondRemoved(leftatomId, rightatomId);
       break;
     case right:
-      emit BondRemoved(_bond->rightatom->getId(), _bond->leftatom->getId());
+      emit BondRemoved(rightatomId, leftatomId);
       break;
     default:
       ASSERT(0,
-          "GLMoleculeObject_bond::subjectKilled() - side is not a valid argument: "+toString(BondSide)+".");
-      break;
-  }
-
-  // Don't let the destructor automatically sign off from a dead bond!
-  _bond->leftatom->signOff(this, AtomObservable::PositionChanged);
-  _bond->rightatom->signOff(this, AtomObservable::PositionChanged);
-  _bond.reset();
+          "GLMoleculeObject_bond::subjectKilled() - side is not a valid argument: "
+          +toString(BondSide)+".");
+      break;
+  }
+  _bond.signOff(this, BondObservable::BondRemoved);
+  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 << ".");
+}
+
+void GLMoleculeObject_bond::update(Observable *publisher)
+{
+#ifdef LOG_OBSERVER
+  if (publisher == static_cast<const Observable *>(&_bond)) {
+    observerLog().addMessage() << "++ Update of Observer "
+        << 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) {
+    observerLog().addMessage() << "++ Update of Observer " <<
+        observerLog().getName(static_cast<Observer*>(this))
+        << " from rightatom " << _bond.rightatom->getId() << ".";
+  } else
+    observerLog().addMessage() << "++ Update of Observer " <<
+    observerLog().getName(static_cast<Observer*>(this)) << " from unknown source.";
+#endif
+}
+
+void GLMoleculeObject_bond::subjectKilled(Observable *publisher)
+{
   delete this;
 }
@@ -143,40 +156,42 @@
 {
 #ifdef LOG_OBSERVER
-  observerLog().addMessage() << "++ Update of Observer "<< observerLog().getName(this)
-      << " received notification from bond " << *_bond << " for channel "
-      << notification->getChannelNo() << ".";
+  if (publisher == static_cast<const Observable *>(&_bond)) {
+    observerLog().addMessage() << "++ Update of Observer "
+        << observerLog().getName(static_cast<Observer*>(this))
+        << " 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 "
+        << 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 "
+        << notification->getChannelNo() << ".";
+  } else
+    observerLog().addMessage() << "++ Update of Observer "
+        << observerLog().getName(static_cast<Observer*>(this))
+        << " received notification from unknown source.";
 #endif
-  if (publisher == dynamic_cast<const Observable *>(_bond.get())){
-    // from the bond
-    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;
-        }
-
-        // Don't let the destructor automatically sign off from a dead bond!
-        _bond->leftatom->signOff(this, AtomObservable::PositionChanged);
-        _bond->rightatom->signOff(this, AtomObservable::PositionChanged);
-        _bond.reset();
-        delete this;
-        break;
-          default:
-            break;
-    }
-  }else{
+  if (publisher == static_cast<const Observable *>(&_bond)){
+    delete this;
+  } else {
+    bool DoResetPosition = false;
     // from an atom
     switch (notification->getChannelNo()) {
-      case AtomObservable::PositionChanged:
-        LOG(2, "INFO: Received notification of PositionChanged.");
+    case AtomObservable::PositionChanged:
+      LOG(2, "INFO: Received notification of PositionChanged.");
+      DoResetPosition = true;
+      break;
+    case AtomObservable::ElementChanged:
+      LOG(2, "INFO: Received notification of ElementChanged.");
+      DoResetPosition = true;
+      break;
+    default:
+      break;
+    }
+    if (DoResetPosition) {
         resetPosition();
         emit changed();
@@ -191,10 +206,10 @@
   switch (BondSide) {
     case left:
-      Position = _bond->leftatom->getPosition();
-      OtherPosition = _bond->rightatom->getPosition();
+      Position = _bond.leftatom->getPosition();
+      OtherPosition = _bond.rightatom->getPosition();
       break;
     case right:
-      Position = _bond->rightatom->getPosition();
-      OtherPosition = _bond->leftatom->getPosition();
+      Position = _bond.rightatom->getPosition();
+      OtherPosition = _bond.leftatom->getPosition();
       break;
     default:
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 411202d11c9be919e416a6a7fdea33997c3baa52)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 70db8f3d2544d28a29353cbdfd3c39dd4ea5002a)
@@ -21,4 +21,5 @@
 #include "types.hpp"
 
+class atom;
 
 class GLMoleculeObject_bond : public GLMoleculeObject, public Observer
@@ -41,5 +42,21 @@
 private:
   void resetPosition();
-  bond::ptr _bond;
+  const bond& _bond;
+  /** Observable instance inside atom_observable for left bond partner.
+   * We require this knowledge as subjectKilled is called by Observable, not
+   * by AtomObservable which has already been destroyed at this time.
+   *
+   */
+  const Observable *leftatom;
+  /** Observable instance inside atom_observable for right bond partner.
+   * We require this knowledge as subjectKilled is called by Observable, not
+   * by AtomObservable which has already been destroyed at this time.
+   *
+   */
+  const Observable *rightatom;
+  //!> id of left bond partner for safely emitting BondRemoved sigbal
+  const atomId_t leftatomId;
+  //!> id of right bond partner for safely emitting BondRemoved sigbal
+  const atomId_t rightatomId;
   const enum SideOfBond BondSide;
 };
