diff --git a/xos/tools/cleanup_unique.py b/xos/tools/cleanup_unique.py
index 0ee0c7a..07a2d4e 100644
--- a/xos/tools/cleanup_unique.py
+++ b/xos/tools/cleanup_unique.py
@@ -8,38 +8,80 @@
 from cord.models import *
 django.setup()
 
+for obj in ControllerNetwork.deleted_objects.all():
+    print "Purging deleted object", obj
+    obj.delete(purge=True)
 
+for obj in ControllerSite.deleted_objects.all():
+    print "Purging deleted object", obj
+    obj.delete(purge=True)
+
+for obj in NetworkSlice.deleted_objects.all():
+    print "Purging deleted object", obj
+    obj.delete(purge=True)
+
+for obj in NetworkSliver.deleted_objects.all():
+    print "Purging deleted object", obj
+    obj.delete(purge=True)
+
+for obj in DeploymentPrivilege.deleted_objects.all():
+    print "Purging deleted object", obj
+    obj.delete(purge=True)
+
+for obj in SiteDeployment.deleted_objects.all():
+    print "Purging deleted object", obj
+    obj.delete(purge=True)
+
+seen=[]
 for obj in ControllerNetwork.objects.all():
+     seen.append(obj.id)
      conflicts = ControllerNetwork.objects.filter(network=obj.network, controller=obj.controller)
      for conflict in conflicts:
-         if conflict.id != obj.id:
-             print "Purging", conflict
+         if conflict.id not in seen:
+             print "Purging", conflict, conflict.id, "due to duplicate of", obj.id
              conflict.delete(purge=True)
 
+seen=[]
 for obj in NetworkSlice.objects.all():
+     seen.append(obj.id)
      conflicts = NetworkSlice.objects.filter(network=obj.network, slice=obj.slice)
      for conflict in conflicts:
-         if conflict.id != obj.id:
-             print "Purging", conflict        
+         if conflict.id not in seen:
+             print "Purging", conflict, conflict.id, "due to duplicate of", obj.id
              conflict.delete(purge=True)
 
+seen=[]
 for obj in NetworkSliver.objects.all():
+     seen.append(obj.id)
      conflicts = NetworkSliver.objects.filter(network=obj.network, sliver=obj.sliver)
      for conflict in conflicts:
-         if conflict.id != obj.id:
-             print "Purging", conflict 
+         if conflict.id not in seen:
+             print "Purging", conflict, conflict.id, "due to duplicate of", obj.id
              conflict.delete(purge=True)
 
+seen=[]
 for obj in DeploymentPrivilege.objects.all():
+     seen.append(obj.id)
      conflicts = DeploymentPrivilege.objects.filter(user=obj.user, deployment=obj.deployment, role=obj.role)
      for conflict in conflicts:
-         if conflict.id != obj.id:
-             print "Purging", conflict 
+         if conflict.id not in seen:
+             print "Purging", conflict, conflict.id, "due to duplicate of", obj.id
              conflict.delete(purge=True)
 
+seen=[]
 for obj in SiteDeployment.objects.all():
+     seen.append(obj.id)
      conflicts = SiteDeployment.objects.filter(site=obj.site, deployment=obj.deployment, controller=obj.controller)
      for conflict in conflicts:
-         if conflict.id != obj.id:
-             print "Purging", conflict 
+         if conflict.id not in seen:
+             print "Purging", conflict, conflict.id, "due to duplicate of", obj.id
+             conflict.delete(purge=True)
+
+seen=[]
+for obj in ControllerSite.objects.all():
+     seen.append(obj.id)
+     conflicts = ControllerSite.objects.filter(site=obj.site, controller=obj.controller)
+     for conflict in conflicts:
+         if conflict.id not in seen:
+             print "Purging", conflict, conflict.id, "due to duplicate of", obj.id
              conflict.delete(purge=True)
