Index: src/Patterns/Observer.cpp
===================================================================
--- src/Patterns/Observer.cpp	(revision ccacba2c5291cdd3b8dd37487372b1fbff7ed55c)
+++ src/Patterns/Observer.cpp	(revision 8de8f7b299a3c2fc402aaddc75ea02cd83785773)
@@ -26,5 +26,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
+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
@@ -103,5 +103,5 @@
  * and removes from busy list.
  */
-void Observable::notifyAll() try {
+void Observable::notifyAll() {
   // we are busy notifying others right now
   // add ourselves to the list of busy subjects to enable circle detection
@@ -109,14 +109,17 @@
   // see if anyone has signed up for observation
   // and call all observers
-  if(callTable.count(this)) {
-    // elements are stored sorted by keys in the multimap
-    // so iterating over it gives us a the callees sorted by
-    // the priorities
-    callees_t *callees = callTable[this];
-    callees_t::iterator iter;
-    for(iter=callees->begin();iter!=callees->end();++iter){
-      (*iter).second->update(this);
-    }
-  }
+  try {
+    if(callTable.count(this)) {
+      // elements are stored sorted by keys in the multimap
+      // so iterating over it gives us a the callees sorted by
+      // the priorities
+      callees_t callees = callTable[this];
+      callees_t::iterator iter;
+      for(iter=callees.begin();iter!=callees.end();++iter){
+        (*iter).second->update(this);
+      }
+    }
+  }
+  ASSERT_NOCATCH("Exception thrown from Observer Update");
 
   // send out all notifications that need to be done
@@ -133,5 +136,5 @@
   busyObservables.erase(this);
 }
-ASSERT_NOCATCH("Exception thrown from Observer Update")
+
 
 /** Handles passing on updates from sub-Observables.
@@ -169,19 +172,12 @@
   ASSERT(priority>=-20 && priority<=+20, "Priority out of range [-20:+20] when signing on Observer");
   bool res = false;
-  callees_t *callees = 0;
-  if(callTable.count(this)){
-    callees = callTable[this];
-  }
-  else {
-    callees = new multimap<int,Observer*>;
-    callTable.insert(pair<Observable*,callees_t*>(this,callees));
-  }
+  callees_t &callees = callTable[this];
 
   callees_t::iterator iter;
-  for(iter=callees->begin();iter!=callees->end();++iter){
+  for(iter=callees.begin();iter!=callees.end();++iter){
     res |= ((*iter).second == target);
   }
   if(!res)
-    callees->insert(pair<int,Observer*>(priority,target));
+    callees.insert(pair<int,Observer*>(priority,target));
 }
 
@@ -192,10 +188,10 @@
 void Observable::signOff(Observer *target) {
   ASSERT(callTable.count(this),"SignOff called for an Observable without Observers.");
-  callees_t *callees = callTable[this];
+  callees_t &callees = callTable[this];
   callees_t::iterator iter;
   callees_t::iterator deliter;
-  for(iter=callees->begin();iter!=callees->end();) {
+  for(iter=callees.begin();iter!=callees.end();) {
     if((*iter).second == target) {
-      callees->erase(iter++);
+      callees.erase(iter++);
     }
     else {
@@ -203,7 +199,6 @@
     }
   }
-  if(callees->empty()){
+  if(callees.empty()){
     callTable.erase(this);
-    delete callees;
   }
 }
@@ -246,11 +241,10 @@
   if(callTable.count(this)) {
     // delete all entries for this observable
-    callees_t *callees = callTable[this];
+    callees_t callees = callTable[this];
     callees_t::iterator iter;
-    for(iter=callees->begin();iter!=callees->end();++iter){
+    for(iter=callees.begin();iter!=callees.end();++iter){
       (*iter).second->subjectKilled(this);
     }
     callTable.erase(this);
-    delete callees;
   }
 }
@@ -272,4 +266,5 @@
  */
 void Observer::recieveNotification(Observable *publisher, Notification_ptr notification){
+  ASSERT(0,"Notification received by object that did not sign on for it.");
 }
 
Index: src/Patterns/Observer.hpp
===================================================================
--- src/Patterns/Observer.hpp	(revision ccacba2c5291cdd3b8dd37487372b1fbff7ed55c)
+++ src/Patterns/Observer.hpp	(revision 8de8f7b299a3c2fc402aaddc75ea02cd83785773)
@@ -148,5 +148,5 @@
   typedef std::set<Notification*> notificationSet;
   static std::map<Observable*, int> depth;
-  static std::map<Observable*,callees_t*> callTable;
+  static std::map<Observable*,callees_t> callTable;
   static std::map<Observable*,notificationSet> notifications;
   static std::set<Observable*> busyObservables;
