diff --git a/planetstack/observer/__init__.py b/planetstack/observer/__init__.py
index e2a93de..0d6c550 100644
--- a/planetstack/observer/__init__.py
+++ b/planetstack/observer/__init__.py
@@ -10,14 +10,14 @@
 if (not observer_disabled):
     from .event_manager import EventSender
 
-    def notify_observer(model=None, delete=False, pk=None):
+    def notify_observer(model=None, delete=False, pk=None, model_dict={}):
         try:
             if (model and delete):
                 if hasattr(model,"__name__"):
                     modelName = model.__name__
                 else:
                     modelName = model.__class__.__name__
-                EventSender().fire(delete_flag = delete, model = modelName, pk = pk)
+                EventSender().fire(delete_flag = delete, model = modelName, pk = pk, model_dict=model_dict)
             else:
                 EventSender().fire()
         except Exception,e:
diff --git a/planetstack/observer/deleter.py b/planetstack/observer/deleter.py
index 9a62ccd..e088558 100644
--- a/planetstack/observer/deleter.py
+++ b/planetstack/observer/deleter.py
@@ -5,9 +5,12 @@
 class Deleter:
 	model=None # Must be overridden
 
-	def call(self,pk):
+        def __init__(self, *args, **kwargs):
+                pass
+
+	def call(self, pk, model_dict):
 		# Fetch object from PlanetStack db and delete it
 		pass
 
-	def __call__(self):
-		return self.call()
+	def __call__(self, *args, **kwargs):
+		return self.call(*args, **kwargs)
diff --git a/planetstack/observer/event_manager.py b/planetstack/observer/event_manager.py
index 8ec3fc2..112564a 100644
--- a/planetstack/observer/event_manager.py
+++ b/planetstack/observer/event_manager.py
@@ -2,13 +2,16 @@
 import requests, json
 
 from planetstack.config import Config
-from observer.deleters import deleters
+from observer.deleter import Deleter
 
 import uuid
 import os
+import imp
+import inspect
 import base64
 from fofum import Fofum
 import json
+import traceback
 
 # decorator that marks dispatachable event methods	  
 def event(func):
@@ -52,29 +55,61 @@
 
 	def fire(self,**kwargs):
                 kwargs["uuid"] = str(uuid.uuid1())
-                print "YYY fire", kwargs
 		self.fofum.fire(json.dumps(kwargs))
 
 class EventListener:
 	def __init__(self,wake_up=None):
 		self.handler = EventHandler()
 		self.wake_up = wake_up
+                self.deleters = {}
+                self.load_deleter_modules()
+
+        def load_deleter_modules(self, deleter_dir=None):
+            if deleter_dir is None:
+                if hasattr(Config(), "observer_deleters_dir"):
+                    deleter_dir = Config().observer_deleters_dir
+                else:
+                    deleter_dir = "/opt/planetstack/observer/deleters"
+
+            for fn in os.listdir(deleter_dir):
+                pathname = os.path.join(deleter_dir,fn)
+                if os.path.isfile(pathname) and fn.endswith(".py") and (fn!="__init__.py"):
+                    module = imp.load_source(fn[:-3],pathname)
+                    for classname in dir(module):
+                        c = getattr(module, classname, None)
+
+                        # make sure 'c' is a descendent of Deleter and has a
+                        # provides field (this eliminates the abstract base classes
+                        # since they don't have a provides)
+
+                        if inspect.isclass(c) and issubclass(c, Deleter) and hasattr(c,"model") and c.model!=None:
+                            modelName = c.model
+                            if not modelName in self.deleters:
+                                self.deleters[modelName] = []
+                            if not (c in self.deleters[modelName]):
+                                self.deleters[modelName].append(c)
+            print 'loaded deleters: %s' % ",".join(self.deleters.keys())
+
 
 	def handle_event(self, payload):
 		payload_dict = json.loads(payload)
 
 		try:
 			deletion = payload_dict.get('delete_flag', False)
-                        print "XXX", payload_dict, deletion
 			if (deletion):
 				model = payload_dict['model']
 				pk = payload_dict['pk']
+                                model_dict = payload_dict['model_dict']
 
-                                print "XXX", model, pk, deleters
+				for deleter in self.deleters[model]:
+                                        try:
+   					    deleter()(pk, model_dict)
+                                        except:
+                                            # something is silently eating these
+                                            # exceptions...
+                                            traceback.print_exc()
+                                            raise
 
-				for deleter in deleters[model]:
-                                        print "ZZZ executing deleter"
-					deleter(pk)
 		except:
 			deletion = False
 
