implement fetch_pending()
diff --git a/planetstack/observer/event_loop.py b/planetstack/observer/event_loop.py
index 5ce4b54..f4f7f02 100644
--- a/planetstack/observer/event_loop.py
+++ b/planetstack/observer/event_loop.py
@@ -58,7 +58,7 @@
     return order
 
 class PlanetStackObserver:
-    sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivileges,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps]
+    sync_steps = [SyncNetworks,SyncNetworkSlivers,SyncSites,SyncSitePrivileges,SyncSlices,SyncSliceMemberships,SyncSlivers,SyncSliverIps,SyncExternalRoutes,SyncUsers,GarbageCollector]
 
     def __init__(self):
         # The Condition object that gets signalled by Feefie events
diff --git a/planetstack/observer/steps/__init__.py b/planetstack/observer/steps/__init__.py
index 6d7adb8..7f5dcf9 100644
--- a/planetstack/observer/steps/__init__.py
+++ b/planetstack/observer/steps/__init__.py
@@ -8,3 +8,4 @@
 from .sync_sliver_ips import SyncSliverIps
 from .sync_slivers import SyncSlivers
 from .sync_users import SyncUsers
+from .garbage_collector import GarbageCollector
diff --git a/planetstack/observer/steps/garbage_collector.py b/planetstack/observer/steps/garbage_collector.py
index 4b6dfaf..9e2a37d 100644
--- a/planetstack/observer/steps/garbage_collector.py
+++ b/planetstack/observer/steps/garbage_collector.py
@@ -1,15 +1,13 @@
 import os
 import base64
 from planetstack.config import Config
+from observer.openstacksyncstep import OpenStackSyncStep
 
-class GarbageCollector(SyncStep):
-	requested_interval = 86400
-	provides=[]
+class GarbageCollector(OpenStackSyncStep):
+    requested_interval = 86400
+    provides=[]
 
-	def call(self):
-		pass
-
-    def run(self):
+    def call(self):
         try:
             logger.info('gc start')
             #self.sync_roles()
diff --git a/planetstack/observer/steps/sync_external_routes.py b/planetstack/observer/steps/sync_external_routes.py
index cbaf490..7a67896 100644
--- a/planetstack/observer/steps/sync_external_routes.py
+++ b/planetstack/observer/steps/sync_external_routes.py
@@ -1,20 +1,21 @@
 import os
 import base64
 from planetstack.config import Config
-from observer.syncstep import SyncStep
+from observer.openstacksyncstep import OpenStackSyncStep
 
-class SyncExternalRoutes(SyncStep):
-	# XXX what does this provide?
-	requested_interval = 86400 # This step is slow like a pig. Let's run it infrequently
+class SyncExternalRoutes(OpenStackSyncStep):
+    # XXX what does this provide?
+    provides=[]
+    requested_interval = 86400 # This step is slow like a pig. Let's run it infrequently
 
-	def __init__(self):
-		pass
+    def __init__(self):
+        pass
 
-	def call(self):
-		routes = self.driver.get_external_routes()
-		subnets = self.driver.shell.quantum.list_subnets()['subnets']
-		for subnet in subnets:
-			try:
-				self.driver.add_external_route(subnet, routes)
-			except:
-				logger.log_exc("failed to add external route for subnet %s" % subnet)
+    def call(self):
+        routes = self.driver.get_external_routes()
+        subnets = self.driver.shell.quantum.list_subnets()['subnets']
+        for subnet in subnets:
+            try:
+                self.driver.add_external_route(subnet, routes)
+            except:
+                logger.log_exc("failed to add external route for subnet %s" % subnet)
diff --git a/planetstack/observer/steps/sync_networks.py b/planetstack/observer/steps/sync_networks.py
index 656ae68..02a1b23 100644
--- a/planetstack/observer/steps/sync_networks.py
+++ b/planetstack/observer/steps/sync_networks.py
@@ -8,6 +8,9 @@
     provides=[Network]
     requested_interval = 0
 
+    def fetch_pending(self):
+        return Network.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
     def save_network(self, network):
         if not network.network_id:
             if network.template.sharedNetworkName:
@@ -45,14 +48,14 @@
 
     def sync_record(self, site):
         if network.owner and network.owner.creator:
-                try:
-                    # update manager context
-                    real_driver = self.driver
-                    self.driver = self.driver.client_driver(network.owner.creator, network.owner.name)
-                    self.save_network(network)
-                    self.driver = real_driver
-                    logger.info("saved network: %s" % (network))
-                except Exception,e:
-                    logger.log_exc("save network failed: %s" % network)    
-                    raise e
+            try:
+                # update manager context
+                real_driver = self.driver
+                self.driver = self.driver.client_driver(network.owner.creator, network.owner.name)
+                self.save_network(network)
+                self.driver = real_driver
+                logger.info("saved network: %s" % (network))
+            except Exception,e:
+                logger.log_exc("save network failed: %s" % network)    
+                raise e
 
diff --git a/planetstack/observer/steps/sync_site_privileges.py b/planetstack/observer/steps/sync_site_privileges.py
index ac0dbac..e02dde7 100644
--- a/planetstack/observer/steps/sync_site_privileges.py
+++ b/planetstack/observer/steps/sync_site_privileges.py
@@ -6,8 +6,11 @@
 
 class SyncSitePrivileges(OpenStackSyncStep):
 	requested_interval=0
-
 	provides=[SitePrivilege]
+
+    def fetch_pending(self):
+        return Network.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
 	def sync_record(self, user):
 		if site_priv.user.kuser_id and site_priv.site.tenant_id:
 			self.driver.add_user_role(site_priv.user.kuser_id,
diff --git a/planetstack/observer/steps/sync_sites.py b/planetstack/observer/steps/sync_sites.py
index 1f7a0f8..ece34af 100644
--- a/planetstack/observer/steps/sync_sites.py
+++ b/planetstack/observer/steps/sync_sites.py
@@ -7,6 +7,10 @@
 class SyncSites(OpenStackSyncStep):
 	provides=[Site]
 	requested_interval=0
+
+    def fetch_pending(self):
+        return Site.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
 	def sync_record(self, site):
 		save_site = False
 		if not site.tenant_id:
diff --git a/planetstack/observer/steps/sync_slice_memberships.py b/planetstack/observer/steps/sync_slice_memberships.py
index 1ec3a96..0e9d681 100644
--- a/planetstack/observer/steps/sync_slice_memberships.py
+++ b/planetstack/observer/steps/sync_slice_memberships.py
@@ -6,7 +6,11 @@
 
 class SyncSliceMemberships(OpenStackSyncStep):
     requested_interval=0
-    provides=[SliceRole]
+    provides=[SlicePrivilege]
+
+    def fetch_pending(self):
+        return SlicePrivilege.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
     def sync_record(self, user):
         if slice_memb.user.kuser_id and slice_memb.slice.tenant_id:
                 self.driver.add_user_role(slice_memb.user.kuser_id,
diff --git a/planetstack/observer/steps/sync_slices.py b/planetstack/observer/steps/sync_slices.py
index 81ed925..4f10a14 100644
--- a/planetstack/observer/steps/sync_slices.py
+++ b/planetstack/observer/steps/sync_slices.py
@@ -7,6 +7,10 @@
 class SyncSlices(OpenStackSyncStep):
 	provides=[Slice]
 	requested_interval=0
+
+    def fetch_pending(self):
+        return Slice.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
 	def sync_record(self, slice):
 		if not slice.tenant_id:
 			nova_fields = {'tenant_name': slice.name,
diff --git a/planetstack/observer/steps/sync_sliver_ips.py b/planetstack/observer/steps/sync_sliver_ips.py
index 50ec6ad..fb4fd5b 100644
--- a/planetstack/observer/steps/sync_sliver_ips.py
+++ b/planetstack/observer/steps/sync_sliver_ips.py
@@ -7,6 +7,7 @@
 class SyncSliverIps(OpenStackSyncStep):
     provides=[Sliver]
     requested_interval=0
+
     def fetch_pending(self):
         slivers = Sliver.objects.filter(ip=None)
         return slivers
diff --git a/planetstack/observer/steps/sync_slivers.py b/planetstack/observer/steps/sync_slivers.py
index adab39d..e119b0e 100644
--- a/planetstack/observer/steps/sync_slivers.py
+++ b/planetstack/observer/steps/sync_slivers.py
@@ -7,21 +7,25 @@
 class SyncSlivers(OpenStackSyncStep):
 	provides=[Sliver]
 	requested_interval=0
+
+    def fetch_pending(self):
+        return Sliver.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
 	def sync_record(self, slice):
 		if not sliver.instance_id:
-				nics = self.get_requested_networks(sliver.slice)
-				file("/tmp/scott-manager","a").write("slice: %s\nreq: %s\n" % (str(sliver.slice.name), str(nics)))
-				slice_memberships = SliceMembership.objects.filter(slice=sliver.slice)
-				pubkeys = [sm.user.public_key for sm in slice_memberships if sm.user.public_key]
-				pubkeys.append(sliver.creator.public_key)
-				instance = self.driver.spawn_instance(name=sliver.name,
-									key_name = sliver.creator.keyname,
-									image_id = sliver.image.image_id,
-									hostname = sliver.node.name,
-									pubkeys = pubkeys,
-									nics = nics )
-				sliver.instance_id = instance.id
-				sliver.instance_name = getattr(instance, 'OS-EXT-SRV-ATTR:instance_name')
+            nics = self.get_requested_networks(sliver.slice)
+            file("/tmp/scott-manager","a").write("slice: %s\nreq: %s\n" % (str(sliver.slice.name), str(nics)))
+            slice_memberships = SliceMembership.objects.filter(slice=sliver.slice)
+            pubkeys = [sm.user.public_key for sm in slice_memberships if sm.user.public_key]
+            pubkeys.append(sliver.creator.public_key)
+            instance = self.driver.spawn_instance(name=sliver.name,
+                                key_name = sliver.creator.keyname,
+                                image_id = sliver.image.image_id,
+                                hostname = sliver.node.name,
+                                pubkeys = pubkeys,
+                                nics = nics )
+            sliver.instance_id = instance.id
+            sliver.instance_name = getattr(instance, 'OS-EXT-SRV-ATTR:instance_name')
 
 		if sliver.instance_id and ("numberCores" in sliver.changed_fields):
 			self.driver.update_instance_metadata(sliver.instance_id, {"cpu_cores": str(sliver.numberCores)})
diff --git a/planetstack/observer/steps/sync_users.py b/planetstack/observer/steps/sync_users.py
index dde8a24..f222b43 100644
--- a/planetstack/observer/steps/sync_users.py
+++ b/planetstack/observer/steps/sync_users.py
@@ -7,6 +7,10 @@
 class SyncUsers(OpenStackSyncStep):
     provides=[User]
     requested_interval=0
+
+    def fetch_pending(self):
+        return User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+
     def sync_record(self, user):
         name = user.email[:user.email.find('@')]
         user_fields = {'name': name,
diff --git a/planetstack/observer/syncstep.py b/planetstack/observer/syncstep.py
index c8d3e42..8e8d4fc 100644
--- a/planetstack/observer/syncstep.py
+++ b/planetstack/observer/syncstep.py
@@ -37,7 +37,8 @@
         return
 
     def fetch_pending(self):
-        return Sliver.objects.filter(ip=None)
+        #return Sliver.objects.filter(ip=None)
+        return []
     
     def check_dependencies(self, obj):
         for dep in self.dependencies:
diff --git a/planetstack/openstack/driver.py b/planetstack/openstack/driver.py
index 234dcbf..febac32 100644
--- a/planetstack/openstack/driver.py
+++ b/planetstack/openstack/driver.py
@@ -3,7 +3,6 @@
 
 try:
     from openstack.client import OpenStackClient
-    from openstack.driver import OpenStackDriver
     has_openstack = True
 except:
     has_openstack = False