Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision a9161db25c69419446f0371e9ca3b69d3d4daac1)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp	(revision 7e2adcdacc44d805e377ada69a708f7d564f4498)
@@ -78,10 +78,10 @@
   leftatomId(bondIds.first),
   rightatomId(bondIds.second),
-  leftatomref(getAtom(leftatomId)),
-  rightatomref(getAtom(rightatomId)),
-  bondref(*leftatomref->getBond(rightatomref)),
+  leftowner(getAtom(leftatomId)),
+  rightowner(getAtom(rightatomId)),
+  bondowner(getAtom(leftatomId)->getBond(getAtom(rightatomId)).get()),
   BondSide(side),
   leftPosition(
-      leftatomref,
+      leftowner,
       boost::bind(&GLMoleculeObject_bond::updateLeftPosition, this),
       "BondleftPosition_"+toString(leftatomId),
@@ -89,5 +89,5 @@
       BondPositionChannels),
   rightPosition(
-      rightatomref,
+      rightowner,
       boost::bind(&GLMoleculeObject_bond::updateRightPosition, this),
       "BondrightPosition_"+toString(rightatomId),
@@ -95,5 +95,5 @@
       BondPositionChannels),
   leftElement(
-      leftatomref,
+      leftowner,
       boost::bind(&GLMoleculeObject_bond::updateLeftElement, this),
       "BondleftElement"+toString(leftatomId),
@@ -101,5 +101,5 @@
       BondElementChannels),
   rightElement(
-      rightatomref,
+      rightowner,
       boost::bind(&GLMoleculeObject_bond::updateRightElement, this),
       "BondrightElement"+toString(rightatomId),
@@ -107,5 +107,5 @@
       BondElementChannels),
   Degree(
-      &bondref,
+      bondowner,
       boost::bind(&GLMoleculeObject_bond::updateDegree, this),
       "BondDegree"+toString(leftatomId)+"_"+toString(rightatomId),
@@ -116,12 +116,12 @@
 {
   // sign on as observer (obtain non-const instance before)
-  bondref.signOn(this, BondObservable::BondRemoved);
-  bondref.signOn(this, BondObservable::DegreeChanged);
+  bondowner->signOn(this, BondObservable::BondRemoved);
+  bondowner->signOn(this, BondObservable::DegreeChanged);
   bond_enabled = true;
-  leftatomref->signOn(this, AtomObservable::PositionChanged);
-  leftatomref->signOn(this, AtomObservable::ElementChanged);
+  leftowner->signOn(this, AtomObservable::PositionChanged);
+  leftowner->signOn(this, AtomObservable::ElementChanged);
   leftobservable_enabled = true;
-  rightatomref->signOn(this, AtomObservable::PositionChanged);
-  rightatomref->signOn(this, AtomObservable::ElementChanged);
+  rightowner->signOn(this, AtomObservable::PositionChanged);
+  rightowner->signOn(this, AtomObservable::ElementChanged);
   rightobservable_enabled = true;
 
@@ -140,79 +140,32 @@
       leftatomId << "," << rightatomId << "] and side " << BondSide << ".");
   // signOff() if not already done
-  removeLeftAtom();
-  removeRightAtom();
   removeChannels();
 }
 
-void GLMoleculeObject_bond::removeLeftAtom()
+void GLMoleculeObject_bond::removeChannels()
 {
   // at this point both atoms should still be alive, hence we may safely sign off
   // from the AtomObservable itself
+  if (bond_enabled) {
+    if (bondowner != NULL) {
+      bondowner->signOff(this, BondObservable::BondRemoved);
+      bondowner->signOff(this, BondObservable::DegreeChanged);
+    }
+    bond_enabled = false;
+  }
   if (leftobservable_enabled) {
-    const atom * const _leftatom = const_cast<const World &>(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 (leftowner != NULL) {
+      leftowner->signOff(this, AtomObservable::PositionChanged);
+      leftowner->signOff(this, AtomObservable::ElementChanged);
+    }
+    leftobservable_enabled = false;
+  }
   if (rightobservable_enabled) {
-    const atom * const _rightatom = const_cast<const World &>(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::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 * const _leftatom = const_cast<const World &>(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 * const _rightatom = const_cast<const World &>(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.");
+    if (rightowner != NULL) {
+      rightowner->signOff(this, AtomObservable::PositionChanged);
+      rightowner->signOff(this, AtomObservable::ElementChanged);
     }
     rightobservable_enabled = false;
   }
-  if (bond_enabled) {
-    const atom * const _leftatom = const_cast<const World &>(World::getInstance()).
-        getAtom(AtomById(leftatomId));
-    const atom * const _rightatom = const_cast<const World &>(World::getInstance()).
-        getAtom(AtomById(rightatomId));
-    if ((_leftatom != NULL) && (_rightatom != NULL)) {
-      bond::ptr _bond = _leftatom->getBond(_rightatom);
-      if (_bond != NULL) {
-        _bond->signOff(this, BondObservable::BondRemoved);
-        _bond->signOff(this, BondObservable::DegreeChanged);
-      }
-    }
-    bond_enabled = false;
-  }
 }
 
@@ -220,17 +173,5 @@
 {
   // sign off
-  switch (BondSide) {
-    case left:
-      emit BondRemoved(leftatomId, rightatomId);
-      break;
-    case right:
-      emit BondRemoved(rightatomId, leftatomId);
-      break;
-    default:
-      ASSERT(0,
-          "GLMoleculeObject_bond::removeMe() - side is not a valid argument: "
-          +toString(BondSide)+".");
-      break;
-  }
+  emit BondRemoved(leftatomId, rightatomId);
 }
 
@@ -242,65 +183,31 @@
 void GLMoleculeObject_bond::subjectKilled(Observable *publisher)
 {
-  // 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*>(&bondref)) {
+  // we signOff from all other sources
+  removeChannels();
+  // then indicate to remove us
+  removeMe();
+}
+
+void GLMoleculeObject_bond::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
 #ifdef LOG_OBSERVER
-    observerLog().addMessage() << "++ subjectKilled of Observer "
-        << observerLog().getName(static_cast<Observer*>(this))
-        << " from bond.";
-#endif
-    removeLeftAtom();
-    removeRightAtom();
-  } else if (publisher == static_cast<const Observable*>(leftatomref)) {
-#ifdef LOG_OBSERVER
-    observerLog().addMessage() << "++ subjectKilled of Observer "
-        << observerLog().getName(static_cast<Observer*>(this))
-        << " from leftatom " << leftatomId << ".";
-#endif
-    removeRightAtom();
-  } else   if (publisher == static_cast<const Observable*>(rightatomref)) {
-#ifdef LOG_OBSERVER
-    observerLog().addMessage() << "++ subjectKilled of Observer " <<
-        observerLog().getName(static_cast<Observer*>(this))
-        << " from rightatom " << rightatomId << ".";
-#endif
-    removeLeftAtom();
-  } else {
-#ifdef LOG_OBSERVER
-    observerLog().addMessage() << "++ subjectKilled of Observer "
-        << observerLog().getName(static_cast<Observer*>(this))
-        << " from unknown source.";
-#endif
-    ASSERT(0, "GLMoleculeObject_bond::recieveNotification() - notification from unknown source.");
-  }
-  // then indicate to remove us
-  removeChannels();
-  removeMe();
-}
-
-void GLMoleculeObject_bond::recieveNotification(Observable *publisher, Notification_ptr notification)
-{
-#ifdef LOG_OBSERVER
-  if (publisher == static_cast<const Observable *>(&bondref)) {
+  if (publisher == static_cast<const Observable *>(bondowner)) {
     observerLog().addMessage() << "++ Update of Observer "
         << observerLog().getName(static_cast<Observer*>(this))
         << " received notification from bond for channel "
         << notification->getChannelNo() << ".";
-  } else if (publisher == static_cast<const Observable * const>(leftatomref)) {
+  } else if (publisher == static_cast<const Observable * const>(leftowner)) {
     observerLog().addMessage() << "++ Update of Observer "
         << observerLog().getName(static_cast<Observer*>(this))
         << " received notification from leftatom " << leftatomId << " for channel "
         << notification->getChannelNo() << ".";
-  } else if (publisher == static_cast<const Observable * const>(rightatomref)) {
+  } else if (publisher == static_cast<const Observable * const>(rightowner)) {
     observerLog().addMessage() << "++ Update of Observer "
         << observerLog().getName(static_cast<Observer*>(this))
         << " received notification from rightatom " << rightatomId << " for channel "
         << notification->getChannelNo() << ".";
-  } else
-    observerLog().addMessage() << "++ Update of Observer "
-        << observerLog().getName(static_cast<Observer*>(this))
-        << " received notification from unknown source.";
+  }
 #endif
-  if (publisher == static_cast<const Observable *>(&bondref)){
+  if (publisher == static_cast<const Observable *>(bondowner)){
     switch (notification->getChannelNo()) {
     case BondObservable::BondRemoved:
Index: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp
===================================================================
--- src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision a9161db25c69419446f0371e9ca3b69d3d4daac1)
+++ src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp	(revision 7e2adcdacc44d805e377ada69a708f7d564f4498)
@@ -73,15 +73,10 @@
    *
    * 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).
+   * removeBond(), and removeChannels() must have been called before (or one of
+   * the subjects has been killed).
    *
    */
   void removeMe();
-  void removeLeftAtom();
-  void removeRightAtom();
   void removeChannels();
 
@@ -101,10 +96,10 @@
   const atomId_t rightatomId;
 
+  //!> contains ref to Observable of left atom
+  const Observable * const leftowner;
+  //!> contains ref to Observable of right atom
+  const Observable * const rightowner;
   //!> temporary variable used in cstor
-  const atom * const leftatomref;
-  //!> temporary variable used in cstor
-  const atom * const rightatomref;
-  //!> temporary variable used in cstor
-  const bond &bondref;
+  const Observable * const bondowner;
 
   const enum SideOfBond BondSide;
