diff --git a/planetstack/openstack/sliveragent.py b/planetstack/openstack/sliveragent.py
new file mode 100644
index 0000000..b2f29cf
--- /dev/null
+++ b/planetstack/openstack/sliveragent.py
@@ -0,0 +1,39 @@
+import os
+import sys
+#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
+import time
+from core.models.sliver import Sliver
+from openstack.manager import OpenStackManager
+
+class SliverAgent:
+
+    def run(self):
+        manager = OpenStackManager()
+        # exit if openstack is disable or unavailable
+        if not manager.enabled or not manager.has_openstack:
+            sys.exit()
+
+        while True :
+            # fill in null ip addresses 
+            slivers = Sliver.objects.filter(ip=None)
+            for sliver in slivers:
+                # update connection
+                manager.client.connect(username=manager.client.keystone.username,
+                               password=manager.client.keystone.password,
+                               tenant=sliver.slice.name)  
+                sliver.os_manager = manager
+                servers = 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()
+            time.sleep(7)
+                
+                                        
+if __name__ == '__main__':
+    SliverAgent().run()
+                 
