Index: src/Atom/AtomicInfo.cpp
===================================================================
--- src/Atom/AtomicInfo.cpp	(revision 910a5d3c24251e841b550140856bdc84d981ff30)
+++ src/Atom/AtomicInfo.cpp	(revision 24edfefcd1e3d9e98ec524cea974f518103d90f6)
@@ -88,18 +88,23 @@
   bool status = true;
   if (_atom.getId() != Id)
-    status = _atom.changeId(Id);
+    status &= _atom.changeId(Id);
 
   // set its father
-  atom * const _father = World::getInstance().getAtom(AtomById(FatherId));
-  if (_father == NULL)
-    _atom.father = &_atom;
-  else
-    _atom.father = _father;
+  if (status) {
+    atom * const _father = World::getInstance().getAtom(AtomById(FatherId));
+    if ((_father == NULL) || (Id == FatherId)) {
+      _atom.father = &_atom;
+      // don't sign on
+    } else {
+      _atom.father = _father;
+      _father->signOn(&_atom);
+    }
 
-  // setting molecule
-  molecule * const _mol = World::getInstance().getMolecule(MoleculeById(MolId));
-  if (_mol != NULL)
-    _atom.setMolecule(_mol); // this is ok, mol is const within AtomicInfo, but not outside (atoms need to register)
-  _atom.changeNr(Nr);
+    // setting molecule
+    molecule * const _mol = World::getInstance().getMolecule(MoleculeById(MolId));
+    if (_mol != NULL)
+      _atom.setMolecule(_mol); // this is ok, mol is const within AtomicInfo, but not outside (atoms need to register)
+    _atom.changeNr(Nr);
+  }
 
   return status;
Index: src/Atom/atom.cpp
===================================================================
--- src/Atom/atom.cpp	(revision 910a5d3c24251e841b550140856bdc84d981ff30)
+++ src/Atom/atom.cpp	(revision 24edfefcd1e3d9e98ec524cea974f518103d90f6)
@@ -58,5 +58,5 @@
   mol(0)
 {
-  // sign on to global atom change tracker
+  // note AtomObserver about inserted atom
   AtomObserver::getInstance().AtomInserted(this);
 }
@@ -69,5 +69,8 @@
     mol(0)
 {
-  // sign on to global atom change tracker
+  // sign on to father atom to be notified when it is removed
+  father->signOn(this);
+
+  // note AtomObserver about inserted atom
   AtomObserver::getInstance().AtomInserted(this);
 };
@@ -84,6 +87,10 @@
 atom::~atom()
 {
+  // sign off from possible father
+  if ((father != this) && (father != NULL))
+    father->signOff(this);
+
   removeFromMolecule();
-  // sign off from global atom change tracker
+  // note AtomObserver about removed atom
   AtomObserver::getInstance().AtomRemoved(this);
 }
@@ -129,5 +136,10 @@
 void atom::setFather(atom * const _father)
 {
+  // sign off from old father
+  if ((father != this) && (father != NULL))
+    father->signOff(this);
+
   father = _father;
+  father->signOn(this);
 }
 
@@ -330,2 +342,20 @@
   return atom1->getType()->getAtomicNumber() < atom2->getType()->getAtomicNumber();
 }
+/*
+void atom::update(Observable *publisher)
+{}
+
+void atom::recieveNotification(Observable *publisher, Notification_ptr notification)
+{
+  ASSERT(0, "atom::recieveNotification() - we are not signed on to any notifications.");
+}
+*/
+void atom::subjectKilled(Observable *publisher)
+{
+  // as publisher has been half-deallocated (Observable is one of the base classes, hence
+  // becomes destroyed latest), we cannot senibly cast it anymore.
+  // Hence, we simply have to check here whether it is NOT one of the other instances
+  // we are signed on to.
+  father = this;
+  // no need to sign off
+}
Index: src/Atom/atom.hpp
===================================================================
--- src/Atom/atom.hpp	(revision 910a5d3c24251e841b550140856bdc84d981ff30)
+++ src/Atom/atom.hpp	(revision 24edfefcd1e3d9e98ec524cea974f518103d90f6)
@@ -25,8 +25,10 @@
 #include "atom_bondedparticle.hpp"
 #include "atom_graphnode.hpp"
+#include "atom_observable.hpp"
 #include "atom_particleinfo.hpp"
 #include "Atom/TesselPoint.hpp"
 #include "types.hpp"
 
+#include "CodePatterns/Observer/Observer.hpp"
 #include "CodePatterns/enumeration.hpp"
 
@@ -44,5 +46,9 @@
  * Class incorporates position, type
  */
-class atom : public GraphNode, public BondedParticle, public TesselPoint {
+class atom :
+            public GraphNode,
+            public BondedParticle,
+            public TesselPoint
+{
   friend atom* NewAtom(atomId_t);
   friend void  DeleteAtom(atom*);
@@ -243,4 +249,7 @@
     void unsetMolecule();
 
+//    virtual void update(Observable *publisher);
+//    virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
+    virtual void subjectKilled(Observable *publisher);
 
   private:
Index: src/Atom/atom_observable.cpp
===================================================================
--- src/Atom/atom_observable.cpp	(revision 910a5d3c24251e841b550140856bdc84d981ff30)
+++ src/Atom/atom_observable.cpp	(revision 24edfefcd1e3d9e98ec524cea974f518103d90f6)
@@ -55,2 +55,5 @@
 AtomObservable::~AtomObservable()
 {}
+
+void AtomObservable::subjectKilled(Observable *publisher)
+{}
Index: src/Atom/atom_observable.hpp
===================================================================
--- src/Atom/atom_observable.hpp	(revision 910a5d3c24251e841b550140856bdc84d981ff30)
+++ src/Atom/atom_observable.hpp	(revision 24edfefcd1e3d9e98ec524cea974f518103d90f6)
@@ -41,4 +41,8 @@
   AtomObservable();
   virtual ~AtomObservable();
+
+protected:
+
+  virtual void subjectKilled(Observable *publisher);
 };
 
