diff --git a/planetstack/core/models/plcorebase.py b/planetstack/core/models/plcorebase.py
index 08e4047..921b89b 100644
--- a/planetstack/core/models/plcorebase.py
+++ b/planetstack/core/models/plcorebase.py
@@ -6,53 +6,58 @@
 
 class PlCoreBase(models.Model):
 
-    created = models.DateTimeField(auto_now_add=True)
-    updated = models.DateTimeField(auto_now=True)
-    enacted = models.DateTimeField(null=True, default=None)
+	created = models.DateTimeField(auto_now_add=True)
+	updated = models.DateTimeField(auto_now=True)
+	enacted = models.DateTimeField(null=True, default=None)
 
-    class Meta:
-        abstract = True
-        app_label = "core"
+	class Meta:
+		abstract = True
+		app_label = "core"
 
-    def __init__(self, *args, **kwargs):
-        super(PlCoreBase, self).__init__(*args, **kwargs)
-        self.__initial = self._dict
+	def __init__(self, *args, **kwargs):
+		super(PlCoreBase, self).__init__(*args, **kwargs)
+		self.__initial = self._dict
 
-    @property
-    def diff(self):
-        d1 = self.__initial
-        d2 = self._dict
-        diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]]
-        return dict(diffs)
+	@property
+	def diff(self):
+		d1 = self.__initial
+		d2 = self._dict
+		diffs = [(k, (v, d2[k])) for k, v in d1.items() if v != d2[k]]
+		return dict(diffs)
 
-    @property
-    def has_changed(self):
-        return bool(self.diff)
+	@property
+	def has_changed(self):
+		return bool(self.diff)
 
-    @property
-    def changed_fields(self):
-        return self.diff.keys()
+	@property
+	def changed_fields(self):
+		return self.diff.keys()
 
-    def get_field_diff(self, field_name):
-        return self.diff.get(field_name, None)
+	def get_field_diff(self, field_name):
+		return self.diff.get(field_name, None)
 
-    def delete(self, *args, **kwds):
-        super(PlCoreBase, self).delete(*args, **kwds)
+	def delete(self, *args, **kwds):
+		super(PlCoreBase, self).delete(*args, **kwds)
 
-        EventSender().fire({'delete_flag':True,'model':self.__name__})
+		try:
+			EventSender().fire({'delete_flag':True,'model':self.__name__})
+		except:
+			# Investigate later. 
+			pass
 
-    def save(self, *args, **kwargs):
-        super(PlCoreBase, self).save(*args, **kwargs)
-        
-        # Tell the observer that the source database has been updated
-        EventSender().fire()
 
-        self.__initial = self._dict
+	def save(self, *args, **kwargs):
+		super(PlCoreBase, self).save(*args, **kwargs)
+		
+		# Tell the observer that the source database has been updated
+		EventSender().fire()
 
-    @property
-    def _dict(self):
-        return model_to_dict(self, fields=[field.name for field in
-                             self._meta.fields])
+		self.__initial = self._dict
+
+	@property
+	def _dict(self):
+		return model_to_dict(self, fields=[field.name for field in
+							 self._meta.fields])
 
 
 
