Index: src/Helpers/Assert.hpp
===================================================================
--- src/Helpers/Assert.hpp	(revision 8a343929d462595f19dbd79fc4a77406c88f7b7a)
+++ src/Helpers/Assert.hpp	(revision ccacba2c5291cdd3b8dd37487372b1fbff7ed55c)
@@ -263,4 +263,11 @@
     }while(0)
 
+  #define ASSERT_NOCATCH(message) \
+		catch(Assert::AssertionFailure&){throw;}\
+		catch(...){\
+		  static bool ignore = false; \
+		  _my_assert::check(false,"Exception caught",(message),__FILE__,__LINE__,ignore);\
+		}
+
   #define ASSERT_DO(action)    do{_my_assert::setDefault(action);}while(0)
   #define ASSERT_HOOK(hook)    do{_my_assert::addHook(hook);}while(0)
Index: src/Patterns/Observer.cpp
===================================================================
--- src/Patterns/Observer.cpp	(revision 8a343929d462595f19dbd79fc4a77406c88f7b7a)
+++ 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 8a343929d462595f19dbd79fc4a77406c88f7b7a)
+++ 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_ */
Index: src/unittests/ObserverTest.cpp
===================================================================
--- src/unittests/ObserverTest.cpp	(revision 8a343929d462595f19dbd79fc4a77406c88f7b7a)
+++ src/unittests/ObserverTest.cpp	(revision ccacba2c5291cdd3b8dd37487372b1fbff7ed55c)
@@ -116,4 +116,49 @@
   }
   SimpleObservable *subObservable;
+};
+
+class NotificationObservable : public Observable {
+public:
+  NotificationObservable() :
+      notification1(new Notification(this)),
+      notification2(new Notification(this))
+  {}
+
+  ~NotificationObservable(){
+    delete notification1;
+    delete notification2;
+  }
+
+  void operation1(){
+    OBSERVE;
+    NOTIFY(notification1);
+  }
+
+  void operation2(){
+    OBSERVE;
+    NOTIFY(notification2);
+  }
+
+  Notification_ptr notification1;
+  Notification_ptr notification2;
+};
+
+class NotificationObserver : public Observer {
+public:
+  NotificationObserver(Notification_ptr notification) :
+    requestedNotification(notification),
+    wasNotified(false)
+  {}
+
+  void update(Observable*){}
+  void subjectKilled(Observable*){}
+  void recieveNotification(Observable *publisher, Notification_ptr notification){
+    ASSERT(requestedNotification==notification,"Notification recieved that was not requested");
+    wasNotified = true;
+  }
+
+  Notification_ptr requestedNotification;
+
+  bool wasNotified;
 };
 
@@ -127,4 +172,5 @@
   superObservable = new SuperObservable();
   blockObservable = new BlockObservable();
+  notificationObservable = new NotificationObservable();
 
   observer1 = new UpdateCountObserver();
@@ -132,4 +178,8 @@
   observer3 = new UpdateCountObserver();
   observer4 = new UpdateCountObserver();
+
+  notificationObserver1 = new NotificationObserver(notificationObservable->notification1);
+  notificationObserver2 = new NotificationObserver(notificationObservable->notification2);
+
 }
 
@@ -139,4 +189,5 @@
   delete callObservable;
   delete superObservable;
+  delete notificationObservable;
 
   delete observer1;
@@ -144,4 +195,6 @@
   delete observer3;
   delete observer4;
+  delete notificationObserver1;
+  delete notificationObserver2;
 }
 
@@ -198,4 +251,22 @@
   CPPUNIT_ASSERT_EQUAL( 2, observer1->updates );
   CPPUNIT_ASSERT_EQUAL( 2, observer2->updates );
+}
+
+void ObserverTest::doesNotifyTest(){
+  notificationObservable->signOn(notificationObserver1,
+                                 notificationObservable->notification1);
+  notificationObservable->signOn(notificationObserver2,
+                                 notificationObservable->notification2);
+
+  notificationObservable->operation1();
+  CPPUNIT_ASSERT(notificationObserver1->wasNotified);
+  CPPUNIT_ASSERT(!notificationObserver2->wasNotified);
+
+  notificationObserver1->wasNotified=false;
+
+  notificationObservable->operation2();
+  CPPUNIT_ASSERT(!notificationObserver1->wasNotified);
+  CPPUNIT_ASSERT(notificationObserver2->wasNotified);
+
 }
 
Index: src/unittests/ObserverTest.hpp
===================================================================
--- src/unittests/ObserverTest.hpp	(revision 8a343929d462595f19dbd79fc4a77406c88f7b7a)
+++ src/unittests/ObserverTest.hpp	(revision ccacba2c5291cdd3b8dd37487372b1fbff7ed55c)
@@ -13,8 +13,10 @@
 // forward declaration for test stubs
 class UpdateCountObserver;
+class NotificationObserver;
 class SimpleObservable;
 class CallObservable;
 class SuperObservable;
 class BlockObservable;
+class NotificationObservable;
 
 
@@ -25,4 +27,5 @@
   CPPUNIT_TEST ( doesBlockUpdateTest );
   CPPUNIT_TEST ( doesSubObservableTest );
+  CPPUNIT_TEST ( doesNotifyTest );
   CPPUNIT_TEST ( doesReportTest );
   CPPUNIT_TEST ( CircleDetectionTest );
@@ -36,4 +39,5 @@
   void doesBlockUpdateTest();
   void doesSubObservableTest();
+  void doesNotifyTest();
   void doesReportTest();
   void CircleDetectionTest();
@@ -45,4 +49,7 @@
   UpdateCountObserver *observer4;
 
+  NotificationObserver *notificationObserver1;
+  NotificationObserver *notificationObserver2;
+
   SimpleObservable *simpleObservable1;
   SimpleObservable *simpleObservable2;
@@ -50,4 +57,5 @@
   BlockObservable *blockObservable;
   SuperObservable *superObservable;
+  NotificationObservable *notificationObservable;
 };
 
