Index: src/Atom/AtomObserver.cpp
===================================================================
--- src/Atom/AtomObserver.cpp	(revision 5dfabdae3cbf78f772003f96b321468cd321f7eb)
+++ src/Atom/AtomObserver.cpp	(revision 5dfabdae3cbf78f772003f96b321468cd321f7eb)
@@ -0,0 +1,75 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2011 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * AtomObserver.cpp
+ *
+ *  Created on: Nov 30, 2011
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "AtomObserver.hpp"
+
+#include "CodePatterns/Singleton_impl.hpp"
+
+#include "Atom/atom.hpp"
+
+
+/** Private constructor of class AtomObserver.
+ *
+ */
+AtomObserver::AtomObserver() :
+  Relay(std::string("AtomObserver"))
+{}
+
+/** Private Destructor of class AtomObserver.
+ *
+ */
+AtomObserver::~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::ElementChanged);
+}
+
+/** Callback function for Observer mechanism.
+ *
+ * @param publisher reference to the Observable that calls
+ */
+void AtomObserver::update(Observable *publisher)
+{}
+
+/** Callback function for the Notifications mechanism.
+ *
+ * @param publisher reference to the Observable that calls
+ * @param notification specific notification as cause of the call
+ */
+void AtomObserver::recieveNotification(Observable *publisher, Notification_ptr notification)
+{}
+
+/** Callback function when an Observer dies.
+ *
+ * @param publisher reference to the Observable that calls
+ */
+void AtomObserver::subjectKilled(Observable *publisher)
+{}
+
+
+CONSTRUCT_SINGLETON(AtomObserver)
Index: src/Atom/AtomObserver.hpp
===================================================================
--- src/Atom/AtomObserver.hpp	(revision 5dfabdae3cbf78f772003f96b321468cd321f7eb)
+++ src/Atom/AtomObserver.hpp	(revision 5dfabdae3cbf78f772003f96b321468cd321f7eb)
@@ -0,0 +1,52 @@
+/*
+ * AtomObserver.hpp
+ *
+ *  Created on: Nov 30, 2011
+ *      Author: heber
+ */
+
+#ifndef ATOMOBSERVER_HPP_
+#define ATOMOBSERVER_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/Observer/Relay.hpp"
+#include "CodePatterns/Singleton.hpp"
+
+class atom;
+class World;
+
+/** 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.
+ *
+ */
+class AtomObserver : public Singleton<AtomObserver>, public Relay
+{
+  //!> grant Singleton access to cstor and dstor.
+  friend class Singleton<AtomObserver>;
+
+  //!> grant World access to AtomInserted.
+  friend class World;
+public:
+
+protected:
+  void update(Observable *publisher);
+  void recieveNotification(Observable *publisher, Notification_ptr notification);
+  void subjectKilled(Observable *publisher);
+
+private:
+  void AtomInserted(atom *res);
+
+  // private constructor and destructor due to singleton
+  AtomObserver();
+  ~AtomObserver();
+};
+
+
+#endif /* ATOMOBSERVER_HPP_ */
Index: src/Atom/Makefile.am
===================================================================
--- src/Atom/Makefile.am	(revision 2614e2a00e7cda71401ccb728478c22e406f12a3)
+++ src/Atom/Makefile.am	(revision 5dfabdae3cbf78f772003f96b321468cd321f7eb)
@@ -4,5 +4,4 @@
 ATOMSOURCE = \
   Atom/atom.cpp \
-  Atom/AtomicInfo.cpp \
   Atom/atom_atominfo.cpp \
   Atom/atom_bondedparticle.cpp \
@@ -12,4 +11,6 @@
   Atom/atom_observable.cpp \
   Atom/atom_particleinfo.cpp \
+  Atom/AtomicInfo.cpp \
+  Atom/AtomObserver.cpp \
   Atom/TesselPoint.cpp
 
@@ -24,4 +25,5 @@
   Atom/atom_particleinfo.hpp \
   Atom/AtomicInfo.hpp \
+  Atom/AtomObserver.hpp \
   Atom/AtomSet.hpp \
   Atom/TesselPoint.hpp
Index: src/World.cpp
===================================================================
--- src/World.cpp	(revision 2614e2a00e7cda71401ccb728478c22e406f12a3)
+++ src/World.cpp	(revision 5dfabdae3cbf78f772003f96b321468cd321f7eb)
@@ -27,4 +27,5 @@
 #include "Actions/ManipulateAtomsProcess.hpp"
 #include "Atom/atom.hpp"
+#include "Atom/AtomObserver.hpp"
 #include "Box.hpp"
 #include "CodePatterns/Assert.hpp"
@@ -227,4 +228,6 @@
   atom *res = NewAtom(id);
   res->setWorld(this);
+  // sign on to global atom change tracker
+  AtomObserver::getInstance().AtomInserted(res);
   // store the atom by ID
   atoms[res->getId()] = res;
Index: src/World.hpp
===================================================================
--- src/World.hpp	(revision 2614e2a00e7cda71401ccb728478c22e406f12a3)
+++ src/World.hpp	(revision 5dfabdae3cbf78f772003f96b321468cd321f7eb)
@@ -102,4 +102,5 @@
     AtomInserted,
     AtomRemoved,
+    AtomPositionChanged,
     AtomChanged,
     MoleculeInserted,
