Merge branch 'master' of git.planet-lab.org:/git/plstackapi
diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py
index 663dd9a..a1a21d6 100644
--- a/planetstack/core/admin.py
+++ b/planetstack/core/admin.py
@@ -402,9 +402,9 @@
 class SliverAdmin(PlanetStackBaseAdmin):
     form = SliverForm
     fieldsets = [
-        ('Sliver', {'fields': ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'key', 'node', 'deploymentNetwork']})
+        ('Sliver', {'fields': ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']})
     ]
-    list_display = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'key', 'node', 'deploymentNetwork']
+    list_display = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
     inlines = [TagInline]
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
diff --git a/planetstack/core/api_root.py b/planetstack/core/api_root.py
index 61e76da..87e8924 100644
--- a/planetstack/core/api_root.py
+++ b/planetstack/core/api_root.py
@@ -5,14 +5,12 @@
 @api_view(['GET'])
 def api_root(request, format=None):
     return Response({
-        'roles': reverse('role-list', request=request, format=format),
-        'users': reverse('user-list', request=request, format=format),
-        'keys': reverse('key-list', request=request, format=format),
-        #'nodes': reverse('node-list', request=request, format=format),
+        'deployments': reverse('deployment-list', request=request, format=format),
         'sites': reverse('site-list', request=request, format=format),
-        'deploymentNetworks': reverse('deploymentnetwork-list', request=request, format=format),
+        'users': reverse('user-list', request=request, format=format),
         'slices': reverse('slice-list', request=request, format=format),
-        'subnets': reverse('subnet-list', request=request, format=format),
+        'roles': reverse('role-list', request=request, format=format),
+        'nodes': reverse('node-list', request=request, format=format),
         'slivers': reverse('sliver-list', request=request, format=format),
         'images': reverse('image-list', request=request, format=format),
     })
diff --git a/planetstack/core/models/role.py b/planetstack/core/models/role.py
index f6c2f2c..fd29848 100644
--- a/planetstack/core/models/role.py
+++ b/planetstack/core/models/role.py
@@ -5,8 +5,8 @@
 
 class Role(PlCoreBase):
 
-    #ROLE_CHOICES = (('admin', 'Admin'), ('pi', 'Principle Investigator'), ('user','User'))
-    role = models.CharField(null=True, blank=True,max_length=256, unique=True)
+    ROLE_CHOICES = (('admin', 'Admin'), ('pi', 'Principle Investigator'), ('tech', 'Technician'), ('user','User'))
+    role = models.CharField(null=True, blank=True,max_length=256, unique=True, choices=ROLE_CHOICES)
     role_type = models.CharField(max_length=80, unique=True)
 
     def __unicode__(self):  return u'%s' % (self.role_type)
diff --git a/planetstack/core/serializers.py b/planetstack/core/serializers.py
index 00d7160..94f5c3c 100644
--- a/planetstack/core/serializers.py
+++ b/planetstack/core/serializers.py
@@ -9,7 +9,6 @@
     class Meta:
         model = Role
         fields = ('id', 
-                  'role_id',
                   'role',
                   'role_type')
 
@@ -19,11 +18,10 @@
     id = serializers.Field()
     site = serializers.HyperlinkedRelatedField(view_name='site-detail')
     slice_memberships = serializers.HyperlinkedRelatedField(view_name='slice-membership-detail')
-    site_privileges = serializers.HyperlinkedRelatedField(view_name='site-privilege-detail')
+    site_privileges = serializers.HyperlinkedRelatedField(view_name='siteprivilege-detail')
     class Meta:
         model = User
         fields = ('id',
-                  'user_id', 
                   'kuser_id', 
                   'firstname', 
                   'lastname',
@@ -66,7 +64,7 @@
     user = serializers.HyperlinkedRelatedField(view_name='user-detail')
     role = serializers.HyperlinkedRelatedField(view_name='role-detail')
     class Meta:
-        model = SitePrivilege
+        model = SliceMembership
         fields = ('id',
                   'user',
                   'slice',
@@ -115,7 +113,7 @@
 
     # HyperlinkedModelSerializer doesn't include the id by default
     id = serializers.Field()
-    sites = serializers.HyperlinkedRelatedField(view_name='deploymentnetwork-detail')
+    sites = serializers.HyperlinkedRelatedField(view_name='site-detail')
     class Meta:
         model = Deployment
         fields = ('id',
@@ -127,9 +125,8 @@
     # HyperlinkedModelSerializer doesn't include the id by default
     id = serializers.Field()
     image = serializers.HyperlinkedRelatedField(view_name='image-detail')
-    key = serializers.HyperlinkedRelatedField(view_name='key-detail')
     slice = serializers.HyperlinkedRelatedField(view_name='slice-detail')
-    deployment_network = serializers.HyperlinkedRelatedField(view_name='deployment_network-detail')
+    deployment = serializers.HyperlinkedRelatedField(view_name='deployment-detail')
     node = serializers.HyperlinkedRelatedField(view_name='node-detail')
     
     
@@ -143,9 +140,8 @@
                   'instance_name',
                   'ip',
                   'image',
-                  'key',
                   'slice',
-                  'deploymentNetwork',
+                  'deployment',
                   'node')
 
 class NodeSerializer(serializers.HyperlinkedModelSerializer):
diff --git a/planetstack/core/views/deployment_networks.py b/planetstack/core/views/deployment_networks.py
index ef569ac..285a53a 100644
--- a/planetstack/core/views/deployment_networks.py
+++ b/planetstack/core/views/deployment_networks.py
@@ -1,59 +1,12 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.deployment_networks import add_deployment_network, delete_deployment_network, get_deployment_networks
 from core.serializers import DeploymentSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import Deployment
 
+class DeploymentList(generics.ListCreateAPIView):
+    queryset = Deployment.objects.all()
+    serializer_class = DeploymentSerializer
 
-class DeploymentListCreate(APIView):
-    """ 
-    List all deployment networks or create a new role.
-    """
+class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Deployment.objects.all()
+    serializer_class = DeploymentSerializer
 
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'deploymentNetwork' in data:
-        
-            deployment = add_deployment_network(data['auth'], data['deploymentNetwork'].get('name'))
-            serializer = DeploymentSerializer(deployment)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            deployment_networks = get_deployment_networks(data['auth'])
-            serializer = DeploymentSerializer(deployment_networks, many=True)
-            return Response(serializer.data)
-        
-            
-class DeploymentRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a deployment network 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a deployment network"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        deployment_networks = get_deployment_networks(data['auth'], pk)
-        if not deployment_networks:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = DeploymentSerializer(deployment_networks[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """deployment network update not implemnted""" 
-        return Response(status=status.HTTP_404_NOT_FOUND) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_deployment_network(data['auth'], pk)
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
diff --git a/planetstack/core/views/images.py b/planetstack/core/views/images.py
index 7e0ab59..5ea5d76 100644
--- a/planetstack/core/views/images.py
+++ b/planetstack/core/views/images.py
@@ -1,55 +1,12 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.images import add_image, delete_image, get_images
 from core.serializers import ImageSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import Image
 
+class ImageList(generics.ListCreateAPIView):
+    queryset = Image.objects.all()
+    serializer_class = ImageSerializer
 
-class ImageListCreate(APIView):
-    """ 
-    List all images or create a new image.
-    """
+class ImageDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Image.objects.all()
+    serializer_class = ImageSerializer
 
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'image' in data:
-            """Not Implemented"""
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        else:
-            images = get_images(data['auth'])
-            serializer = ImageSerializer(images, many=True)
-            return Response(serializer.data)
-        
-            
-class ImageRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete an image  
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve an image """
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        images = get_images(data['auth'], pk)
-        if not images:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = ImageSerializer(images[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update image not implemnted""" 
-        return Response(status=status.HTTP_404_NOT_FOUND) 
-
-    def delete(self, request, pk, format=None):
-        """delete image not implemnted""" 
-        return Response(status=status.HTTP_404_NOT_FOUND) 
-
-            
-            
-        
diff --git a/planetstack/core/views/nodes.py b/planetstack/core/views/nodes.py
index 0f1977e..8706114 100644
--- a/planetstack/core/views/nodes.py
+++ b/planetstack/core/views/nodes.py
@@ -1,55 +1,13 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.nodes import add_node, delete_node, get_nodes, update_node
 from core.serializers import NodeSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import Node
+
+class NodeList(generics.ListCreateAPIView):
+    queryset = Node.objects.all()
+    serializer_class = NodeSerializer
+
+class NodeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Node.objects.all()
+    serializer_class = NodeSerializer
 
 
-class NodeListCreate(APIView):
-    """ 
-    List all nodes or create a new node.
-    """
-
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'node' in data:
-            """Not Implemented"""
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        else:
-            nodes = get_nodes(data['auth'])
-            serializer = NodeSerializer(nodes, many=True)
-            return Response(serializer.data)
-        
-            
-class NodeRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete an node  
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve an node """
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        nodes = get_nodes(data['auth'], pk)
-        if not nodes:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = NodeSerializer(nodes[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update node not implemnted""" 
-        return Response(status=status.HTTP_404_NOT_FOUND) 
-
-    def delete(self, request, pk, format=None):
-        """delete node not implemnted""" 
-        return Response(status=status.HTTP_404_NOT_FOUND) 
-
-            
-            
-        
diff --git a/planetstack/core/views/roles.py b/planetstack/core/views/roles.py
index 37bb149..13c9917 100644
--- a/planetstack/core/views/roles.py
+++ b/planetstack/core/views/roles.py
@@ -1,58 +1,13 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.roles import add_role, delete_role, get_roles
 from core.serializers import RoleSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import Role
+
+class RoleList(generics.ListCreateAPIView):
+    queryset = Role.objects.all()
+    serializer_class = RoleSerializer
+
+class RoleDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Role.objects.all()
+    serializer_class = RoleSerializer
 
 
-class RoleListCreate(APIView):
-    """ 
-    List all roles or create a new role.
-    """
-
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'role' in data:
-            role = add_role(data['auth'], data['role']['role_type'])
-            serializer = RoleSerializer(data=role)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            roles = get_roles(data['auth'])
-            serializer = RoleSerializer(roles, many=True)
-            return Response(serializer.data)
-        
-            
-class RoleRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a role 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a role"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        roles = get_roles(data['auth'], pk)
-        if not roles:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = RoleSerializer(roles[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """role update not implemnted""" 
-        return Response(status=status.HTTP_404_NOT_FOUND) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_role(data['auth'], pk)
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
diff --git a/planetstack/core/views/site_privileges.py b/planetstack/core/views/site_privileges.py
index 37fc371..90053e5 100644
--- a/planetstack/core/views/site_privileges.py
+++ b/planetstack/core/views/site_privileges.py
@@ -1,66 +1,13 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.site_privileges import add_site_privilege, delete_site_privilege, get_site_privileges, update_site_privilege
 from core.serializers import SitePrivilegeSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import SitePrivilege
+
+class SitePrivilegeList(generics.ListCreateAPIView):
+    queryset = SitePrivilege.objects.all()
+    serializer_class = SitePrivilegeSerializer
+
+class SitePrivilegeDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SitePrivilege.objects.all()
+    serializer_class = SitePrivilegeSerializer
 
 
-class SitePrivilegeListCreate(APIView):
-    """ 
-    List all site_privileges or create a new site_privilege.
-    """
-
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'site_privilege' in data:
-            site_privilege = add_site_privilege(data['auth'], data['site_privilege'])
-            serializer = SitePrivilegeSerializer(site_privilege)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            site_privileges = get_site_privileges(data['auth'])
-            serializer = SitePrivilegeSerializer(site_privileges, many=True)
-            return Response(serializer.data)
-        
-            
-class SitePrivilegeRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a site_privilege 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a site_privilege"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        site_privileges = get_site_privileges(data['auth'], pk)
-        if not site_privileges:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = SitePrivilegeSerializer(site_privileges[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update a site_privilege""" 
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        elif 'site_privilege' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        site_privilege = update_site_privilege(pk, data['site_privilege'])
-        serializer = SitePrivilegeSerializer(site_privilege)
-        return Response(serializer.data) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_site_privilege(data['auth'], pk)
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
diff --git a/planetstack/core/views/sites.py b/planetstack/core/views/sites.py
index 6449b67..b4af8ac 100644
--- a/planetstack/core/views/sites.py
+++ b/planetstack/core/views/sites.py
@@ -1,66 +1,70 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.sites import add_site, delete_site, get_sites
 from core.serializers import SiteSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import Site
+
+class SiteList(generics.ListCreateAPIView):
+    queryset = Site.objects.all()
+    serializer_class = SiteSerializer
+
+class SiteDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Site.objects.all()
+    serializer_class = SiteSerializer
 
 
-class SiteListCreate(APIView):
-    """ 
-    List all sites or create a new site.
-    """
 
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'site' in data:
-            site = add_site(data['auth'], data['site'])
-            serializer = SiteSerializer(site)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            sites = get_sites(data['auth'])
-            serializer = SiteSerializer(sites, many=True)
-            return Response(serializer.data)
+#class SiteListCreate(APIView):
+######    """ 
+##    List all sites or create a new site.
+#    """
+#
+#    def post(self, request, format = None):
+#        data = parse_request(request.DATA)  
+#        if 'auth' not in data:
+#            return Response(status=status.HTTP_400_BAD_REQUEST)        
+#        elif 'site' in data:
+#            site = add_site(data['auth'], data['site'])
+#            serializer = SiteSerializer(site)
+#            return Response(serializer.data, status=status.HTTP_201_CREATED)
+#        else:
+#            sites = get_sites(data['auth'])
+#            serializer = SiteSerializer(sites, many=True)
+#            return Response(serializer.data)
         
             
-class SiteRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a site 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a site"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        sites = get_sites(data['auth'], {'id': pk})
-        if not sites:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = SiteSerializer(sites[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update a site""" 
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        elif 'site' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        site = update_site(pk, data['site'])
-        serializer = SiteSerializer(site)
-        return Response(serializer.data) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_site(data['auth'], {'id': pk})
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
+#class SiteRetrieveUpdateDestroy(APIView):
+#    """
+#    Retrieve, update or delete a site 
+#    """
+#
+#    def post(self, request, pk, format=None):
+#        """Retrieve a site"""
+#        data = parse_request(request.DATA)
+#        if 'auth' not in data:
+#            return Response(status=status.HTTP_400_BAD_REQUEST)
+#        sites = get_sites(data['auth'], {'id': pk})
+#        if not sites:
+#            return Response(status=status.HTTP_404_NOT_FOUND)
+#        serializer = SiteSerializer(sites[0])
+#        return Response(serializer.data)                  
+#
+#    def put(self, request, pk, format=None):
+#        """update a site""" 
+#        data = parse_request(request.DATA)
+#        if 'auth' not in data:
+#            return Response(status=status.HTTP_400_BAD_REQUEST)
+#        elif 'site' not in data:
+#            return Response(status=status.HTTP_400_BAD_REQUEST)
+#
+#        site = update_site(pk, data['site'])
+#        serializer = SiteSerializer(site)
+#        return Response(serializer.data) 
+#
+#    def delete(self, request, pk, format=None):
+#        data = parse_request(request.DATA) 
+#        if 'auth' not in data:
+#            return Response(status=status.HTTP_400_BAD_REQUEST)
+#        delete_site(data['auth'], {'id': pk})
+#        return Response(status=status.HTTP_204_NO_CONTENT) 
+#            
+#            
+##        
diff --git a/planetstack/core/views/slice_memberships.py b/planetstack/core/views/slice_memberships.py
index 4bb581c..13f0707 100644
--- a/planetstack/core/views/slice_memberships.py
+++ b/planetstack/core/views/slice_memberships.py
@@ -1,66 +1,13 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.slice_memberships import add_slice_membership, delete_slice_membership, get_slice_memberships, update_slice_membership
 from core.serializers import SliceMembershipSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import SliceMembership
+
+class SliceMembershipList(generics.ListCreateAPIView):
+    queryset = SliceMembership.objects.all()
+    serializer_class = SliceMembershipSerializer
+
+class SliceMembershipDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = SliceMembership.objects.all()
+    serializer_class = SliceMembershipSerializer
 
 
-class SliceMembershipListCreate(APIView):
-    """ 
-    List all slice_memberships or create a new slice_membership.
-    """
-
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'slice_membership' in data:
-            slice_membership = add_slice_membership(data['auth'], data['slice_membership'])
-            serializer = SliceMembershipSerializer(slice_membership)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            slice_memberships = get_slice_memberships(data['auth'])
-            serializer = SliceMembershipSerializer(slice_memberships, many=True)
-            return Response(serializer.data)
-        
-            
-class SliceMembershipRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a slice_membership 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a slice_membership"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        slice_memberships = get_slice_memberships(data['auth'], pk)
-        if not slice_memberships:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = SliceMembershipSerializer(slice_memberships[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update a slice_membership""" 
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        elif 'slice_membership' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        slice_membership = update_slice_membership(pk, data['slice_membership'])
-        serializer = SliceMembershipSerializer(slice_membership)
-        return Response(serializer.data) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_slice_membership(data['auth'], pk)
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
diff --git a/planetstack/core/views/slices.py b/planetstack/core/views/slices.py
index 5954d0c..e3ab139 100644
--- a/planetstack/core/views/slices.py
+++ b/planetstack/core/views/slices.py
@@ -1,66 +1,13 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.slices import add_slice, delete_slice, get_slices, update_slice
 from core.serializers import SliceSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import Slice
+
+class SliceList(generics.ListCreateAPIView):
+    queryset = Slice.objects.all()
+    serializer_class = SliceSerializer
+
+class SliceDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Slice.objects.all()
+    serializer_class = SliceSerializer
 
 
-class SliceListCreate(APIView):
-    """ 
-    List all slices or create a new slice.
-    """
-
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'slice' in data:
-            slice = add_slice(data['auth'], data['slice'])
-            serializer = SliceSerializer(slice)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            slices = get_slices(data['auth'])
-            serializer = SliceSerializer(slices, many=True)
-            return Response(serializer.data)
-        
-            
-class SliceRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a slice 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a slice"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        slices = get_slices(data['auth'],  pk)
-        if not slices:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = SliceSerializer(slices[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update a slice""" 
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        elif 'slice' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        slice = update_slice(pk, data['slice'])
-        serializer = SliceSerializer(slice)
-        return Response(serializer.data) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_slice(data['auth'],  pk)
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
diff --git a/planetstack/core/views/slivers.py b/planetstack/core/views/slivers.py
index 3741cce..bb310da 100644
--- a/planetstack/core/views/slivers.py
+++ b/planetstack/core/views/slivers.py
@@ -1,66 +1,13 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.slivers import add_sliver, delete_sliver, get_slivers, update_sliver
 from core.serializers import SliverSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import Sliver
+
+class SliverList(generics.ListCreateAPIView):
+    queryset = Sliver.objects.all()
+    serializer_class = SliverSerializer
+
+class SliverDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = Sliver.objects.all()
+    serializer_class = SliverSerializer
 
 
-class SliverListCreate(APIView):
-    """ 
-    List all slivers or create a new sliver.
-    """
-
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'sliver' in data:
-            sliver = add_sliver(data['auth'], data['sliver'])
-            serializer = SliverSerializer(sliver)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            slivers = get_slivers(data['auth'])
-            serializer = SliverSerializer(slivers, many=True)
-            return Response(serializer.data)
-        
-            
-class SliverRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a sliver 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a sliver"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        slivers = get_slivers(data['auth'], pk)
-        if not slivers:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = SliverSerializer(slivers[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update a sliver""" 
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        elif 'sliver' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        sliver = update_sliver(pk, data['sliver'])
-        serializer = SliverSerializer(sliver)
-        return Response(serializer.data) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_sliver(data['auth'], pk)
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
diff --git a/planetstack/core/views/users.py b/planetstack/core/views/users.py
index 8b27928..06ac0f3 100644
--- a/planetstack/core/views/users.py
+++ b/planetstack/core/views/users.py
@@ -1,66 +1,11 @@
-from django.http import Http404
-from rest_framework.views import APIView
-from rest_framework.response import Response
-from rest_framework import status
-
-from core.api.users import add_user, delete_user, get_users, update_user
 from core.serializers import UserSerializer
-from util.request import parse_request
+from rest_framework import generics
+from core.models import User
 
+class UserList(generics.ListCreateAPIView):
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
 
-class UserListCreate(APIView):
-    """ 
-    List all users or create a new user.
-    """
-
-    def post(self, request, format = None):
-        data = parse_request(request.DATA)  
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)        
-        elif 'user' in data:
-            user = add_user(data['auth'], data['user'])
-            serializer = UserSerializer(user)
-            return Response(serializer.data, status=status.HTTP_201_CREATED)
-        else:
-            users = get_users(data['auth'])
-            serializer = UserSerializer(users, many=True)
-            return Response(serializer.data)
-        
-            
-class UserRetrieveUpdateDestroy(APIView):
-    """
-    Retrieve, update or delete a user 
-    """
-
-    def post(self, request, pk, format=None):
-        """Retrieve a user"""
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        users = get_users(data['auth'], {'id': pk})
-        if not users:
-            return Response(status=status.HTTP_404_NOT_FOUND)
-        serializer = UserSerializer(users[0])
-        return Response(serializer.data)                  
-
-    def put(self, request, pk, format=None):
-        """update a user""" 
-        data = parse_request(request.DATA)
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        elif 'user' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-
-        user = update_user(pk, data['user'])
-        serializer = UserSerializer(user)
-        return Response(serializer.data) 
-
-    def delete(self, request, pk, format=None):
-        data = parse_request(request.DATA) 
-        if 'auth' not in data:
-            return Response(status=status.HTTP_400_BAD_REQUEST)
-        delete_user(data['auth'], {'id': pk})
-        return Response(status=status.HTTP_204_NO_CONTENT) 
-            
-            
-        
+class UserDetail(generics.RetrieveUpdateDestroyAPIView):
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
diff --git a/planetstack/openstack/manager.py b/planetstack/openstack/manager.py
index 0b20d79..3ae7dea 100644
--- a/planetstack/openstack/manager.py
+++ b/planetstack/openstack/manager.py
@@ -1,4 +1,3 @@
-w
 import os
 #os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
 import string
diff --git a/planetstack/planetstack/urls.py b/planetstack/planetstack/urls.py
index 30eed05..638e3b1 100644
--- a/planetstack/planetstack/urls.py
+++ b/planetstack/planetstack/urls.py
@@ -2,17 +2,17 @@
 
 # Uncomment the next two lines to enable the admin:
 from django.contrib import admin
-from core.views.roles import RoleListCreate, RoleRetrieveUpdateDestroy
-from core.views.sites import SiteListCreate, SiteRetrieveUpdateDestroy
-from core.views.site_privileges import SitePrivilegeListCreate, SitePrivilegeRetrieveUpdateDestroy
-from core.views.users import UserListCreate, UserRetrieveUpdateDestroy
-from core.views.slices import SliceListCreate, SliceRetrieveUpdateDestroy
-from core.views.slice_memberships import SliceMembershipListCreate, SliceMembershipRetrieveUpdateDestroy
-from core.views.slivers import SliverListCreate, SliverRetrieveUpdateDestroy
-from core.views.deployment_networks import DeploymentListCreate, DeploymentRetrieveUpdateDestroy
-from core.views.images import ImageListCreate, ImageRetrieveUpdateDestroy
-from core.views.nodes import NodeListCreate, NodeRetrieveUpdateDestroy
-from core.models import Site
+from core.views.roles import RoleList, RoleDetail
+from core.views.sites import SiteList, SiteDetail
+from core.views.site_privileges import SitePrivilegeList, SitePrivilegeDetail
+from core.views.users import UserList, UserDetail
+from core.views.slices import SliceList, SliceDetail
+from core.views.slice_memberships import SliceMembershipList, SliceMembershipDetail
+from core.views.slivers import SliverList, SliverDetail
+from core.views.deployment_networks import DeploymentList, DeploymentDetail
+from core.views.images import ImageList, ImageDetail
+from core.views.nodes import NodeList, NodeDetail
+from core.models import *
 from core.api_root import api_root
 from rest_framework import generics
 
@@ -31,35 +31,36 @@
 
     url(r'^plstackapi/$', api_root),
     
-    url(r'^plstackapi/roles/$', RoleListCreate.as_view(), name='role-list'),
-    url(r'^plstackapi/roles/(?P<pk>[a-zA-Z0-9]+)/$', RoleRetrieveUpdateDestroy.as_view(), name='role-detail'),
+    url(r'^plstackapi/roles/$', RoleList.as_view(), name='role-list'),
+    url(r'^plstackapi/roles/(?P<pk>[a-zA-Z0-9]+)/$', RoleDetail.as_view(), name='role-detail'),
 
-    url(r'^plstackapi/users/$', UserListCreate.as_view(), name='user-list'),
-    url(r'^plstackapi/users/(?P<pk>[a-zA-Z0-9_\-]+)/$', UserRetrieveUpdateDestroy.as_view(), name='user-detail'),
+    url(r'^plstackapi/users/$', UserList.as_view(), name='user-list'),
+    url(r'^plstackapi/users/(?P<pk>[a-zA-Z0-9_\-]+)/$', UserDetail.as_view(), name='user-detail'),
 
-    url(r'^plstackapi/sites/$', SiteListCreate.as_view(), name='site-list'),
-    url(r'^plstackapi/sites/(?P<pk>[a-zA-Z0-9_\-]+)/$', SiteRetrieveUpdateDestroy.as_view(), name='site-detail'),
+    url(r'^plstackapi/sites/$', SiteList.as_view(), name='site-list'),
+    url(r'^plstackapi/sites/(?P<pk>[a-zA-Z0-9_\-]+)/$', SiteDetail.as_view(), name='site-detail'),
 
-    url(r'^plstackapi/site_privileges/$', SitePrivilegeListCreate.as_view(), name='siteprivilege-list'),
-    url(r'^plstackapi/site_privileges/(?P<pk>[a-zA-Z0-9_]+)/$', SitePrivilegeRetrieveUpdateDestroy.as_view(), name='siteprivilege-detail'),
+    url(r'^plstackapi/site_privileges/$', SitePrivilegeList.as_view(), name='siteprivilege-list'),
+    url(r'^plstackapi/site_privileges/(?P<pk>[a-zA-Z0-9_]+)/$', SitePrivilegeDetail.as_view(), name='siteprivilege-detail'),
+  
+    url(r'^plstackapi/slices/$', SliceList.as_view(), name='slice-list'),
 
-    url(r'^plstackapi/slices/$', SliceListCreate.as_view(), name='slice-list'),
-    url(r'^plstackapi/slices/(?P<pk>[a-zA-Z0-9_\-]+)/$', SliceRetrieveUpdateDestroy.as_view(), name='slice-detail'),
+    url(r'^plstackapi/slices/(?P<pk>[a-zA-Z0-9_\-]+)/$', SliceDetail.as_view(), name='slice-detail'),
 
-    url(r'^plstackapi/slice_memberships/$', SliceMembershipListCreate.as_view(), name='slice_membership-list'),
-    url(r'^plstackapi/slice_memberships/(?P<pk>[0-9]+)/$', SliceMembershipRetrieveUpdateDestroy.as_view(), name='slice_membership-detail'),
+    url(r'^plstackapi/slice_memberships/$', SliceMembershipList.as_view(), name='slice-membership-list'),
+    url(r'^plstackapi/slice_memberships/(?P<pk>[0-9]+)/$', SliceMembershipDetail.as_view(), name='slice-membership-detail'),
     
-    url(r'^plstackapi/slivers/$', SliverListCreate.as_view(), name='sliver-list'),
-    url(r'^plstackapi/slivers/(?P<pk>[a-zA-Z0-9_\-]+)/$', SliverRetrieveUpdateDestroy.as_view(), name='sliver-detail'),
+    url(r'^plstackapi/slivers/$', SliverList.as_view(), name='sliver-list'),
+    url(r'^plstackapi/slivers/(?P<pk>[a-zA-Z0-9_\-]+)/$', SliverDetail.as_view(), name='sliver-detail'),
 
-    url(r'^plstackapi/nodes/$', NodeListCreate.as_view(), name='node-list'),
-    url(r'^plstackapi/nodes/(?P<pk>[a-zA-Z0-9_\-]+)/$', NodeRetrieveUpdateDestroy.as_view(), name='node-detail'),
+    url(r'^plstackapi/nodes/$', NodeList.as_view(), name='node-list'),
+    url(r'^plstackapi/nodes/(?P<pk>[a-zA-Z0-9_\-]+)/$', NodeDetail.as_view(), name='node-detail'),
     
-    url(r'^plstackapi/deploymentnetworks/$', DeploymentListCreate.as_view(), name='deploymentnetwork-list'),
-    url(r'^plstackapi/deploymentnetworks/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentRetrieveUpdateDestroy.as_view(), name='deploymentnetwork-detail'),
+    url(r'^plstackapi/deployments/$', DeploymentList.as_view(), name='deployment-list'),
+    url(r'^plstackapi/deployments/(?P<pk>[a-zA-Z0-9\-]+)/$', DeploymentDetail.as_view(), name='deployment-detail'),
 
-    url(r'^plstackapi/images/$', ImageListCreate.as_view(), name='image-list'),
-    url(r'^plstackapi/images/(?P<pk>[a-zA-Z0-9_\-]+)/$', ImageRetrieveUpdateDestroy.as_view(), name='image-detail'),
+    url(r'^plstackapi/images/$', ImageList.as_view(), name='image-list'),
+    url(r'^plstackapi/images/(?P<pk>[a-zA-Z0-9_\-]+)/$', ImageDetail.as_view(), name='image-detail'),
 
     #Adding in rest_framework urls
     url(r'^plstackapi/', include('rest_framework.urls', namespace='rest_framework')),