Index: src/Patterns/Observer.cpp
===================================================================
--- src/Patterns/Observer.cpp	(revision adc42b8134b08a947db2f24929ef450e6470041f)
+++ src/Patterns/Observer.cpp	(revision ccacba2c5291cdd3b8dd37487372b1fbff7ed55c)
@@ -27,4 +27,5 @@
 map<Observable*, int> Observable::depth;  //!< Map of Observables to the depth of the DAG of Observers
 map<Observable*,multimap<int,Observer*>*> Observable::callTable; //!< Table for each Observable of all its Observers
+std::map<Observable*,std::set<Notification*> > Observable::notifications;
 set<Observable*> Observable::busyObservables; //!< Set of Observables that are currently busy notifying their sign-on'ed Observers
 
@@ -68,4 +69,9 @@
 }
 
+void Observable::enque_notification_internal(Observable *publisher, Notification_ptr notification){
+  ASSERT(notification->owner==publisher,"Some object tried to send a notification it does not own");
+  notifications[publisher].insert(notification);
+}
+
 /** Constructor for Observable Protector.
  * Basically, calls start_observer_internal(). Hence use this class instead of
@@ -97,5 +103,5 @@
  * and removes from busy list.
  */
-void Observable::notifyAll() {
+void Observable::notifyAll() try {
   // we are busy notifying others right now
   // add ourselves to the list of busy subjects to enable circle detection
@@ -113,7 +119,19 @@
     }
   }
-  // done with notification, we can leave the set of busy subjects
+
+  // send out all notifications that need to be done
+
+  notificationSet currentNotifications = notifications[this];
+  for(notificationSet::iterator it = currentNotifications.begin();
+      it != currentNotifications.end();++it){
+    (*it)->notifyAll();
+  }
+
+  notifications.erase(this);
+
+   // done with notification, we can leave the set of busy subjects
   busyObservables.erase(this);
 }
+ASSERT_NOCATCH("Exception thrown from Observer Update")
 
 /** Handles passing on updates from sub-Observables.
@@ -191,4 +209,18 @@
 }
 
+void Observable::signOn(Observer *target, Notification_ptr notification){
+  ASSERT(notification->owner==this,
+         "Trying to sign on for a notification that is not provided by this object");
+
+  notification->addObserver(target);
+}
+
+void Observable::signOff(Observer *target, Notification_ptr notification){
+  ASSERT(notification->owner==this,
+         "Trying to sign off from a notification that is not provided by this object");
+
+  notification->removeObserver(target);
+}
+
 bool Observable::isBlocked(){
   return depth.count(this) > 0;
@@ -233,2 +265,31 @@
 Observer::~Observer()
 {}
+
+/**
+ * Method for specialized notifications.
+ * Most Observers wont need or use this, so it is implemented
+ * empty in the base case;
+ */
+void Observer::recieveNotification(Observable *publisher, Notification_ptr notification){
+}
+
+Notification::Notification(Observable *_owner) :
+    owner(_owner)
+{}
+
+Notification::~Notification(){}
+
+void Notification::addObserver(Observer *target){
+  targets.insert(target);
+}
+
+void Notification::removeObserver(Observer *target){
+  targets.erase(target);
+}
+
+void Notification::notifyAll(){
+  for(std::set<Observer*>::iterator it=targets.begin();
+      it!=targets.end();++it){
+    (*it)->recieveNotification(owner,this);
+  }
+}
Index: src/Patterns/Observer.hpp
===================================================================
--- src/Patterns/Observer.hpp	(revision adc42b8134b08a947db2f24929ef450e6470041f)
+++ src/Patterns/Observer.hpp	(revision ccacba2c5291cdd3b8dd37487372b1fbff7ed55c)
@@ -29,4 +29,10 @@
 
 class Observable;
+class Notification;
+
+// Pointers to notifications are used for unique identification
+// using this typedef makes it hard for others to mess up this
+// identification process
+typedef Notification *const Notification_ptr;
 
 /**
@@ -46,4 +52,5 @@
 {
   friend class Observable;
+  friend class Notification;
 public:
   Observer();
@@ -55,4 +62,10 @@
    */
   virtual void update(Observable *publisher)=0;
+
+  /**
+   * This method is called when a special named change
+   * of the Observable occured
+   */
+  virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
 
   /**
@@ -96,4 +109,14 @@
 
   /**
+   * Sign on for specialized notifications
+   */
+  virtual void signOn(Observer *target, Notification_ptr notification);
+
+  /**
+   * Stop receiving a specialized notification
+   */
+  virtual void signOff(Observer *target, Notification_ptr notification);
+
+  /**
    * Ask an Observer if it is currently in a blocked state, i.e. if
    * Changes are in Progress, that are not yet published.
@@ -119,9 +142,14 @@
   static void finish_observer_internal(Observable *publisher);
 
+  static void enque_notification_internal(Observable *publisher, Notification_ptr notification);
+
 private:
   typedef std::multimap<int,Observer*> callees_t;
+  typedef std::set<Notification*> notificationSet;
   static std::map<Observable*, int> depth;
   static std::map<Observable*,callees_t*> callTable;
+  static std::map<Observable*,notificationSet> notifications;
   static std::set<Observable*> busyObservables;
+
 
   //! @cond
@@ -143,11 +171,25 @@
 };
 
+class Notification {
+  friend class Observable;
+public:
+  Notification(Observable *_owner);
+  virtual ~Notification();
+protected:
+
+  void addObserver(Observer *target);
+  void removeObserver(Observer *target);
+
+  void notifyAll();
+private:
+  Observable * const owner;
+  std::set<Observer*> targets;
+};
+
 // extra macro is necessary to work with __LINE__
 #define PASTE(a,b) PASTE_HELPER(a,b)
 #define PASTE_HELPER(a,b) a ## b
 #define OBSERVE Observable::_Observable_protector PASTE(_scope_obs_protector_,__LINE__)(this)
-// deprecated macros from before RAII was used
-//#define START_OBSERVER Observable::start_observer_internal(this);do{do{}while(0)
-//#define FINISH_OBSERVER }while(0);Observable::finish_observer_internal(this)
-//#define RETURN_OBSERVER( retval ) do{Observable::finish_observer_internal(this); return (retval);}while(0)
+#define NOTIFY(notification) do{Observable::enque_notification_internal(this,notification);}while(0)
+
 #endif /* OBSERVER_HPP_ */
