Index: src/Atom/AtomObserver.cpp
===================================================================
--- src/Atom/AtomObserver.cpp	(revision 5d8f4f5fc5c4b1c6be8cfb8f938b76cfd81bf228)
+++ src/Atom/AtomObserver.cpp	(revision 2bfc5b108b5b586dc7738bcfddb9149a69e37af0)
@@ -36,79 +36,27 @@
 #include "CodePatterns/MemDebug.hpp"
 
-#include "AtomObserver.hpp"
+#include <boost/assign.hpp>
 
 #include "CodePatterns/Singleton_impl.hpp"
 
-#include "Atom/atom.hpp"
 #include "Atom/atom_observable.hpp"
 
+#include "AtomObserver.hpp"
 
-/** Private constructor of class AtomObserver.
- *
- */
-AtomObserver::AtomObserver() :
-  Relay(std::string("AtomObserver"))
+using namespace boost::assign;
+
+static const Observable::channels_t getAtomChannels()
 {
-  Channels *OurChannel = new Channels();
-  Observable::insertNotificationChannel( std::make_pair(static_cast<Observable *>(this), OurChannel) );
-  OurChannel->addChannel(AtomObservable::PositionChanged);
-  OurChannel->addChannel(AtomObservable::VelocityChanged);
-  OurChannel->addChannel(AtomObservable::ForceChanged);
-  OurChannel->addChannel(AtomObservable::MoleculeChanged);
-  OurChannel->addChannel(AtomObservable::NameChanged);
-  OurChannel->addChannel(AtomObservable::ElementChanged);
-  OurChannel->addChannel(AtomObservable::IndexChanged);
-  OurChannel->addChannel(AtomObservable::PropertyChanged);
-  OurChannel->addChannel(AtomObservable::BondsAdded);
-  OurChannel->addChannel(AtomObservable::BondsRemoved);
-  OurChannel->addChannel(AtomObservable::TrajectoryChanged);
-  OurChannel->addChannel(AtomObservable::SelectionChanged);
+  Observable::channels_t channels;
+  for (int i=0;i<AtomObservable::NotificationType_MAX; ++i)
+    channels += (enum AtomObservable::NotificationType)i;
+  return channels;
 }
 
-/** Private Destructor of class AtomObserver.
- *
- */
-AtomObserver::~AtomObserver()
+const Observable::channels_t AtomObserver::AtomChannels(getAtomChannels());
+
+AtomObserver::AtomObserver() :
+    EntityObserver<atom>(AtomChannels, std::string("AtomObserver"))
 {}
 
-/** Function to call when a new atom has been created.
- *
- * @param res
- */
-void AtomObserver::AtomInserted(atom *res)
-{
-  res->signOn(this, AtomObservable::PositionChanged);
-  res->signOn(this, AtomObservable::VelocityChanged);
-  res->signOn(this, AtomObservable::ForceChanged);
-  res->signOn(this, AtomObservable::MoleculeChanged);
-  res->signOn(this, AtomObservable::NameChanged);
-  res->signOn(this, AtomObservable::ElementChanged);
-  res->signOn(this, AtomObservable::IndexChanged);
-  res->signOn(this, AtomObservable::PropertyChanged);
-  res->signOn(this, AtomObservable::BondsAdded);
-  res->signOn(this, AtomObservable::BondsRemoved);
-  res->signOn(this, AtomObservable::TrajectoryChanged);
-  res->signOn(this, AtomObservable::SelectionChanged);
-}
-
-/** 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::VelocityChanged);
-  res->signOff(this, AtomObservable::ForceChanged);
-  res->signOff(this, AtomObservable::MoleculeChanged);
-  res->signOff(this, AtomObservable::NameChanged);
-  res->signOff(this, AtomObservable::ElementChanged);
-  res->signOff(this, AtomObservable::IndexChanged);
-  res->signOff(this, AtomObservable::PropertyChanged);
-  res->signOff(this, AtomObservable::BondsAdded);
-  res->signOff(this, AtomObservable::BondsRemoved);
-  res->signOff(this, AtomObservable::TrajectoryChanged);
-  res->signOff(this, AtomObservable::SelectionChanged);
-}
-
 CONSTRUCT_SINGLETON(AtomObserver)
Index: src/Atom/AtomObserver.hpp
===================================================================
--- src/Atom/AtomObserver.hpp	(revision 5d8f4f5fc5c4b1c6be8cfb8f938b76cfd81bf228)
+++ src/Atom/AtomObserver.hpp	(revision 2bfc5b108b5b586dc7738bcfddb9149a69e37af0)
@@ -14,6 +14,7 @@
 #endif
 
-#include "CodePatterns/Observer/Relay.hpp"
 #include "CodePatterns/Singleton.hpp"
+
+#include "EntityObserver.hpp"
 
 class atom;
@@ -21,30 +22,18 @@
 /** The AtomObserver is a central instance to all changes occuring within atoms.
  *
- * The intent is that if a class wants to know about changes in just _any_ atom,
- * he may register singly to this class and not to each and every atom. This also
- * 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.
+ * It implements the templated EntityObserver class for atoms.
  *
  * \sa MoleculeObserver
  */
-class AtomObserver : public Singleton<AtomObserver>, public Relay
+class AtomObserver : public Singleton< AtomObserver >, public EntityObserver<atom>
 {
   //!> grant Singleton access to cstor and dstor.
-  friend class Singleton<AtomObserver>;
+  friend class Singleton< AtomObserver >;
 
-  //!> grant atom access
-  friend class atom;
-public:
-
-private:
-  void AtomInserted(atom *res);
-  void AtomRemoved(atom *res);
+  //!> list of all observed channels
+  static const Observable::channels_t AtomChannels;
 
   // private constructor and destructor due to singleton
   AtomObserver();
-  virtual ~AtomObserver();
 };
 
Index: src/Atom/atom.cpp
===================================================================
--- src/Atom/atom.cpp	(revision 5d8f4f5fc5c4b1c6be8cfb8f938b76cfd81bf228)
+++ src/Atom/atom.cpp	(revision 2bfc5b108b5b586dc7738bcfddb9149a69e37af0)
@@ -60,5 +60,5 @@
 {
   // note AtomObserver about inserted atom
-  AtomObserver::getInstance().AtomInserted(this);
+  AtomObserver::getInstance().Inserted(this);
 }
 
@@ -75,5 +75,5 @@
 
   // note AtomObserver about inserted atom
-  AtomObserver::getInstance().AtomInserted(this);
+  AtomObserver::getInstance().Inserted(this);
 };
 
@@ -95,5 +95,5 @@
   removeFromMolecule();
   // note AtomObserver about removed atom
-  AtomObserver::getInstance().AtomRemoved(this);
+  AtomObserver::getInstance().Removed(this);
 }
 
