Index: src/Atom/AtomObserver.cpp
===================================================================
--- src/Atom/AtomObserver.cpp	(revision 214240311376bc0a14571b81249ac930343e5a7b)
+++ src/Atom/AtomObserver.cpp	(revision 691318150bfa891f9352e2ebc6b228e22d710743)
@@ -50,5 +50,5 @@
 {
   Channels *OurChannel = new Channels();
-  NotificationChannels.insert( std::make_pair(this, OurChannel) );
+  NotificationChannels.insert( std::make_pair(static_cast<Observable *>(this), OurChannel) );
   OurChannel->addChannel(AtomObservable::PositionChanged);
   OurChannel->addChannel(AtomObservable::ElementChanged);
@@ -71,3 +71,13 @@
 }
 
+/** Function to call when an atom is about to get deleted.
+ *
+ * @param res
+ */
+void AtomObserver::AtomRemoved(atom *res)
+{
+  res->signOff(this, AtomObservable::PositionChanged);
+  res->signOff(this, AtomObservable::ElementChanged);
+}
+
 CONSTRUCT_SINGLETON(AtomObserver)
Index: src/Atom/AtomObserver.hpp
===================================================================
--- src/Atom/AtomObserver.hpp	(revision 214240311376bc0a14571b81249ac930343e5a7b)
+++ src/Atom/AtomObserver.hpp	(revision 691318150bfa891f9352e2ebc6b228e22d710743)
@@ -18,5 +18,4 @@
 
 class atom;
-class World;
 
 /** The AtomObserver is a central instance to all changes occuring within atoms.
@@ -26,4 +25,8 @@
  * keeps him updated in case of removed or added atoms.
  *
+ * \warning AtomObserver must get purged \b after World as we do not keep an
+ * an internal list of all atoms. Hence, each atom must get destroyed while
+ * the AtomObserver instance is still intact or segfault will occur.
+ *
  */
 class AtomObserver : public Singleton<AtomObserver>, public Relay
@@ -32,14 +35,15 @@
   friend class Singleton<AtomObserver>;
 
-  //!> grant World access to AtomInserted.
-  friend class World;
+  //!> grant atom access
+  friend class atom;
 public:
 
 private:
   void AtomInserted(atom *res);
+  void AtomRemoved(atom *res);
 
   // private constructor and destructor due to singleton
   AtomObserver();
-  ~AtomObserver();
+  virtual ~AtomObserver();
 };
 
Index: src/Atom/atom.cpp
===================================================================
--- src/Atom/atom.cpp	(revision 214240311376bc0a14571b81249ac930343e5a7b)
+++ src/Atom/atom.cpp	(revision 691318150bfa891f9352e2ebc6b228e22d710743)
@@ -35,4 +35,5 @@
 
 #include "atom.hpp"
+#include "AtomObserver.hpp"
 #include "Bond/bond.hpp"
 #include "CodePatterns/Log.hpp"
@@ -54,5 +55,8 @@
   sort(&Nr),
   mol(0)
-{};
+{
+  // sign on to global atom change tracker
+  AtomObserver::getInstance().AtomInserted(this);
+}
 
 atom::atom(atom *pointer) :
@@ -66,4 +70,6 @@
   AtomicVelocity = pointer->AtomicVelocity; // copy trajectory of velocity
   AtomicForce = pointer->AtomicForce;
+  // sign on to global atom change tracker
+  AtomObserver::getInstance().AtomInserted(this);
 };
 
@@ -80,5 +86,7 @@
 {
   removeFromMolecule();
-};
+  // sign off from global atom change tracker
+  AtomObserver::getInstance().AtomRemoved(this);
+}
 
 
Index: src/Atom/atom_observable.cpp
===================================================================
--- src/Atom/atom_observable.cpp	(revision 214240311376bc0a14571b81249ac930343e5a7b)
+++ src/Atom/atom_observable.cpp	(revision 691318150bfa891f9352e2ebc6b228e22d710743)
@@ -46,5 +46,5 @@
 {
   Channels *OurChannel = new Channels;
-  NotificationChannels.insert( std::make_pair(this, OurChannel) );
+  NotificationChannels.insert( std::make_pair(static_cast<Observable *>(this), OurChannel) );
   // add instance for each notification type
   for (size_t type = 0; type < NotificationType_MAX; ++type)
@@ -53,9 +53,3 @@
 
 AtomObservable::~AtomObservable()
-{
-  std::map<Observable *, Channels*>::iterator iter = NotificationChannels.find(this);
-  ASSERT(iter != NotificationChannels.end(),
-      "~AtomObservable() - cannot find myself in NotificationChannels.");
-  delete iter->second;
-  NotificationChannels.erase(iter);
-}
+{}
Index: src/Atom/unittests/AtomObserverUnitTest.cpp
===================================================================
--- src/Atom/unittests/AtomObserverUnitTest.cpp	(revision 214240311376bc0a14571b81249ac930343e5a7b)
+++ src/Atom/unittests/AtomObserverUnitTest.cpp	(revision 691318150bfa891f9352e2ebc6b228e22d710743)
@@ -95,6 +95,6 @@
   delete observer2;
 
+  World::purgeInstance();
   AtomObserver::purgeInstance();
-  World::purgeInstance();
 }
 
