diff --git a/plstackapi/openstack/driver.py b/plstackapi/openstack/driver.py
index 8817990..fe93fbc 100644
--- a/plstackapi/openstack/driver.py
+++ b/plstackapi/openstack/driver.py
@@ -96,34 +96,16 @@
             self.shell.quantum.delete_router(router['id'])
 
     def add_router_interface(self, router_id, subnet_id):
-        router = None
-        subnet = None
-        for r in self.shell.quantum.list_routers():
-            if r['id'] == router_id:
-                router = r
-                break
-        for s in self.shell.quantum.list_subnets():
-            if s['id'] == subnet_id:
-                subnet = s
-                break
-
+        router = self.shell.quantum.show_router(router_id)['router']
+        subnet = self.shell.quantum.show_subnet(subnet_id)['subnet']
         if router and subnet:
-            self.shell.quantum.router_add_interface(router, subnet)
+            self.shell.quantum.add_interface_router(router_id, {'subnet_id': subnet_id})
 
     def delete_router_interface(self, router_id, subnet_id):
-        router = None
-        subnet = None
-        for r in self.shell.quantum.list_routers():
-            if r['id'] == router_id:
-                router = r
-                break
-        for s in self.shell.quantum.list_subnets():
-            if s['id'] == subnet_id:
-                subnet = s
-                break
-
+        router = self.shell.quantum.show_router(router_id)
+        subnet = self.shell.quantum.show_subnet(subnet_id)
         if router and subnet:
-            self.shell.quantum.router_remove_interface(router, subnet)            
+            self.shell.quantum.remove_interface_router(router_id, {'subnet_id': subnet_id})
  
     def create_network(self, name):
         nets = self.shell.quantum.list_networks(name=name)['networks']
@@ -142,24 +124,35 @@
                 self.delete_subnet(subnet_id)
             self.shell.quantum.delete_network(net['id'])
     
-    def create_subnet(self, network_name, cidr_ip, ip_version, start, end):
-        nets = self.shell.quantum.list_networks(name=network_name)
-        if not nets:
-            raise Exception, "No such network: %s" % network_name   
-        nets = nets[0]
+    def create_subnet(self, name, network_id, cidr_ip, ip_version, start, end):
+        #nets = self.shell.quantum.list_networks(name=network_name)['networks']
+        #if not nets:
+        #    raise Exception, "No such network: %s" % network_name   
+        #net = nets[0]
 
-        subnets = self.shell.quantum.list_subnets(name=self.name)
-        allocation_pools = [{'start': start, 'end': end}]
-        subnet = self.shell.quantum.create_subnet(network_id=net['id'],
-                                                ip_version=ip_version,
-                                                cidr=cidr_ip,
-                                                dns_nameservers=['8.8.8.8', '8.8.8.4'],         
-                                                allocation_pools=allocation_pools)
+        subnet = None 
+        subnets = self.shell.quantum.list_subnets()['subnets']
+        for snet in subnets:
+            if snet['cidr'] == cidr_ip and snet['network_id'] == network_id:
+                subnet = snet
+ 
+        if not subnet:
+            allocation_pools = [{'start': start, 'end': end}]
+            subnet = {'subnet': {'name': name,
+                                 'network_id': network_id,
+                                 'ip_version': ip_version,
+                                 'cidr': cidr_ip,
+                                 'dns_nameservers': ['8.8.8.8', '8.8.8.4'],
+                                 'allocation_pools': allocation_pools}}          
+            subnet = self.shell.quantum.create_subnet(subnet)['subnet']
 
         # TODO: Add route to external network
         # e.g. #  route add -net 10.0.3.0/24 dev br-ex gw 10.100.0.5 
         return subnet
 
+    def update_subnet(self, id, fields):
+        return self.shell.quantum.update_subnet(id, fields)
+
     def delete_subnet(self, id):
         return self.shell.quantum.delete_subnet(id=id)
      
diff --git a/plstackapi/openstack/manager.py b/plstackapi/openstack/manager.py
index 50a36e2..eb76ff7 100644
--- a/plstackapi/openstack/manager.py
+++ b/plstackapi/openstack/manager.py
@@ -1,32 +1,51 @@
 from plstackapi.planetstack import settings
 from django.core import management
 management.setup_environ(settings)
-from plstackapi.openstack.shell import OpenStackShell
+from plstackapi.openstack.client import OpenStackClient
 
 
 class Manager:
 
     def __init__(self):
         
-        self.shell = OpenStackShell()
+        self.client = OpenStackClient()
 
     def refresh_nodes(self):
         # collect local nodes
-        from plstackapi.planetstack.models import Node
+        from plstackapi.core.models import Node
+        from plstackapi.core.models import DeploymentNetwork
+        from plstackapi.core.models import Site
         nodes = Node.objects.all()
         nodes_dict = {}
         for node in nodes:
-            nodes_dict[node.name] = node 
+            if 'viccidev10' not in node.name:
+                nodes_dict[node.name] = node 
+        
+        deployment = DeploymentNetwork.objects.filter(name='VICCI')
+        login_bases = ['princeton', 'stanford', 'gt', 'uw', 'mpisws']
+        sites = Site.objects.filter(login_base__in=login_bases)
+        nodes_per_site = len(nodes)/len(sites)
+        
+        def chunks(l, n):
+            return [l[i:i+n] for i in range(0, len(l), n)]
 
         # collect nova nodes:
-        compute_nodes = self.shell.nova.hypervisors.list()
+        compute_nodes = self.client.nova.hypervisors.list()
+
         compute_nodes_dict = {}
         for compute_node in compute_nodes:
             compute_nodes_dict[compute_node.hypervisor_hostname] = compute_node
 
         # add new nodes:
+        counter = 1
         new_node_names = set(compute_nodes_dict.keys()).difference(nodes_dict.keys())
+
+        def chunks(l, n):
+            return [l[i:i+n] for i in range(0, len(l), n)]
+
+        node_chunks = chunks(compute_nodes, nodes_per_site)
         for name in new_node_names:
+            for 
             node = Node(name=compute_nodes_dict[name].hypervisor_hostname)
             node.save()
 
@@ -36,14 +55,14 @@
 
     def refresh_flavors(self):
         # collect local flavors
-        from plstackapi.planetstack.models import Flavor
+        from plstackapi.core.models import Flavor
         flavors = Flavor.objects.all()
         flavors_dict = {}
         for flavor in flavors:
             flavors_dict[flavor.name] = flavor
 
         # collect nova falvors
-        nova_flavors = self.shell.nova.flavors.list()
+        nova_flavors = self.client.nova.flavors.list()
         nova_flavors_dict = {}
         for nova_flavor in nova_flavors:
             nova_flavors_dict[nova_flavor.name] = nova_flavor
@@ -65,14 +84,14 @@
             
     def refresh_images(self):
         # collect local images
-        from plstackapi.planetstack.models import Image
+        from plstackapi.core.models import Image
         images = Image.objects.all()
         images_dict = {}    
         for image in images:
             images_dict[image.name] = image
 
         # collect glance images
-        glance_images = self.shell.glance.get_images()
+        glance_images = self.client.glance.get_images()
         glance_images_dict = {}
         for glance_image in glance_images:
             glance_images_dict[glance_image['name']] = glance_image
@@ -89,5 +108,3 @@
         # remove old images
         old_image_names = set(images_dict.keys()).difference(glance_images_dict.keys())
         Image.objects.filter(name__in=old_image_names).delete()
-        
-     
