diff --git a/planetstack/openstack/backend.py b/planetstack/openstack/backend.py
new file mode 100644
index 0000000..340b29b
--- /dev/null
+++ b/planetstack/openstack/backend.py
@@ -0,0 +1,18 @@
+import threading
+from openstack.sliveragent import SliverAgent
+from openstack.observer import OpenStackObserver
+from openstack.event_listener import EventListener
+
+class Backend:
+    
+    def run(self):
+        # start the openstack observer
+        observer = OpenStackObserver()
+        observer_thread = threading.Thread(target=observer.run)
+        observer_thread.start()
+
+        # start event listene
+        event_listener = EventListener()
+        event_listener_thread = threading.Thread(target=event_listener.run)
+        event_listener_thread.start()
+                
diff --git a/planetstack/openstack/client.py b/planetstack/openstack/client.py
index 4563e46..1a6386d 100644
--- a/planetstack/openstack/client.py
+++ b/planetstack/openstack/client.py
@@ -5,6 +5,9 @@
     from quantumclient.v2_0 import client as quantum_client
     from nova.db.sqlalchemy import api as nova_db_api 
     from nova.context import get_admin_context
+    from keystone.common.sql import core  
+    core.CONF(args=[], project='keystone', default_config_files=['/etc/keystone/keystone.conf'])
+    from keystone.identity.backends.sql import Metadata
     has_openstack = True
 except:
     has_openstack = False
@@ -59,6 +62,17 @@
         if '@' in self.username:
             self.username = self.username[:self.username.index('@')]
 
+class KeystoneDB:
+    @require_enabled
+    def get_session(self):
+        return core.Base().get_session()
+
+    @require_enabled
+    def get_metadata(self):
+        session = self.get_session()
+        return session.query(Metadata).all()     
+
+
 class KeystoneClient(Client):
     def __init__(self, *args, **kwds):
         Client.__init__(self, *args, **kwds)
@@ -154,6 +168,7 @@
     def __init__ ( self, *args, **kwds) :
         # instantiate managers
         self.keystone = KeystoneClient(*args, **kwds)
+        self.keystone_db = KeystoneDB()
         self.glance = GlanceClient(*args, **kwds)
         self.nova = NovaClient(*args, **kwds)
         self.nova_db = NovaDB(*args, **kwds)
diff --git a/planetstack/openstack/event_listener.py b/planetstack/openstack/event_listener.py
new file mode 100644
index 0000000..d3f0abf
--- /dev/null
+++ b/planetstack/openstack/event_listener.py
@@ -0,0 +1,114 @@
+import threading
+import requests, json
+from core.models import *
+from openstack.manager import OpenStackManager
+
+# decorator that marks dispatachable event methods  
+def event(func):
+    setattr(func, 'event', func.__name__)
+    return func      
+
+class EventHandler:
+
+    def __init__(self):
+        self.manager = OpenStackManager()
+
+    def get_events(self):
+        events = []
+        for attrib in dir(self):
+            if hasattr(attrib, 'event'):
+                events.append(getattr(attrib, 'event'))
+        return events
+
+    def dispatch(self, event, *args, **kwds):
+        if hasattr(self, event):
+            return getattr(self, event)(*args, **kwds)
+            
+        
+    @event
+    def save_site(self, id):
+        sites = Site.objects.filter(id=id)
+        if sites:
+            self.manager.save_site(sites[0])
+    
+    @event
+    def delete_site(self, tenant_id):
+        self.manager.driver.delete_tenant(tenant_id)
+
+    @event
+    def save_site_privilege(self, id):
+        site_privileges = SitePrivilege.objects.filter(id=id)
+        if site_privileges:
+            site_priv = self.manager.save_site_privilege(site_privileges[0])
+
+    @event
+    def delete_site_privilege(self, kuser_id, tenant_id, role_type):
+        self.manager.driver.delete_user_role(kuser_id, tenant_id, role_type)
+
+    @event
+    def save_slice(self, id):
+        slices = Slice.objects.filter(id=id)
+        if slices:
+            self.manager.save_slice(slices[0])
+    
+    @event
+    def delete_slice(self, tenant_id, network_id, router_id, subnet_id):
+        self.manager._delete_slice(tenant_id, network_id, router_id, subnet_id)
+
+    @event
+    def save_user(self, id):
+        users = User.objects.filter(id=id)
+        if users:
+            self.manager.save_user(users[0])
+        
+    @event
+    def delete_user(self, kuser_id):
+        self.manager.driver.delete_user(kuser_id)
+    
+    @event
+    def save_sliver(self, id):
+        slivers = Sliver.objects.filter(id=id)
+        if slivers:
+            self.manager.save_sliver(slivers[0])
+
+    @event
+    def delete_sliver(self, instance_id):
+        self.manager.destroy_instance(instance_id)                            
+
+    
+
+class EventListener:
+
+    def __init__(self):
+        self.handler = EventHandler()
+
+    def listen_for_event(self, event, hash):
+        url = 'http://www.feefie.com/command'
+        params = {'action': 'subscribe',
+                  'hash': hash,
+                  'htm': 1}
+        while True:
+            r = requests.get(url, params=params)
+            r_data = json.loads(r)
+            payload = r_data.get('payload')
+            self.handler.dispatch(event, **payload)
+
+
+    def run(self):
+        # register events
+        event_names = [{'title': name} for name in self.handler.get_events()]
+        url = 'http://www.feefie.com/command'
+        params = {'action': 'add',
+                  'u': 'pl',
+                  'events': event_names}
+        r = requests.get(url, params=params)
+        print dir(r)
+        print r
+        r_data = json.loads(r)
+        events = r_data.get('events', [])
+        # spanw a  thread for each event
+        for event in events:
+            args = (event['title'], event['hash'])
+            listener_thread = threading.Thread(target=self.listen_for_event, args=args)
+            listener_tread.start()
+                                    
diff --git a/planetstack/openstack/manager.py b/planetstack/openstack/manager.py
index a5d3f4a..8016888 100644
--- a/planetstack/openstack/manager.py
+++ b/planetstack/openstack/manager.py
@@ -3,6 +3,7 @@
 import string
 import random
 import hashlib
+from datetime import datetime
 
 from netaddr import IPAddress, IPNetwork
 from planetstack import settings
@@ -118,6 +119,10 @@
             self.init_caller(user, user.site.login_base)
             self.save_key(user.public_key, user.keyname)
             self.init_admin()
+
+        user.save()
+        user.enacted = datetime.now()
+        user.save(update_fields=['enacted'])
   
     @require_enabled
     def delete_user(self, user):
@@ -140,12 +145,34 @@
                                       description=site.name,
                                       enabled=site.enabled)
 
+        # commit the updated record
+        site.save()
+        site.enacted = datetime.now()
+        site.save(update_fields=['enacted']) # enusre enacted > updated  
+        
+
     @require_enabled
     def delete_site(self, site):
         if site.tenant_id:
             self.driver.delete_tenant(site.tenant_id)
                
     @require_enabled
+    def save_site_privilege(self, site_priv):
+        if site_priv.user.kuser_id and site_priv.site.tenant_id:
+            self.driver.add_user_role(site_priv.user.kuser_id,
+                                      site_priv.site.tenant_id,
+                                      site_priv.role.role_type)
+        site_priv.enacted = datetime.now()
+        site_priv.save(update_fields=['enacted'])
+
+    
+    @require_enabled
+    def delete_site_privilege(self, site_priv):
+        self.driver.delete_user_role(site_priv.user.kuser_id, 
+                                     site_priv.site.tenant_id, 
+                                     site_priv.role.role_type)
+
+    @require_enabled
     def save_slice(self, slice):
         if not slice.tenant_id:
             nova_fields = {'tenant_name': slice.name,
@@ -186,30 +213,55 @@
             # add subnet as interface to slice's router
             self.driver.add_router_interface(router['id'], subnet['id'])
             # add external route
-            self.driver.add_external_route(subnet)               
- 
+            self.driver.add_external_route(subnet)
+
 
         if slice.id and slice.tenant_id:
             self.driver.update_tenant(slice.tenant_id,
                                       description=slice.description,
-                                      enabled=slice.enabled)    
+                                      enabled=slice.enabled)   
+
+        slice.save()
+        slice.enacted = datetime.now()
+        slice.save(update_fields=['enacted']) 
 
     @require_enabled
     def delete_slice(self, slice):
         if slice.tenant_id:
-            self.driver.delete_router_interface(slice.router_id, slice.subnet_id)
-            self.driver.delete_subnet(slice.subnet_id)
-            self.driver.delete_router(slice.router_id)
-            self.driver.delete_network(slice.network_id)
-            self.driver.delete_tenant(slice.tenant_id)
-            # delete external route
-            subnet = None 
-            subnets = self.driver.shell.quantum.list_subnets()['subnets']
-            for snet in subnets:
-                if snet['id'] == slice.subnet_id:
-                    subnet = snet
-            if subnet:
-                self.driver.delete_external_route(subnet)
+            self._delete_slice(slice.tenant_id, slice.network_id, 
+                               slice.router_id, slice.subnet_id)
+    @require_enabled
+    def _delete_slice(self, tenant_id, network_id, router_id, subnet_id):
+        self.driver.delete_router_interface(slice.router_id, slice.subnet_id)
+        self.driver.delete_subnet(slice.subnet_id)
+        self.driver.delete_router(slice.router_id)
+        self.driver.delete_network(slice.network_id)
+        self.driver.delete_tenant(slice.tenant_id)
+        # delete external route
+        subnet = None
+        subnets = self.driver.shell.quantum.list_subnets()['subnets']
+        for snet in subnets:
+            if snet['id'] == slice.subnet_id:
+                subnet = snet
+        if subnet:
+            self.driver.delete_external_route(subnet) 
+
+    
+    @require_enabled
+    def save_slice_membership(self, slice_memb):
+        if slice_memb.user.kuser_id and slice_memb.slice.tenant_id:
+            self.driver.add_user_role(slice_memb.user.kuser_id,
+                                      slice_memb.slice.tenant_id,
+                                      slice_memb.role.role_type)
+        slice_memb.enacted = datetime.now()
+        slice_memb.save(update_fields=['enacted'])
+
+
+    @require_enabled
+    def delete_slice_membership(self, slice_memb):
+        self.driver.delete_user_role(slice_memb.user.kuser_id,
+                                     slice_memb.slice.tenant_id,
+                                     slice_memb.role.role_type)
 
 
     @require_enabled
@@ -266,6 +318,10 @@
         if sliver.instance_id and ("numberCores" in sliver.changed_fields):
             self.driver.update_instance_metadata(sliver.instance_id, {"cpu_cores": str(sliver.numberCores)})
 
+        sliver.save()
+        sliver.enacted = datetime.now()
+        sliver.save(update_fields=['enacted'])
+
     @require_enabled
     def delete_sliver(self, sliver):
         if sliver.instance_id:
diff --git a/planetstack/openstack/observer.py b/planetstack/openstack/observer.py
index 872cf58..c14b2cb 100644
--- a/planetstack/openstack/observer.py
+++ b/planetstack/openstack/observer.py
@@ -1,11 +1,15 @@
 import time
 import traceback
 from datetime import datetime
+from collections import defaultdict
 from core.models import *
 from django.db.models import F, Q
 from openstack.manager import OpenStackManager
+from util.logger import Logger, logging
 
 
+logger = Logger(logfile='observer.log', level=logging.INFO)
+
 class OpenStackObserver:
     
     def __init__(self):
@@ -19,8 +23,9 @@
                 #self.sync_roles()
                 self.sync_tenants()
                 self.sync_users()
-                #self.sync_user_tenant_roles()
+                self.sync_user_tenant_roles()
                 self.sync_slivers()
+                self.sync_sliver_ips()
                 time.sleep(7)
             except:
                 traceback.print_exc() 
@@ -37,16 +42,25 @@
         pending_role_names = [r.role_type for r in pending_roles] 
         for role in pending_roles:
             if role.role_type not in keystone_role_names:
-                self.manager.save_role(role)
+                try:
+                    self.manager.save_role(role)
+                    logger.info("save role: %s" % (role))
+                except:
+                    logger.log_exc("save role failed: %s" % role)  
+                    traceback.print_exc()
 
-
-        # delete keystone roles that don't exist in planetstack 
+        # don't delete roles for now 
+        """ 
+        # delete keystone roles that don't exist in planetstack
         for keystone_role in keystone_roles:
             if keystone_role.name == 'admin':
                 continue
             if keystone_role.name not in pending_role_names:
-                pass
-                #self.manager.driver.delete_role({id: keystone_role.id})
+                try:
+                    self.manager.driver.delete_role({id: keystone_role.id})
+                except:
+                    traceback.print_exc()
+        """
 
     def sync_tenants(self):
         """
@@ -57,19 +71,21 @@
         # get all sites that need to be synced (enacted < updated or enacted is None)
         pending_sites = Site.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
         for site in pending_sites:
-            self.manager.save_site(site)
-            site.save()
-            site.enacted = datetime.now()
-            site.save(update_fields=['enacted'])
+            try:
+                self.manager.save_site(site)
+                logger.info("saved site %s" % site)
+            except:
+                logger.log_exc("save site failed: %s" % site)
 
         # get all slices that need to be synced (enacted < updated or enacted is None)
         pending_slices = Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
         for slice in pending_slices:
-            self.manager.init_caller(slice.creator, slice.creator.site.login_base)
-            self.manager.save_slice(slice)
-            slice.save()
-            slice.enacted = datetime.now()
-            slice.save(update_fields=['enacted'])
+            try:
+                self.manager.init_caller(slice.creator, slice.creator.site.login_base)
+                self.manager.save_slice(slice)
+                logger.info("saved slice %s" % slice)
+            except:
+                logger.log_exc("save slice failed: %s" % slice)
 
         # get all sites that where enacted != null. We can assume these sites
         # have previously been synced and need to be checed for deletion.
@@ -87,13 +103,16 @@
 
         # delete keystone tenants that don't have a site record
         tenants = self.manager.driver.shell.keystone.tenants.findall()
+        system_tenants = ['admin','service']
         for tenant in tenants:
             if tenant.name == 'admin': 
                 continue
             if tenant.name not in site_dict and tenant.name not in slice_dict:
-                #print "delete " + tenant.name
-                pass
-                #self.manager.driver.delete_tenant(tenant.id)
+                try:
+                    self.manager.driver.delete_tenant(tenant.id)
+                    logger.info("deleted tenant: %s" % (tenant))
+                except:
+                    logger.log_exc("delete tenant failed: %s" % tenant)
 
 
     def sync_users(self):
@@ -104,10 +123,11 @@
         # get all users that need to be synced (enacted < updated or enacted is None)
         pending_users = User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
         for user in pending_users:
-            self.manager.save_user(user)
-            user.save()
-            user.enacted = datetime.now()
-            user.save(update_fields=['enacted'])
+            try:
+                self.manager.save_user(user)
+                logger.info("saved user: %s" % (user))
+            except:
+                logger.log_exc("save user failed: %s" %user)
 
         # get all users that where enacted != null. We can assume these users
         # have previously been synced and need to be checed for deletion.
@@ -117,15 +137,87 @@
             user_dict[user.kuser_id] = user
 
         # delete keystone users that don't have a user record
+        system_users = ['admin', 'nova', 'quantum', 'glance', 'cinder', 'swift', 'service']
         users = self.manager.driver.shell.keystone.users.findall()
         for user in users:
-            if user.name == 'admin':
+            if user.name in system_users:
                 continue
             if user.id not in user_dict:
-                pass
-                #self.manager.driver.delete_user(user.id)
-        
-        
+                try:
+                    #self.manager.driver.delete_user(user.id)
+                    logger.info("deleted user: %s" % user)
+                except:
+                    logger.log_exc("delete user failed: %s" % user)
+                    
+
+    def sync_user_tenant_roles(self):
+        """
+        Save all site privileges and slice memberships wheree enacted < updated or 
+        enacted == None. Remove ones that don't exist in openstack db if they have 
+        an enacted time (enacted != None).
+        """
+        # sync site privileges
+        pending_site_privileges = SitePrivilege.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+        for site_priv in pending_site_privileges:
+            try:
+                self.manager.save_site_privilege(site_priv)  
+                logger.info("saved site privilege: %s" % (site_priv))
+            except: logger.log_exc("save site privilege failed: %s " % site_priv)
+
+        # sync slice memberships
+        pending_slice_memberships = SliceMembership.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+        for slice_memb in pending_slice_memberships:
+            try:
+                self.manager.save_slice_membership(slice_memb)
+                logger.info("saved slice membership: %s" % (slice_memb))
+            except: logger.log_exc("save slice membership failed: %s" % slice_memb)
+
+        # get all site privileges and slice memberships that have been enacted 
+        user_tenant_roles = defaultdict(list)
+        for site_priv in SitePrivilege.objects.filter(enacted__isnull=False):
+            user_tenant_roles[(site_priv.user.kuser_id, site_priv.site.tenant_id)].append(site_priv.role.role)
+        for slice_memb in SliceMembership.objects.filter(enacted__isnull=False):
+            user_tenant_roles[(slice_memb.user.kuser_id, slice_memb.slice.tenant_id)].append(slice_memb.role.role)  
+ 
+        # Some user tenant role aren't stored in planetstack but they must be preserved. 
+        # Role that fall in this category are
+        # 1. Never remove a user's role that their home site
+        # 2. Never remove a user's role at a slice they've created.
+        # Keep track of all roles that must be preserved.     
+        users = User.objects.all()
+        preserved_roles = {}
+        for user in users:
+            tenant_ids = [s['tenant_id'] for s in user.slices.values()]
+            tenant_ids.append(user.site.tenant_id) 
+            preserved_roles[user.kuser_id] = tenant_ids
+
+ 
+        # begin removing user tenant roles from keystone. This is stored in the 
+        # Metadata table.
+        for metadata in self.manager.driver.shell.keystone_db.get_metadata():
+            # skip admin roles
+            if metadata.user_id == self.manager.driver.admin_user.id:
+                continue
+            # skip preserved tenant ids
+            if metadata.user_id in preserved_roles and \
+               metadata.tenant_id in preserved_roles[metadata.user_id]: 
+                continue           
+            # get roles for user at this tenant
+            user_tenant_role_ids = user_tenant_roles.get((metadata.user_id, metadata.tenant_id), [])
+
+            if user_tenant_role_ids:
+                # The user has roles at the tenant. Check if roles need to 
+                # be updated.
+                user_keystone_role_ids = metadata.data.get('roles', [])
+                for role_id in user_keystone_role_ids:
+                    if role_id not in user_tenant_role_ids: 
+                        user_keystone_role_ids.pop(user_keystone_role_ids.index(role_id))
+            else:
+                # The user has no roles at this tenant. 
+                metadata.data['roles'] = [] 
+            #session.add(metadata)
+            logger.info("pruning metadata for %s at %s" % (metadata.user_id, metadata.tenant_id))
+ 
     def sync_slivers(self):
         """
         save all slivers where enacted < updated or enacted == None. Remove slivers that
@@ -134,13 +226,14 @@
         # get all users that need to be synced (enacted < updated or enacted is None)
         pending_slivers = Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
         for sliver in pending_slivers:
-            if not sliver.instance_id and sliver.creator:  
-                # update manager context
-                self.manager.init_caller(sliver.creator, sliver.slice.name)
-                self.manager.save_sliver(sliver)
-                sliver.save()
-                sliver.enacted = datetime.now()
-                sliver.save(update_fields=['enacted'])
+            if not sliver.instance_id and sliver.creator: 
+                try: 
+                    # update manager context
+                    self.manager.init_caller(sliver.creator, sliver.slice.name)
+                    self.manager.save_sliver(sliver)
+                    logger.info("saved sliver: %s %s" % (sliver))
+                except:
+                    logger.log_exc("save sliver failed: %s" % sliver) 
 
         # get all slivers that where enacted != null. We can assume these users
         # have previously been synced and need to be checed for deletion.
@@ -154,8 +247,29 @@
         instances = self.manager.driver.shell.nova_db.instance_get_all(ctx)
         for instance in instances:
             if instance.id not in sliver_dict:
-                # lookup tenant and update context  
-                #tenant = self.manager.driver.shell.keystone.tenants.findall(id=instance.tenant_id) 
-                #self.manager.init_admin(tenant=tenant.name)  
-                #self.manager.driver.destroy_instance(instance.id)
-                pass
+                try:
+                    # lookup tenant and update context  
+                    tenant = self.manager.driver.shell.keystone.tenants.find(id=instance.project_id) 
+                    self.manager.init_admin(tenant=tenant.name)  
+                    self.manager.driver.destroy_instance(instance.id)
+                    logger.info("destroyed sliver: %s" % (instance))
+                except:
+                    logger.log_exc("destroy sliver failed: %s" % instance) 
+                
+
+    def sync_sliver_ips(self):
+        # fill in null ip addresses
+        slivers = Sliver.objects.filter(ip=None)
+        for sliver in slivers:
+            # update connection
+            self.manager.init_admin(tenant=sliver.slice.name)
+            servers = self.manager.client.nova.servers.findall(id=sliver.instance_id)
+            if not servers:
+                continue
+            server = servers[0]
+            ips = server.addresses.get(sliver.slice.name, [])
+            if not ips:
+                continue
+            sliver.ip = ips[0]['addr']
+            sliver.save()
+            logger.info("saved sliver ip: %s %s" % (sliver, ips[0]))
