diff --git a/xos/api/service/hpc/__init__.py b/xos/api/service/hpc/__init__.py
deleted file mode 100644
index 8b13789..0000000
--- a/xos/api/service/hpc/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/xos/api/service/hpc/hpcview.py b/xos/api/service/hpc/hpcview.py
deleted file mode 100644
index 3e31e73..0000000
--- a/xos/api/service/hpc/hpcview.py
+++ /dev/null
@@ -1,210 +0,0 @@
-from rest_framework.decorators import api_view
-from rest_framework.response import Response
-from rest_framework.reverse import reverse
-from rest_framework import serializers
-from rest_framework import generics
-from rest_framework.views import APIView
-from core.models import *
-from services.hpc.models import *
-from services.requestrouter.models import *
-from django.forms import widgets
-from django.core.exceptions import PermissionDenied
-from django.contrib.contenttypes.models import ContentType
-import json
-import socket
-import time
-
-def lookup_tag(service, instance, name, default=None):
-    instance_type = ContentType.objects.get_for_model(instance)
-    t = Tag.objects.filter(service=service, name=name, content_type__pk=instance_type.id, object_id=instance.id)
-    if t:
-        return t[0].value
-    else:
-        return default
-
-def lookup_time(service, instance, name):
-    v = lookup_tag(service, instance, name)
-    if v:
-        return str(time.time() - float(v))
-    else:
-        return None
-
-def json_default(d, default):
-    if not d:
-        return default
-    return json.loads(d)
-
-def compute_config_run(d):
-    if not d:
-        return "null"
-
-    try:
-        d = json.loads(d)
-    except:
-        return "error decoding json '%s'" % str(d)
-
-    status = d.get("status", "null")
-    if status!="success":
-        return status
-
-    config_run = d.get("config.run")
-    if not config_run:
-        return "null"
-
-    try:
-        config_run = max(0, int(time.time()) - int(float(config_run)))
-    except:
-        pass
-
-    return config_run
-
-# from hpc_watcher.py
-def get_public_ip(service, instance):
-    network_name = None
-    if "hpc" in instance.slice.name:
-        network_name = getattr(service, "watcher_hpc_network", None)
-    elif "demux" in instance.slice.name:
-        network_name = getattr(service, "watcher_dnsdemux_network", None)
-    elif "redir" in instance.slice.name:
-        network_name = getattr(service, "watcher_dnsredir_network", None)
-
-    if network_name and network_name.lower()=="nat":
-        return None
-
-    if (network_name is None) or (network_name=="") or (network_name.lower()=="public"):
-        return instance.get_public_ip()
-
-    for ns in instance.ports.all():
-        if (ns.ip) and (ns.network.name==network_name):
-            return ns.ip
-
-    raise ValueError("Couldn't find network %s" % str(network_name))
-
-def getHpcDict(user, pk):
-    hpc = HpcService.objects.get(pk=pk)
-    slices = hpc.slices.all()
-
-    dnsdemux_slice = None
-    dnsredir_slice = None
-    hpc_slice = None
-    for slice in slices:
-        if "dnsdemux" in slice.name:
-            dnsdemux_service = hpc
-            dnsdemux_slice = slice
-        if "dnsredir" in slice.name:
-            dnsredir_service = hpc
-            dnsredir_slice = slice
-        if "hpc" in slice.name:
-            hpc_service = hpc
-            hpc_slice = slice
-
-    if not dnsdemux_slice:
-        rr = RequestRouterService.objects.all()
-        if rr:
-            rr=rr[0]
-            slices = rr.slices.all()
-            for slice in slices:
-                if "dnsdemux" in slice.name:
-                    dnsdemux_service = rr
-                    dnsdemux_slice = slice
-                if "dnsredir" in slice.name:
-                    dnsredir_service = rr
-                    dnsredir_slice = slice
-
-    if not dnsredir_slice:
-        print "no dnsredir slice"
-        return
-
-    if not dnsdemux_slice:
-        print "no dnsdemux slice"
-        return
-
-    #dnsdemux_has_public_network = False
-    #for network in dnsdemux_slice.networks.all():
-    #    if (network.template) and (network.template.visibility=="public") and (network.template.translation=="none"):
-    #        dnsdemux_has_public_network = True
-
-    nameservers = {}
-    for nshc in hpc.hpchealthcheck_set.filter(kind="nameserver"):
-        nameserver = nshc.resource_name
-        try:
-            nameservers[nameserver] = {"name": nameserver, "ip": socket.gethostbyname(nameserver), "hit": False}
-        except:
-            nameservers[nameserver] = {"name": nameserver, "ip": "exception", "hit": False}
-
-    dnsdemux=[]
-    for instance in dnsdemux_slice.instances.all():
-        ip=None
-        try:
-            ip = get_public_ip(dnsdemux_service, instance)
-        except Exception, e:
-            ip = "Exception: " + str(e)
-        if not ip:
-            try:
-                ip = socket.gethostbyname(instance.node.name)
-            except:
-                ip = "??? " + instance.node.name
-
-        instance_nameservers = []
-        for ns in nameservers.values():
-            if ns["ip"]==ip:
-                instance_nameservers.append(ns["name"])
-                ns["hit"]=True
-
-        # now find the dnsredir instance that is also on this node
-        watcherd_dnsredir = "no-redir-instance"
-        for dnsredir_instance in dnsredir_slice.instances.all():
-            if dnsredir_instance.node == instance.node:
-                watcherd_dnsredir = lookup_tag(dnsredir_service, dnsredir_instance, "watcher.watcher.msg")
-
-        watcherd_dnsdemux = lookup_tag(dnsdemux_service, instance, "watcher.watcher.msg")
-
-        dnsdemux.append( {"name": instance.node.name,
-                       "watcher.DNS.msg": lookup_tag(dnsdemux_service, instance, "watcher.DNS.msg"),
-                       "watcher.DNS.time": lookup_time(dnsdemux_service, instance, "watcher.DNS.time"),
-                       "ip": ip,
-                       "nameservers": instance_nameservers,
-                       "dnsdemux_config_age": compute_config_run(watcherd_dnsdemux),
-                       "dnsredir_config_age": compute_config_run(watcherd_dnsredir) })
-
-    hpc=[]
-    for instance in hpc_slice.instances.all():
-        watcherd_hpc = lookup_tag(hpc_service, instance, "watcher.watcher.msg")
-
-        hpc.append( {"name": instance.node.name,
-                     "watcher.HPC-hb.msg": lookup_tag(hpc_service, instance, "watcher.HPC-hb.msg"),
-                     "watcher.HPC-hb.time": lookup_time(hpc_service, instance, "watcher.HPC-hb.time"),
-                     "watcher.HPC-fetch.msg": lookup_tag(hpc_service, instance, "watcher.HPC-fetch.msg"),
-                     "watcher.HPC-fetch.time": lookup_time(hpc_service, instance, "watcher.HPC-fetch.time"),
-                     "watcher.HPC-fetch.urls": json_default(lookup_tag(hpc_service, instance, "watcher.HPC-fetch-urls.msg"), []),
-                     "config_age": compute_config_run(watcherd_hpc),
-
-        })
-
-    return { "id": pk,
-             "dnsdemux": dnsdemux,
-             "hpc": hpc,
-             "nameservers": nameservers,}
-
-
-class HpcList(APIView):
-    method_kind = "list"
-    method_name = "hpcview"
-
-    def get(self, request, format=None):
-        if (not request.user.is_authenticated()):
-            raise PermissionDenied("You must be authenticated in order to use this API")
-        results = []
-        for hpc in HpcService.objects.all():
-            results.append(getHpcDict(request.user, hpc.pk))
-        return Response( results )
-
-class HpcDetail(APIView):
-    method_kind = "detail"
-    method_name = "hpcview"
-
-    def get(self, request, format=None, pk=0):
-        if (not request.user.is_authenticated()):
-            raise PermissionDenied("You must be authenticated in order to use this API")
-        return Response( [getHpcDict(request.user, pk)] )
-
diff --git a/xos/core/views/hpc_config.py b/xos/core/views/hpc_config.py
deleted file mode 100644
index a181a1c..0000000
--- a/xos/core/views/hpc_config.py
+++ /dev/null
@@ -1,131 +0,0 @@
-from django.http import HttpResponse, HttpResponseServerError
-from core.models import *
-from services.hpc.models import *
-from services.requestrouter.models import *
-import xos.settings
-import json
-import os
-import time
-
-def get_service_slices(service):
-    try:
-       return service.slices.all()
-    except:
-       # this field used to be improperly named, and makemigrations won't fix it
-       return service.service.all()
-
-def HpcConfig(request):
-    hpcSlice=None
-    cmiSlice=None
-    redirSlice=None
-    demuxSlice=None
-
-    node_slicename = request.GET.get("slicename", None)
-    if not node_slicename:
-        return HttpResponseServerError("Error: no slicename passed in request")
-
-    # search for an HPC Service that owns the slicename that was passed
-    # to us.
-    hpc=None
-    for candidate in HpcService.objects.all():
-        if candidate.cmi_hostname == node_slicename:
-            # A hack for standalone CMIs that aren't managed by XOS. Set
-            # /etc/slicename to cmi_hostname that's configured in the
-            # HPCService object.
-            hpc = candidate
-
-        for slice in get_service_slices(candidate):
-            if slice.name == node_slicename:
-                hpc = candidate
-
-    if (not hpc):
-        return HttpResponseServerError("Error: no HPC service")
-
-    for slice in get_service_slices(hpc):
-        if "cmi" in slice.name:
-            cmiSlice = slice
-        elif ("hpc" in slice.name) or ("vcoblitz" in slice.name):
-            hpcSlice = slice
-        elif "redir" in slice.name:
-            redirSlice = slice
-        elif "demux" in slice.name:
-            demuxSlice = slice
-
-    if (hpc.cmi_hostname):
-        cmi_hostname = hpc.cmi_hostname
-    else:
-        if not cmiSlice:
-            return HttpResponseServerError("Error: no CMI slice")
-
-        if len(cmiSlice.instances.all())==0:
-            return HttpResponseServerError("Error: CMI slice has no instances")
-
-        # for now, assuming using NAT
-        cmi_hostname = cmiSlice.instances.all()[0].node.name
-
-    if not hpcSlice:
-        return HttpResponseServerError("Error: no HPC slice")
-
-    if (redirSlice==None) or (demuxSlice==None):
-        # The HPC Service didn't have a dnsredir or a dnsdemux, so try looking
-        # in the RequestRouterService for one.
-
-        rr = RequestRouterService.objects.all()
-        if not (rr):
-            return HttpResponseServerError("Error: no RR service")
-
-        rr = rr[0]
-        try:
-           slices = rr.slices.all()
-        except:
-           # this field used to be improperly named, and makemigrations won't fix it
-           slices = rr.service.all()
-        for slice in slices:
-            if "redir" in slice.name:
-                redirSlice = slice
-            elif "demux" in slice.name:
-                demuxSlice = slice
-
-    if not redirSlice:
-        return HttpResponseServerError("Error: no dnsredir slice")
-
-    if not demuxSlice:
-        return HttpResponseServerError("Error: no dnsdemux slice")
-
-    d = {}
-    d["hpc_slicename"] = hpcSlice.name
-    d["redir_slicename"] = redirSlice.name
-    d["demux_slicename"] = demuxSlice.name
-    d["cmi_hostname"] = cmi_hostname
-    d["xos_hostname"] = xos.settings.RESTAPI_HOSTNAME
-    d["xos_port"] = str(xos.settings.RESTAPI_PORT)
-
-    if hpc.hpc_port80:
-        d["hpc_port80"] = "True"
-    else:
-        d["hpc_port80"] = "False"
-
-    return HttpResponse("""# auto-generated by HpcConfig
-ENABLE_PLC=False
-ENABLE_PS=True
-BASE_HRN="princeton"
-RELEVANT_SERVICE_NAMES=['vcoblitz', 'coredirect', 'codnsdemux', "syndicate_comon_server"]
-COBLITZ_SLICE_NAME=BASE_HRN+"_vcoblitz"
-COBLITZ_SLICE_ID=70
-COBLITZ_PS_SLICE_NAME="{hpc_slicename}"
-DNSREDIR_SLICE_NAME=BASE_HRN+"_coredirect"
-DNSREDIR_SLICE_ID=71
-DNSREDIR_PS_SLICE_NAME="{redir_slicename}"
-DNSDEMUX_SLICE_NAME=BASE_HRN+"_codnsdemux"
-DNSDEMUX_SLICE_ID=69
-DNSDEMUX_PS_SLICE_NAME="{demux_slicename}"
-CMI_URL="http://{cmi_hostname}/"
-CMI_HTTP_PORT="8004"
-CMI_HTTPS_PORT="8003"
-PUPPET_MASTER_HOSTNAME="{cmi_hostname}"
-PUPPET_MASTER_PORT="8140"
-PS_HOSTNAME="{xos_hostname}"
-PS_PORT="{xos_port}"
-COBLITZ_PORT_80={hpc_port80}
-""".format(**d))
-
diff --git a/xos/core/views/legacyapi.py b/xos/core/views/legacyapi.py
deleted file mode 100644
index b5592c0..0000000
--- a/xos/core/views/legacyapi.py
+++ /dev/null
@@ -1,353 +0,0 @@
-import os
-import json
-import socket
-import sys
-import time
-import traceback
-import xmlrpclib
-
-from core.models import Slice, Instance, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice
-
-from django.http import HttpResponse
-from django.views.decorators.csrf import csrf_exempt
-
-def ps_id_to_pl_id(x):
-    # Since we don't want the XOS object IDs to conflict with existing
-    # PlanetLab object IDs in the CMI, just add 100000 to the XOS object
-    # IDs.
-    return 100000 + x
-
-def pl_id_to_ps_id(x):
-    return x - 100000
-
-# slice_remap is a dict of ps_slice_name -> (pl_slice_name, pl_slice_id)
-
-def pl_slice_id(slice, slice_remap={}):
-    if slice.name in slice_remap:
-        return int(slice_remap[slice.name][1])
-    else:
-        return ps_id_to_pl_id(slice.id)
-
-def pl_slicename(slice, slice_remap={}):
-    if slice.name in slice_remap:
-        return slice_remap[slice.name][0]
-    else:
-        return slice.name
-
-def filter_fields(src, fields):
-    dest = {}
-    for (key,value) in src.items():
-        if (not fields) or (key in fields):
-            dest[key] = value
-    return dest
-
-def GetSlices(filter={}, slice_remap={}):
-    #ps_slices = Slice.objects.filter(**filter)
-    ps_slices = Slice.objects.all()
-    slices = []
-    for ps_slice in ps_slices:
-        if (filter) and ("name" in filter):
-            remapped_name = slice_remap.get(ps_slice.name, (ps_slice.name,))[0]
-            if (remapped_name != filter["name"]):
-                continue
-
-        node_ids=[]
-        for ps_instance in ps_slice.instances.all():
-            node_ids.append(ps_id_to_pl_id(ps_instance.node.id))
-
-        slice = {"instantiation": "plc-instantiated",
-                 "description": "XOS slice",
-                 "slice_id": pl_slice_id(ps_slice, slice_remap),
-                 "node_ids": node_ids,
-                 "url": "xos",
-                 "max_nodes": 1000,
-                 "peer_slice_id": None,
-                 "slice_tag_ids": [],
-                 "peer_id": None,
-                 "site_id": ps_id_to_pl_id(ps_slice.site_id),
-                 "name": pl_slicename(ps_slice, slice_remap),
-                 "planetstack_name": ps_slice.name}     # keeping planetstack_name for now, to match the modified config.py
-
-                 # creator_person_id, person_ids, expires, created
-
-        slices.append(slice)
-    return slices
-
-def GetNodes(node_ids=None, fields=None, slice_remap={}):
-    if node_ids:
-        ps_nodes = Node.objects.filter(id__in=[pl_id_to_ps_id(nid) for nid in node_ids])
-    else:
-        ps_nodes = Node.objects.all()
-    nodes = []
-    for ps_node in ps_nodes:
-        slice_ids=[]
-        for ps_instance in ps_node.instances.all():
-            slice_ids.append(pl_slice_id(ps_instance.slice, slice_remap))
-
-        node = {"node_id": ps_id_to_pl_id(ps_node.id),
-                "site_id": ps_id_to_pl_id(ps_node.site_id),
-                "node_type": "regular",
-                "peer_node_id": None,
-                "hostname": ps_node.name.lower(),
-                "conf_file_ids": [],
-                "slice_ids": slice_ids,
-                "model": "xos",
-                "peer_id": None,
-                "node_tag_ids": []}
-
-                # last_updated, key, boot_state, pcu_ids, node_type, session, last_boot,
-                # interface_ids, slice_ids_whitelist, run_level, ssh_rsa_key, last_pcu_reboot,
-                # nodegroup_ids, verified, last_contact, boot_nonce, version,
-                # last_pcu_configuration, last_download, date_created, ports
-
-        nodes.append(node)
-
-    nodes = [filter_fields(node, fields) for node in nodes]
-
-    return nodes
-
-def GetTags(slicename,node_id):
-    return {}
-
-def GetSites(slice_remap={}):
-    ps_sites = Site.objects.all()
-    sites = []
-    for ps_site in ps_sites:
-        slice_ids=[]
-        for ps_slice in ps_site.slices.all():
-            slice_ids.append(pl_slice_id(ps_slice, slice_remap))
-
-        node_ids=[]
-        for ps_node in ps_site.nodes.all():
-            node_ids.append(ps_id_to_pl_id(ps_node.id))
-
-        if ps_site.location:
-            longitude = ps_site.location.longitude
-            latitude = ps_site.location.latitude
-        else:
-            longitude = 0
-            latitude = 0
-
-        site = {"site_id": ps_id_to_pl_id(ps_site.id),
-                "node_ids": node_ids,
-                "pcu_ids": [],
-                "max_slices": 100,
-                "max_instances": 1000,
-                "is_public": False,
-                "peer_site_id": None,
-                "abbrebiated_name": ps_site.abbreviated_name,
-                "address_ids": [],
-                "name": ps_site.name,
-                "url": None,
-                "site_tag_ids": [],
-                "enabled": True,
-                "longitude": float(longitude),
-                "latitude": float(latitude),
-                "slice_ids": slice_ids,
-                "login_base": ps_site.login_base,
-                "peer_id": None}
-
-                # last_updated, ext_consortium_id, person_ids, date_created
-
-        sites.append(site)
-
-    return sites
-
-def GetInterfaces(slicename, node_ids, return_nat=False, return_private=False):
-    interfaces = []
-    ps_slices = Slice.objects.filter(name=slicename)
-    for ps_slice in ps_slices:
-        for ps_instance in ps_slice.instances.all():
-            node_id = ps_id_to_pl_id(ps_instance.node_id)
-            if node_id in node_ids:
-                ps_node = ps_instance.node
-
-                ip = socket.gethostbyname(ps_node.name.strip())
-
-                # If the slice has a network that's labeled for hpc_client, then
-                # return that network.
-                found_labeled_network = False
-                for port in ps_instance.ports.all():
-                    if (not port.ip):
-                        continue
-                    if (port.network.owner != ps_slice):
-                        continue
-                    if port.network.labels and ("hpc_client" in port.network.labels):
-                        ip=port.ip
-                        found_labeled_network = True
-
-                if not found_labeled_network:
-                    # search for a dedicated public IP address
-                    for port in ps_instance.ports.all():
-                        if (not port.ip):
-                            continue
-                        template = port.network.template
-                        if (template.visibility=="public") and (template.translation=="none"):
-                            ip=port.ip
-
-                if return_nat:
-                    ip = None
-                    for port in ps_instance.ports.all():
-                        if (not port.ip):
-                            continue
-                        template = port.network.template
-                        if (template.visibility=="private") and (template.translation=="NAT"):
-                            ip=port.ip
-                    if not ip:
-                        continue
-
-                if return_private:
-                    ip = None
-                    for port in ps_instance.ports.all():
-                        if (not port.ip):
-                            continue
-                        template = port.network.template
-                        if (template.visibility=="private") and (template.translation=="none"):
-                            ip=port.ip
-                    if not ip:
-                        continue
-
-                interface = {"node_id": node_id,
-                             "ip": ip,
-                             "broadcast": None,
-                             "mac": "11:22:33:44:55:66",
-                             "bwlimit": None,
-                             "network": None,
-                             "is_primary": True,
-                             "dns1": None,
-                             "hostname": None,
-                             "netmask": None,
-                             "interface_tag_ids": [],
-                             "interface_id": node_id,     # assume each node has only one interface
-                             "gateway": None,
-                             "dns2": None,
-                             "type": "ipv4",
-                             "method": "dhcp"}
-                interfaces.append(interface)
-    return interfaces
-
-def GetConfiguration(name, slice_remap={}):
-    slicename = name["name"]
-    if "node_id" in name:
-        node_id = name["node_id"]
-    else:
-        node_id = 0
-
-    node_instance_tags = GetTags(slicename, node_id)
-
-    slices = GetSlices({"name": slicename}, slice_remap=slice_remap)
-    perhost = {}
-    allinterfaces = {}
-    hostprivmap = {}
-    hostipmap = {}
-    hostnatmap = {}
-    nodes = []
-    if len(slices)==1:
-        slice = slices[0]
-        node_ids = slice['node_ids']
-        nodes = GetNodes(node_ids, ['hostname', 'node_id', 'site_id'], slice_remap=slice_remap)
-        nodemap = {}
-        for node in nodes:
-            nodemap[node['node_id']]=node['hostname']
-
-        interfaces = GetInterfaces(slice["planetstack_name"], node_ids)
-        hostipmap = {}
-        for interface in interfaces:
-            if nodemap[interface['node_id']] not in allinterfaces:
-                allinterfaces[nodemap[interface['node_id']]] = []
-            interface['interface_tags'] = []
-            allinterfaces[nodemap[interface['node_id']]].append(interface)
-            if interface['is_primary']:
-                hostipmap[nodemap[interface['node_id']]] = interface['ip']
-
-        hostnatmap = {}
-        interfaces = GetInterfaces(slice["planetstack_name"], node_ids, return_nat=True)
-        for interface in interfaces:
-            interface['interface_tags'] = []
-            hostnatmap[nodemap[interface['node_id']]] = interface['ip']
-
-        hostprivmap = {}
-        interfaces = GetInterfaces(slice["planetstack_name"], node_ids, return_private=True)
-        for interface in interfaces:
-            interface['interface_tags'] = []
-            hostprivmap[nodemap[interface['node_id']]] = interface['ip']
-
-        for nid in node_ids:
-            instance_tags = GetTags(slicename,nid)
-            perhost[nodemap[nid]] = instance_tags
-
-    instances = GetSlices(slice_remap=slice_remap)
-    if node_id != 0:
-        instances = [slice for slice in instances if (node_id in slice.node_ids)]
-
-    sites = GetSites(slice_remap=slice_remap)
-    for site in sites:
-        site["site_tags"] = []
-
-    timestamp = int(time.time())
-    return {'version': 3,
-            'timestamp': timestamp,
-            'configuration': node_instance_tags,
-            'allconfigurations':perhost,
-            'hostipmap':hostipmap,
-            'hostnatmap':hostnatmap,
-            'hostprivmap':hostprivmap,
-            'slivers': instances,
-            'interfaces': allinterfaces,
-            'sites': sites,
-            'nodes': nodes}
-
-DEFAULT_REMAP = {"princeton_vcoblitz2": ["princeton_vcoblitz", 70]}
-
-def HandleGetConfiguration1():
-    configs={}
-    for slicename in ["princeton_vcoblitz"]:
-        configs[slicename] = GetConfiguration({"name": slicename}, DEFAULT_REMAP)
-    return configs
-
-def HandleGetNodes1():
-    return GetNodes(slice_remap=DEFAULT_REMAP)
-
-def HandleGetSlices1():
-    return GetSlices(slice_remap=DEFAULT_REMAP)
-
-def HandleGetConfiguration2(name, slice_remap):
-    return GetConfiguration(name, slice_remap=slice_remap)
-
-def HandleGetNodes2(slice_remap):
-    return GetNodes(slice_remap=slice_remap)
-
-def HandleGetSlices2(slice_remap):
-    return GetSlices(slice_remap=slice_remap)
-
-FUNCS = {"GetConfiguration": HandleGetConfiguration1,
-         "GetNodes": HandleGetNodes1,
-         "GetSlices": HandleGetSlices1,
-         "GetConfiguration2": HandleGetConfiguration2,
-         "GetNodes2": HandleGetNodes2,
-         "GetSlices2": HandleGetSlices2}
-
-@csrf_exempt
-def LegacyXMLRPC(request):
-    if request.method == "POST":
-        try:
-            (args, method) = xmlrpclib.loads(request.body)
-            result = None
-            if method in FUNCS:
-                result = FUNCS[method](*args)
-            return HttpResponse(xmlrpclib.dumps((result,), methodresponse=True, allow_none=1))
-        except:
-            traceback.print_exc()
-            return HttpResponseServerError()
-    else:
-        return HttpResponse("Not Implemented")
-
-if __name__ == '__main__':
-    slices = GetSlices(slice_remap = DEFAULT_REMAP)
-    nodes = GetNodes(slice_remap = DEFAULT_REMAP)
-
-    config = GetConfiguration({"name": "princeton_vcoblitz"}, slice_remap = DEFAULT_REMAP)
-    print config
-    print slices
-    print nodes
-
diff --git a/xos/core/xoslib/methods/hpcview.py b/xos/core/xoslib/methods/hpcview.py
deleted file mode 100644
index 199bc09..0000000
--- a/xos/core/xoslib/methods/hpcview.py
+++ /dev/null
@@ -1,219 +0,0 @@
-from rest_framework.decorators import api_view
-from rest_framework.response import Response
-from rest_framework.reverse import reverse
-from rest_framework import serializers
-from rest_framework import generics
-from rest_framework.views import APIView
-from core.models import *
-from services.hpc.models import *
-from services.requestrouter.models import *
-from django.forms import widgets
-from django.core.exceptions import PermissionDenied
-from django.contrib.contenttypes.models import ContentType
-import json
-import socket
-import time
-
-# This REST API endpoint contains a bunch of misc information that the
-# tenant view needs to display
-
-def get_service_slices(service):
-    try:
-        return service.slices.all()
-    except:
-        return service.service.all()
-
-def lookup_tag(service, instance, name, default=None):
-    instance_type = ContentType.objects.get_for_model(instance)
-    t = Tag.objects.filter(service=service, name=name, content_type__pk=instance_type.id, object_id=instance.id)
-    if t:
-        return t[0].value
-    else:
-        return default
-
-def lookup_time(service, instance, name):
-    v = lookup_tag(service, instance, name)
-    if v:
-        return str(time.time() - float(v))
-    else:
-        return None
-
-def json_default(d, default):
-    if not d:
-        return default
-    return json.loads(d)
-
-def compute_config_run(d):
-    if not d:
-        return "null"
-
-    try:
-        d = json.loads(d)
-    except:
-        return "error decoding json '%s'" % str(d)
-
-    status = d.get("status", "null")
-    if status!="success":
-        return status
-
-    config_run = d.get("config.run")
-    if not config_run:
-        return "null"
-
-    try:
-        config_run = max(0, int(time.time()) - int(float(config_run)))
-    except:
-        pass
-
-    return config_run
-
-# from hpc_watcher.py
-def get_public_ip(service, instance):
-    network_name = None
-    if "hpc" in instance.slice.name:
-        network_name = getattr(service, "watcher_hpc_network", None)
-    elif "demux" in instance.slice.name:
-        network_name = getattr(service, "watcher_dnsdemux_network", None)
-    elif "redir" in instance.slice.name:
-        network_name = getattr(service, "watcher_dnsredir_network", None)
-
-    if network_name and network_name.lower()=="nat":
-        return None
-
-    if (network_name is None) or (network_name=="") or (network_name.lower()=="public"):
-        return instance.get_public_ip()
-
-    for ns in instance.ports.all():
-        if (ns.ip) and (ns.network.name==network_name):
-            return ns.ip
-
-    raise ValueError("Couldn't find network %s" % str(network_name))
-
-def getHpcDict(user, pk):
-    hpc = HpcService.objects.get(pk=pk)
-    slices = get_service_slices(hpc)
-
-    dnsdemux_slice = None
-    dnsredir_slice = None
-    hpc_slice = None
-    for slice in slices:
-        if "dnsdemux" in slice.name:
-            dnsdemux_service = hpc
-            dnsdemux_slice = slice
-        if "dnsredir" in slice.name:
-            dnsredir_service = hpc
-            dnsredir_slice = slice
-        if "hpc" in slice.name:
-            hpc_service = hpc
-            hpc_slice = slice
-
-    if not dnsdemux_slice:
-        rr = RequestRouterService.objects.all()
-        if rr:
-            rr=rr[0]
-            slices = get_service_slices(rr)
-            for slice in slices:
-                if "dnsdemux" in slice.name:
-                    dnsdemux_service = rr
-                    dnsdemux_slice = slice
-                if "dnsredir" in slice.name:
-                    dnsredir_service = rr
-                    dnsredir_slice = slice
-
-    if not dnsredir_slice:
-        print "no dnsredir slice"
-        return
-
-    if not dnsdemux_slice:
-        print "no dnsdemux slice"
-        return
-
-    #dnsdemux_has_public_network = False
-    #for network in dnsdemux_slice.networks.all():
-    #    if (network.template) and (network.template.visibility=="public") and (network.template.translation=="none"):
-    #        dnsdemux_has_public_network = True
-
-    nameservers = {}
-    for nshc in hpc.hpchealthcheck_set.filter(kind="nameserver"):
-        nameserver = nshc.resource_name
-        try:
-            nameservers[nameserver] = {"name": nameserver, "ip": socket.gethostbyname(nameserver), "hit": False}
-        except:
-            nameservers[nameserver] = {"name": nameserver, "ip": "exception", "hit": False}
-
-    dnsdemux=[]
-    for instance in dnsdemux_slice.instances.all():
-        ip=None
-        try:
-            ip = get_public_ip(dnsdemux_service, instance)
-        except Exception, e:
-            ip = "Exception: " + str(e)
-        if not ip:
-            try:
-                ip = socket.gethostbyname(instance.node.name)
-            except:
-                ip = "??? " + instance.node.name
-
-        instance_nameservers = []
-        for ns in nameservers.values():
-            if ns["ip"]==ip:
-                instance_nameservers.append(ns["name"])
-                ns["hit"]=True
-
-        # now find the dnsredir instance that is also on this node
-        watcherd_dnsredir = "no-redir-instance"
-        for dnsredir_instance in dnsredir_slice.instances.all():
-            if dnsredir_instance.node == instance.node:
-                watcherd_dnsredir = lookup_tag(dnsredir_service, dnsredir_instance, "watcher.watcher.msg")
-
-        watcherd_dnsdemux = lookup_tag(dnsdemux_service, instance, "watcher.watcher.msg")
-
-        dnsdemux.append( {"name": instance.node.name,
-                       "watcher.DNS.msg": lookup_tag(dnsdemux_service, instance, "watcher.DNS.msg"),
-                       "watcher.DNS.time": lookup_time(dnsdemux_service, instance, "watcher.DNS.time"),
-                       "ip": ip,
-                       "nameservers": instance_nameservers,
-                       "dnsdemux_config_age": compute_config_run(watcherd_dnsdemux),
-                       "dnsredir_config_age": compute_config_run(watcherd_dnsredir) })
-
-    hpc=[]
-    for instance in hpc_slice.instances.all():
-        watcherd_hpc = lookup_tag(hpc_service, instance, "watcher.watcher.msg")
-
-        hpc.append( {"name": instance.node.name,
-                     "watcher.HPC-hb.msg": lookup_tag(hpc_service, instance, "watcher.HPC-hb.msg"),
-                     "watcher.HPC-hb.time": lookup_time(hpc_service, instance, "watcher.HPC-hb.time"),
-                     "watcher.HPC-fetch.msg": lookup_tag(hpc_service, instance, "watcher.HPC-fetch.msg"),
-                     "watcher.HPC-fetch.time": lookup_time(hpc_service, instance, "watcher.HPC-fetch.time"),
-                     "watcher.HPC-fetch.urls": json_default(lookup_tag(hpc_service, instance, "watcher.HPC-fetch-urls.msg"), []),
-                     "config_age": compute_config_run(watcherd_hpc),
-
-        })
-
-    return { "id": pk,
-             "dnsdemux": dnsdemux,
-             "hpc": hpc,
-             "nameservers": nameservers,}
-
-
-class HpcList(APIView):
-    method_kind = "list"
-    method_name = "hpcview"
-
-    def get(self, request, format=None):
-        if (not request.user.is_authenticated()):
-            raise PermissionDenied("You must be authenticated in order to use this API")
-        results = []
-        for hpc in HpcService.objects.all():
-            results.append(getHpcDict(request.user, hpc.pk))
-        return Response( results )
-
-class HpcDetail(APIView):
-    method_kind = "detail"
-    method_name = "hpcview"
-
-    def get(self, request, format=None, pk=0):
-        if (not request.user.is_authenticated()):
-            raise PermissionDenied("You must be authenticated in order to use this API")
-        return Response( [getHpcDict(request.user, pk)] )
-
diff --git a/xos/services/hpc/__init__.py b/xos/services/hpc/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/xos/services/hpc/__init__.py
+++ /dev/null
diff --git a/xos/services/hpc/admin.py b/xos/services/hpc/admin.py
deleted file mode 100644
index 19f5190..0000000
--- a/xos/services/hpc/admin.py
+++ /dev/null
@@ -1,229 +0,0 @@
-from django.contrib import admin
-
-from services.hpc.models import *
-from django import forms
-from django.utils.safestring import mark_safe
-from django.contrib.auth.admin import UserAdmin
-from django.contrib.admin.widgets import FilteredSelectMultiple
-from django.contrib.auth.forms import ReadOnlyPasswordHashField
-from django.contrib.auth.signals import user_logged_in
-from django.utils import timezone
-from suit.widgets import LinkedSelect
-from core.admin import ServiceAppAdmin,SliceInline,ServiceAttrAsTabInline, ReadOnlyAwareAdmin, XOSTabularInline, SliderWidget, ServicePrivilegeInline
-from core.middleware import get_request
-
-from functools import update_wrapper
-from django.contrib.admin.views.main import ChangeList
-from django.core.urlresolvers import reverse, NoReverseMatch
-from django.contrib.admin.utils import quote
-
-from filteredadmin import FilteredChangeList, FilteredAdmin, FilteredInline
-
-class HpcServiceForm(forms.ModelForm):
-    scale = forms.IntegerField(widget = SliderWidget, required=False)
-
-    def __init__(self, *args, **kwargs):
-        super(HpcServiceForm, self).__init__(*args, **kwargs)
-        if ("instance" in kwargs) and (hasattr(kwargs["instance"], "scale")):
-            self.fields['scale'].initial = kwargs["instance"].scale
-
-    def save(self, *args, **kwargs):
-        if self.cleaned_data['scale']:
-             self.instance.scale = self.cleaned_data['scale']
-
-        return super(HpcServiceForm, self).save(*args, **kwargs)
-
-class HpcServiceAdmin(ReadOnlyAwareAdmin):
-    model = HpcService
-    verbose_name = "HPC Service"
-    verbose_name_plural = "HPC Service"
-    list_display = ("backend_status_icon", "name","enabled")
-    list_display_links = ('backend_status_icon', 'name', )
-    fieldsets = [(None, {'fields': ['backend_status_text', 'name','scale','enabled','versionNumber', 'description', "cmi_hostname", "hpc_port80", "watcher_hpc_network", "watcher_dnsredir_network", "watcher_dnsdemux_network"], 'classes':['suit-tab suit-tab-general']})]
-    readonly_fields = ('backend_status_text', )
-    inlines = [SliceInline,ServiceAttrAsTabInline,ServicePrivilegeInline]
-    form = HpcServiceForm
-
-    extracontext_registered_admins = True
-
-    user_readonly_fields = ["name", "enabled", "versionNumber", "description"]
-
-    suit_form_tabs =(('general', 'HPC Service Details'),
-        ('administration', 'Administration'),
-        ('tools', 'Tools'),
-        ('slices','Slices'),
-        ('serviceattrs','Additional Attributes'),
-                ('serviceprivileges','Privileges'),
-    )
-
-    suit_form_includes = (('hpcadmin.html', 'top', 'administration'),
-                          ('hpctools.html', 'top', 'tools') )
-
-    def url_for_model_changelist(self, request, model):
-       if not request.resolver_match.args:
-           return reverse('admin:%s_%s_changelist' % (model._meta.app_label, model._meta.model_name), current_app=model._meta.app_label)
-       else:
-           obj_id = request.resolver_match.args[0]
-           changelist_url = reverse('admin:%s_%s_filteredchangelist' % (model._meta.app_label, model._meta.model_name), args=(obj_id,), current_app=model._meta.app_label)
-           return changelist_url
-
-class HPCAdmin(FilteredAdmin):
-   # Change the application breadcrumb to point to an HPC Service if one is
-   # defined
-
-   custom_app_breadcrumb_name = "Hpc"
-   @property
-   def custom_app_breadcrumb_url(self):
-       services = HpcService.objects.all()
-       if len(services)==1:
-           return "/admin/hpc/hpcservice/%s/" % services[0].id
-       else:
-           return "/admin/hpc/hpcservice/"
-
-class CDNPrefixInline(FilteredInline):
-    model = CDNPrefix
-    extra = 0
-    suit_classes = 'suit-tab suit-tab-prefixes'
-    fields = ('backend_status_icon', 'cdn_prefix_id', 'prefix', 'defaultOriginServer', 'enabled')
-    readonly_fields = ('backend_status_icon', 'cdn_prefix_id',)
-
-class OriginServerInline(FilteredInline):
-    model = OriginServer
-    extra = 0
-    suit_classes = 'suit-tab suit-tab-origins'
-    fields = ('backend_status_icon', 'origin_server_id', 'url')
-    readonly_fields = ('backend_status_icon', 'origin_server_id')
-
-class ContentProviderInline(FilteredInline):
-    model = ContentProvider
-    extra = 0
-    suit_classes = 'suit-tab suit-tab-cps'
-    fields = ('backend_status_icon', 'content_provider_id', 'name', 'enabled')
-    readonly_fields = ('backend_status_icon', 'content_provider_id',)
-
-class OriginServerAdmin(HPCAdmin):
-    list_display = ('backend_status_icon', 'url','protocol','redirects','contentProvider','authenticated','enabled' )
-    list_display_links = ('backend_status_icon', 'url', )
-
-    fields = ('backend_status_text', 'url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description' )
-    readonly_fields = ('backend_status_text', 'origin_server_id',)
-    user_readonly_fields = ('url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description')
-
-class ContentProviderForm(forms.ModelForm):
-    users = forms.ModelMultipleChoiceField(
-        queryset=User.objects.all(),
-        required=False,
-        help_text="Select which users can manage this ContentProvider",
-        widget=FilteredSelectMultiple(
-            verbose_name=('Users'), is_stacked=False
-        )
-    )
-
-    class Meta:
-        model = ContentProvider
-        widgets = {
-            'serviceProvider' : LinkedSelect
-        }
-        fields = '__all__'
-
-    def __init__(self, *args, **kwargs):
-      request = kwargs.pop('request', None)
-      super(ContentProviderForm, self).__init__(*args, **kwargs)
-
-      if self.instance and self.instance.pk:
-        self.fields['users'].initial = self.instance.users.all()
-
-class ContentProviderAdmin(HPCAdmin):
-    form = ContentProviderForm
-    list_display = ('backend_status_icon', 'name','description','enabled' )
-    list_display_links = ('backend_status_icon', 'name', )
-    readonly_fields = ('backend_status_text', )
-    admin_readonly_fields = ('backend_status_text', )
-    cp_readonly_fields = ('backend_status_text', 'name', 'enabled', 'serviceProvider', 'users')
-    fieldsets = [ (None, {'fields': ['backend_status_text', 'name','enabled','description','serviceProvider','users'], 'classes':['suit-tab suit-tab-general']})]
-
-    inlines = [CDNPrefixInline, OriginServerInline]
-
-    user_readonly_fields = ('name','description','enabled','serviceProvider','users')
-
-    suit_form_tabs = (('general','Details'),('prefixes','CDN Prefixes'), ('origins','Origin Servers'))
-
-    def change_view(self,request, *args, **kwargs):
-        if request.user.is_admin:
-            self.readonly_fields = self.admin_readonly_fields
-        else:
-            self.readonly_fields = self.cp_readonly_fields
-
-        return super(ContentProviderAdmin, self).change_view(request, *args, **kwargs)
-
-    def has_add_permission(self, request):
-        return request.user.is_admin
-
-    def has_delete_permission(self, request, obj=None):
-        return request.user.is_admin
-
-class ServiceProviderAdmin(HPCAdmin):
-    list_display = ('backend_status_icon', 'name', 'description', 'enabled')
-    list_display_links = ('backend_status_icon', 'name', )
-    fieldsets = [
-        (None, {'fields': ['backend_status_text', 'name','description','enabled', 'hpcService'], 'classes':['suit-tab suit-tab-general']})]
-#, ('Content Providers', {'fields':['contentProviders'],'classes':['suit-tab suit-tab-cps']})]
-
-    readonly_fields = ('backend_status_text', )
-    user_readonly_fields = ('name', 'description', 'enabled')
-
-    suit_form_tabs = (('general','Details'),('cps','Content Providers'))
-    inlines = [ContentProviderInline]
-
-class CDNPrefixForm(forms.ModelForm):
-    class Meta:
-        widgets = {
-            'contentProvider' : LinkedSelect
-        }
-        fields = '__all__'
-
-class CDNPrefixAdmin(HPCAdmin):
-    form = CDNPrefixForm
-    list_display = ['backend_status_icon', 'prefix','contentProvider']
-    list_display_links = ('backend_status_icon', 'prefix', )
-    fields = ['backend_status_text', 'prefix', 'contentProvider', 'cdn_prefix_id', 'description', 'defaultOriginServer', 'enabled']
-    readonly_fields = ('backend_status_text', )
-    user_readonly_fields = ['prefix','contentProvider', "cdn_prefix_id", "description", "defaultOriginServer", "enabled"]
-
-class SiteMapAdmin(HPCAdmin):
-    model = SiteMap
-    verbose_name = "Site Map"
-    verbose_name_plural = "Site Map"
-    list_display = ("backend_status_icon", "name", "contentProvider", "serviceProvider")
-    list_display_links = ('backend_status_icon', 'name', )
-    fields = ['backend_status_text', 'name', 'hpcService', 'cdnPrefix', 'contentProvider', 'serviceProvider', 'map', 'map_id']
-    user_readonly_fields = ('backend_status_text', "name", "hpcService", "cdnPrefix", "contentProvider", "serviceProvider", "description", "map")
-    readonly_fields = ('backend_status_text', )
-
-class AccessMapAdmin(HPCAdmin):
-    model = AccessMap
-    verbose_name = "Access Map"
-    verbose_name_plural = "Access Map"
-    list_display = ("backend_status_icon", "name", "contentProvider")
-    list_display_links = ('backend_status_icon', 'name', )
-    user_readonly_fields = ('backend_status_text', "name", "contentProvider", "description", "map")
-    readonly_fields = ('backend_status_text', )
-
-class HpcHealthCheckAdmin(HPCAdmin):
-    model = HpcHealthCheck
-    verbose_name = "Health Check"
-    verbose_name = "Health Checks"
-    list_display = ["backend_status_icon", "resource_name", "kind"]
-    list_display_links = ["backend_status_icon", "resource_name"]
-    fields = ["backend_status_text", "hpcService", "resource_name", "kind", "result_contains", "result_min_size", "result_max_size"]
-    readonly_fields = ["backend_status_text",]
-
-admin.site.register(ServiceProvider, ServiceProviderAdmin)
-admin.site.register(ContentProvider, ContentProviderAdmin)
-admin.site.register(CDNPrefix, CDNPrefixAdmin)
-admin.site.register(OriginServer,OriginServerAdmin)
-admin.site.register(HpcService, HpcServiceAdmin)
-admin.site.register(SiteMap, SiteMapAdmin)
-admin.site.register(AccessMap, AccessMapAdmin)
-admin.site.register(HpcHealthCheck, HpcHealthCheckAdmin)
-
diff --git a/xos/services/hpc/filteredadmin.py b/xos/services/hpc/filteredadmin.py
deleted file mode 100644
index b677b54..0000000
--- a/xos/services/hpc/filteredadmin.py
+++ /dev/null
@@ -1,191 +0,0 @@
-from django.contrib import admin
-
-from django import forms
-from services.hpc.models import HpcService
-from core.admin import ServiceAppAdmin,SliceInline,ServiceAttrAsTabInline, ReadOnlyAwareAdmin, XOSTabularInline, SliderWidget, ServicePrivilegeInline
-from core.middleware import get_request
-
-from functools import update_wrapper
-from django.contrib.admin.views.main import ChangeList
-from django.core.urlresolvers import reverse, NoReverseMatch
-from django.contrib.admin.utils import quote
-
-import threading
-_thread_locals = threading.local()
-
-class FilteredChangeList(ChangeList):
-    """ A special ChangeList with a doctored url_for_result function that
-        points to the filteredchange view instead of the default change
-        view.
-    """
-
-    def __init__(self, request, *args, **kwargs):
-        self.service = getattr(request, "hpcService", None)
-        self.embedded = getattr(request, "embedded", False)
-        super(FilteredChangeList, self).__init__(request, *args, **kwargs)
-
-    def url_for_result(self, result):
-        if (self.service is None):
-             return super(FilteredChangeList, self).url_for_result(result)
-
-        pk = getattr(result, self.pk_attname)
-        if self.embedded:
-            return reverse('admin:%s_%s_embeddedfilteredchange' % (self.opts.app_label,
-                                                           self.opts.model_name),
-                           args=(quote(self.service.id), quote(pk),),
-                           current_app=self.model_admin.admin_site.name)
-
-        else:
-            return reverse('admin:%s_%s_filteredchange' % (self.opts.app_label,
-                                                           self.opts.model_name),
-                           args=(quote(self.service.id), quote(pk),),
-                           current_app=self.model_admin.admin_site.name)
-
-class FilteredAdmin(ReadOnlyAwareAdmin):
-   """
-      One approach to filtering the HPC Admin views by HPCService. Encode
-      the HPCService into the URL for the changelist view. Then we could do our
-      custom filtering in self.filtered_changelist_view.
-
-      To make this work, a few changes needed to be made to the change and
-      change_list templates.
-
-      1) "custom_changelist_breadcrumb_url" is used to replace the breadcrumb
-         in change and add views with one that will point back to the filtered
-         list.
-
-      2) "custom_add_url" is used to replace the Add button's URL with one
-         that points to the filtered add view.
-
-      TODO: Save & Add Another,
-            the add link when the changelist is empty
-   """
-
-   @property
-   def change_list_template(self):
-       return _thread_locals.change_list_template
-
-   @property
-   def change_form_template(self):
-       return _thread_locals.change_form_template
-
-   def get_urls(self):
-       from django.conf.urls import patterns, url
-
-       def wrap(view):
-            def wrapper(*args, **kwargs):
-                return self.admin_site.admin_view(view)(*args, **kwargs)
-            return update_wrapper(wrapper, view)
-
-       urls = super(FilteredAdmin, self).get_urls()
-       info = self.model._meta.app_label, self.model._meta.model_name
-       my_urls = [
-           url(r'^(.+)/filteredlist/$', wrap(self.filtered_changelist_view), name="%s_%s_filteredchangelist" % info),
-           url(r'^(.+)/embeddedfilteredlist/$', wrap(self.embedded_filtered_changelist_view), name="%s_%s_embeddedfilteredchangelist" % info),
-           url(r'^(.+)/(.+)/filteredchange$', wrap(self.filtered_change_view), name='%s_%s_filteredchange' % info),
-           url(r'^(.+)/(.+)/embeddedfilteredchange$', wrap(self.embedded_filtered_change_view), name='%s_%s_embeddedfilteredchange' % info),
-           url(r'^(.+)/filteredadd/$', wrap(self.filtered_add_view), name='%s_%s_filteredadd' % info),
-           url(r'^(.+)/embeddedfilteredadd/$', wrap(self.embedded_filtered_add_view), name='%s_%s_embeddedfilteredadd' % info),
-       ]
-       return my_urls + urls
-
-   def add_extra_context(self, request, extra_context):
-       super(FilteredAdmin, self).add_extra_context(request, extra_context)
-
-       if getattr(request,"hpcService",None) is not None:
-            extra_context["custom_changelist_breadcrumb_url"] = "/admin/hpc/%s/%s/filteredlist/" % (self.model._meta.model_name, str(request.hpcService.id))
-            if getattr(request,"embedded",False):
-                extra_context["custom_add_url"] = "/admin/hpc/%s/%s/embeddedfilteredadd/" % (self.model._meta.model_name, str(request.hpcService.id))
-            else:
-                extra_context["custom_add_url"] = "/admin/hpc/%s/%s/filteredadd/" % (self.model._meta.model_name, str(request.hpcService.id))
-                if len(request.resolver_match.args)>1:
-                    # this is only useful on change views, not changelist views
-                    extra_context["custom_delete_url"] = "/admin/hpc/%s/%s/delete/" % (self.model._meta.model_name, request.resolver_match.args[1])
-
-       extra_context["show_save"] = False
-       extra_context["show_save_and_add_another"] = False
-
-   def changelist_view(self, *args, **kwargs):
-       if "template" in kwargs:
-           _thread_locals.change_list_template = kwargs["template"]
-           del kwargs["template"]
-       else:
-           _thread_locals.change_list_template = "admin/change_list_bc.html"
-       return super(FilteredAdmin, self).changelist_view(*args, **kwargs)
-
-   def filtered_changelist_view(self, request, hpcServiceId, extra_context=None):
-       request.hpcService = HpcService.objects.get(id=hpcServiceId)
-       return self.changelist_view(request, extra_context=extra_context)
-
-   def embedded_filtered_changelist_view(self, request, hpcServiceId, extra_context=None):
-       request.hpcService = HpcService.objects.get(id=hpcServiceId)
-       request.embedded = True
-       return self.changelist_view(request, template="admin/change_list_embedded.html", extra_context=extra_context)
-
-   def change_view(self, *args, **kwargs):
-       if "template" in kwargs:
-           _thread_locals.change_form_template = kwargs["template"]
-           del kwargs["template"]
-       else:
-           _thread_locals.change_form_template = "admin/change_form_bc.html"
-       return super(FilteredAdmin, self).change_view(*args, **kwargs)
-
-   def filtered_change_view(self, request, hpcServiceId, object_id, extra_context=None):
-       request.hpcService = HpcService.objects.get(id=hpcServiceId)
-       return self.change_view(request, object_id, extra_context=extra_context)
-
-   def embedded_filtered_change_view(self, request, hpcServiceId, object_id, extra_context=None):
-       request.hpcService = HpcService.objects.get(id=hpcServiceId)
-       request.embedded = True
-       return self.change_view(request, object_id, template="admin/change_form_embedded.html", extra_context=extra_context)
-
-   def add_view(self, *args, **kwargs):
-       if "template" in kwargs:
-           _thread_locals.change_form_template = kwargs["template"]
-           del kwargs["template"]
-       else:
-           _thread_locals.change_form_template = "admin/change_form_bc.html"
-       return super(FilteredAdmin, self).add_view(*args, **kwargs)
-
-   def filtered_add_view(self, request, hpcServiceId, extra_context=None):
-       request.hpcService = HpcService.objects.get(id=hpcServiceId)
-       return self.add_view(request, extra_context=extra_context)
-
-   def embedded_filtered_add_view(self, request, hpcServiceId, extra_context=None):
-       request.hpcService = HpcService.objects.get(id=hpcServiceId)
-       request.embedded = True
-       return self.add_view(request, template="admin/change_form_embedded.html", extra_context=extra_context)
-
-   def get_queryset(self, request):
-       # request.hpcService will be set in filtered_changelist_view so we can
-       # use it to filter what will be displayed in the list.
-       qs = self.model.objects.all()
-       if (getattr(request,"hpcService",None) is not None) and (hasattr(self.model, "filter_by_hpcService")):
-           qs = self.model.filter_by_hpcService(qs, request.hpcService)
-       return qs
-
-   def get_changelist(self, request, **kwargs):
-       # We implement a custom ChangeList, so the URLs point to the
-       # filtered_change_view rather than the default change_view.
-       return FilteredChangeList
-
-class FilteredInline(XOSTabularInline):
-   def get_change_url(self, id):
-       request = get_request()
-       embedded = getattr(request, "embedded", False)
-       service_id = request.resolver_match.args[0]
-
-       if embedded:
-           reverse_path = "admin:%s_embeddedfilteredchange" % (self.selflink_model._meta.db_table)
-           args = (service_id, id)
-       else:
-           reverse_path = "admin:%s_filteredchange" % (self.selflink_model._meta.db_table)
-           args = (service_id, id)
-
-       try:
-           url = reverse(reverse_path, args=args, current_app=self.selflink_model._meta.app_label)
-       except NoReverseMatch:
-           return None
-
-       return url
-
diff --git a/xos/services/hpc/migrations/__init__.py b/xos/services/hpc/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/xos/services/hpc/migrations/__init__.py
+++ /dev/null
diff --git a/xos/services/hpc/models.py b/xos/services/hpc/models.py
deleted file mode 100644
index e49bf4e..0000000
--- a/xos/services/hpc/models.py
+++ /dev/null
@@ -1,229 +0,0 @@
-from django.db import models
-from core.models import User, Service, SingletonModel, PlCoreBase
-from core.models.plcorebase import StrippedCharField
-import os
-from django.db import models
-from django.forms.models import model_to_dict
-from django.db.models import Q
-
-
-# Create your models here.
-
-class HpcService(Service):
-
-    class Meta:
-        app_label = "hpc"
-        verbose_name = "HPC Service"
-
-    cmi_hostname = StrippedCharField(max_length=254, null=True, blank=True)
-
-    hpc_port80 = models.BooleanField(default=True, help_text="Enable port 80 for HPC")
-    watcher_hpc_network = StrippedCharField(max_length=254, null=True, blank=True, help_text="Network for hpc_watcher to contact hpc instance")
-    watcher_dnsdemux_network = StrippedCharField(max_length=254, null=True, blank=True, help_text="Network for hpc_watcher to contact dnsdemux instance")
-    watcher_dnsredir_network = StrippedCharField(max_length=254, null=True, blank=True, help_text="Network for hpc_watcher to contact dnsredir instance")
-
-    @property
-    def scale(self):
-        hpc_slices = [x for x in self.slices.all() if "hpc" in x.name]
-        if not hpc_slices:
-            return 0
-        return hpc_slices[0].instances.count()
-
-    @scale.setter
-    def scale(self, value):
-        self.set_scale = value
-
-    def save(self, *args, **kwargs):
-        super(HpcService, self).save(*args, **kwargs)
-
-        # scale up/down
-        scale = getattr(self, "set_scale", None)
-        if scale is not None:
-            exclude_slices = [x for x in self.slices.all() if "cmi" in x.name]
-            self.adjust_scale(slice_hint="hpc", scale=scale, exclusive_slices = exclude_slices, max_per_node=1)
-
-class ServiceProvider(PlCoreBase):
-    class Meta:
-        app_label = "hpc"
-
-    hpcService = models.ForeignKey(HpcService)
-    service_provider_id = models.IntegerField(null=True, blank=True)
-    name = models.CharField(max_length=254,help_text="Service Provider Name")
-    description = models.TextField(max_length=254,null=True, blank=True, help_text="Description of Service Provider")
-    enabled = models.BooleanField(default=True)
-
-    def __unicode__(self):  return u'%s' % (self.name)
-
-    @classmethod
-    def filter_by_hpcService(cls, qs, hpcService):
-        # This should be overridden by descendant classes that want to perform
-        # filtering of visible objects by user.
-        return qs.filter(hpcService=hpcService)
-
-class ContentProvider(PlCoreBase):
-    class Meta:
-        app_label = "hpc"
-
-    # legacy vicci content providers already have names.
-    CP_TO_ACCOUNT = {"ON.LAB": "onlabcp",
-                     "Syndicate": "syndicatecp"}
-
-    content_provider_id = models.IntegerField(null=True, blank=True)
-    name = models.CharField(max_length=254)
-    enabled = models.BooleanField(default=True)
-    description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Content Provider")
-    serviceProvider = models.ForeignKey(ServiceProvider)
-
-    # Note user relationships are directed not requiring a role.
-    users = models.ManyToManyField(User)
-
-    def __unicode__(self):  return u'%s' % (self.name)
-
-    @property
-    def account(self):
-        return self.CP_TO_ACCOUNT.get(self.name, self.name)
-
-    @classmethod
-    def filter_by_hpcService(cls, qs, hpcService):
-        # This should be overridden by descendant classes that want to perform
-        # filtering of visible objects by user.
-        return qs.filter(serviceProvider__hpcService=hpcService)
-
-    def can_update(self, user):
-        if super(ContentProvider, self).can_update(user):
-            return True
-
-        if user in self.users.all():
-            return True
-
-        return False
-
-class OriginServer(PlCoreBase):
-    class Meta:
-        app_label = "hpc"
-
-    origin_server_id = models.IntegerField(null=True, blank=True)
-    url = models.CharField(max_length=1024)
-    contentProvider = models.ForeignKey(ContentProvider)
-
-    authenticated = models.BooleanField(default=False, help_text="Status for this Site")
-    enabled = models.BooleanField(default=True, help_text="Status for this Site")
-    PROTOCOL_CHOICES = (('http', 'HTTP'),('rtmp', 'RTMP'), ('rtp', 'RTP'),('shout', 'SHOUTcast')) 
-    protocol = models.CharField(default="HTTP", max_length = 12, choices=PROTOCOL_CHOICES)
-    redirects = models.BooleanField(default=True, help_text="Indicates whether Origin Server redirects should be used for this Origin Server")
-    description = models.TextField(null=True, blank=True, max_length=255)
-    
-    def __unicode__(self):  return u'%s' % (self.url)
-
-    @classmethod
-    def filter_by_hpcService(cls, qs, hpcService):
-        # This should be overridden by descendant classes that want to perform
-        # filtering of visible objects by user.
-        return qs.filter(contentProvider__serviceProvider__hpcService=hpcService)
-
-    def can_update(self, user):
-        if super(OriginServer, self).can_update(user):
-            return True
-
-        if self.contentProvider and self.contentProvider.can_update(user):
-            return True
-
-        return False
-
-class CDNPrefix(PlCoreBase):
-    class Meta:
-        app_label = "hpc"
-
-    cdn_prefix_id = models.IntegerField(null=True, blank=True)
-    prefix = models.CharField(max_length=200, help_text="Registered Prefix for Domain")
-    contentProvider = models.ForeignKey(ContentProvider)
-    description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Content Provider")
-
-    defaultOriginServer = models.ForeignKey(OriginServer, blank=True, null=True)
-    enabled = models.BooleanField(default=True)
-
-    def __unicode__(self):  return u'%s' % (self.prefix)
-
-    @classmethod
-    def filter_by_hpcService(cls, qs, hpcService):
-        # This should be overridden by descendant classes that want to perform
-        # filtering of visible objects by user.
-        return qs.filter(contentProvider__serviceProvider__hpcService=hpcService)
-
-    def can_update(self, user):
-        if super(CDNPrefix, self).can_update(user):
-            return True
-
-        if self.contentProvider and self.contentProvider.can_update(user):
-            return True
-
-        return False
-
-class AccessMap(PlCoreBase):
-    class Meta:
-        app_label = "hpc"
-
-    contentProvider = models.ForeignKey(ContentProvider)
-    name = models.CharField(max_length=64, help_text="Name of the Access Map")
-    description = models.TextField(null=True, blank=True,max_length=130)
-    map = models.FileField(upload_to="maps/", help_text="specifies which client requests are allowed")
-
-    def __unicode__(self):  return self.name
-
-class SiteMap(PlCoreBase):
-    class Meta:
-        app_label = "hpc"
-
-    """ can be bound to a ContentProvider, ServiceProvider, or neither """
-    contentProvider = models.ForeignKey(ContentProvider, blank=True, null=True)
-    serviceProvider = models.ForeignKey(ServiceProvider, blank=True, null=True)
-    cdnPrefix = models.ForeignKey(CDNPrefix, blank = True, null=True)
-    hpcService = models.ForeignKey(HpcService, blank = True, null=True)
-    name = models.CharField(max_length=64, help_text="Name of the Site Map")
-    description = models.TextField(null=True, blank=True,max_length=130)
-    map = models.FileField(upload_to="maps/", help_text="specifies how to map requests to hpc instances")
-    map_id = models.IntegerField(null=True, blank=True)
-
-    def __unicode__(self):  return self.name
-
-    def save(self, *args, **kwds):
-        if (self.contentProvider) and (self.serviceProvider or self.cdnPrefix or self.hpcService):
-            raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
-        if (self.serviceProvider) and (self.cdnPrefix or self.hpcService):
-            raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
-        if (self.cdnPrefix) and (self.hpcService):
-            raise ValueError("You may only set one of contentProvider, serviceProvider, cdnPrefix, or hpcService")
-
-        super(SiteMap, self).save(*args, **kwds)
-
-    @classmethod
-    def filter_by_hpcService(cls, qs, hpcService):
-        # This should be overridden by descendant classes that want to perform
-        # filtering of visible objects by user.
-        return qs.filter(Q(hpcService=hpcService) |
-                                  Q(serviceProvider__hpcService=hpcService) |
-                                  Q(contentProvider__serviceProvider__hpcService=hpcService) |
-                                  Q(cdnPrefix__contentProvider__serviceProvider__hpcService=hpcService))
-
-class HpcHealthCheck(PlCoreBase):
-    class Meta:
-        app_label = "hpc"
-
-    KIND_CHOICES = (('dns', 'DNS'), ('http', 'HTTP'), ('nameserver', 'Name Server'))
-
-    hpcService = models.ForeignKey(HpcService, blank = True, null=True)
-    kind = models.CharField(max_length=30, choices=KIND_CHOICES, default="dns")
-    resource_name = StrippedCharField(max_length=1024, blank=False, null=False)
-    result_contains = StrippedCharField(max_length=1024, blank=True, null=True)
-    result_min_size = models.IntegerField(null=True, blank=True)
-    result_max_size = models.IntegerField(null=True, blank=True)
-
-    def __unicode__(self): return self.resource_name
-
-    @classmethod
-    def filter_by_hpcService(cls, qs, hpcService):
-        # This should be overridden by descendant classes that want to perform
-        # filtering of visible objects by user.
-        return qs.filter(hpcService=hpcService)
-
-
diff --git a/xos/services/hpc/templates/hpcadmin.html b/xos/services/hpc/templates/hpcadmin.html
deleted file mode 100644
index 5c05020..0000000
--- a/xos/services/hpc/templates/hpcadmin.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<div class = "left-nav">
-<ul>
-{% for admin in registered_admins %}
-    <li><a href="{{ admin.url }}">{{ admin.name }}</a></li>
-{% endfor %}
-</ul>
-</div>
-
-<!--
-<ul>
-<li><a href="/admin/hpc/originserver/">Origin Servers</a></li>
-<li><a href="/admin/hpc/contentprovider/">Content Providers</a></li>
-<li><a href="/admin/hpc/serviceprovider/">Server Providers</a></li>
-<li><a href="/admin/hpc/cdnprefix/">CDN Prefixes</a></li>
-<li><a href="/admin/hpc/sitemap/">Site Maps</a></li>
-<li><a href="/admin/hpc/accessmap/">Access Maps</a></li>
-</ul>
--->
diff --git a/xos/services/hpc/templates/hpctools.html b/xos/services/hpc/templates/hpctools.html
deleted file mode 100644
index 28ab5c0..0000000
--- a/xos/services/hpc/templates/hpctools.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<div class = "left-nav">
-
-<ul>
-<li><a href="/dashboard/xosHpc">Service Monitor</a></li>
-<li><a href="/dashboard/xosHpcUrls">HPC Node Drilldown</a></li>
-<li><a href="/dashboard/xosHpcNodes">HPC Url Drilldown</a></li>
-</ul>
-
-</div>
diff --git a/xos/services/hpc/tests.py b/xos/services/hpc/tests.py
deleted file mode 100644
index 501deb7..0000000
--- a/xos/services/hpc/tests.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-This file demonstrates writing tests using the unittest module. These will pass
-when you run "manage.py test".
-
-Replace this with more appropriate tests for your application.
-"""
-
-from django.test import TestCase
-
-
-class SimpleTest(TestCase):
-    def test_basic_addition(self):
-        """
-        Tests that 1 + 1 always equals 2.
-        """
-        self.assertEqual(1 + 1, 2)
diff --git a/xos/services/hpc/views.py b/xos/services/hpc/views.py
deleted file mode 100644
index 60f00ef..0000000
--- a/xos/services/hpc/views.py
+++ /dev/null
@@ -1 +0,0 @@
-# Create your views here.
diff --git a/xos/tosca/resources/cdnprefix.py b/xos/tosca/resources/cdnprefix.py
deleted file mode 100644
index 8daf7fb..0000000
--- a/xos/tosca/resources/cdnprefix.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import os
-import pdb
-import sys
-import tempfile
-sys.path.append("/opt/tosca")
-from translator.toscalib.tosca_template import ToscaTemplate
-
-from services.hpc.models import CDNPrefix, ContentProvider
-
-from xosresource import XOSResource
-
-class XOSCDNPrefix(XOSResource):
-    provides = "tosca.nodes.CDNPrefix"
-    xos_model = CDNPrefix
-    name_field = "prefix"
-    copyin_props = []
-
-    def get_xos_args(self):
-        args = {"prefix": self.obj_name}
-
-        cp_name = self.get_requirement("tosca.relationships.MemberOfContentProvider")
-        if cp_name:
-            args["contentProvider"] = self.get_xos_object(ContentProvider, name=cp_name)
-
-        default_os = self.get_requirement("tosca.relationships.DefaultOriginServer")
-        if default_os:
-             args["defaultOriginServer"] = self.engine.name_to_xos_model(self.user, default_os)
-
-        return args
-
-    def can_delete(self, obj):
-        return super(XOSCDNPrefix, self).can_delete(obj)
-
diff --git a/xos/tosca/resources/cdnservice.py b/xos/tosca/resources/cdnservice.py
deleted file mode 100644
index 4082938..0000000
--- a/xos/tosca/resources/cdnservice.py
+++ /dev/null
@@ -1,16 +0,0 @@
-import os
-import pdb
-import sys
-import tempfile
-sys.path.append("/opt/tosca")
-from translator.toscalib.tosca_template import ToscaTemplate
-
-from services.hpc.models import HpcService
-
-from service import XOSService
-
-class XOSCdnService(XOSService):
-    provides = "tosca.nodes.CDNService"
-    xos_model = HpcService
-    copyin_props = ["view_url", "icon_url"]
-
diff --git a/xos/tosca/resources/contentprovider.py b/xos/tosca/resources/contentprovider.py
deleted file mode 100644
index 66742ea..0000000
--- a/xos/tosca/resources/contentprovider.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import os
-import pdb
-import sys
-import tempfile
-sys.path.append("/opt/tosca")
-from translator.toscalib.tosca_template import ToscaTemplate
-
-from services.hpc.models import ContentProvider, ServiceProvider
-
-from xosresource import XOSResource
-
-class XOSContentProvider(XOSResource):
-    provides = "tosca.nodes.ContentProvider"
-    xos_model = ContentProvider
-    copyin_props = []
-
-    def get_xos_args(self):
-        sp_name = self.get_requirement("tosca.relationships.MemberOfServiceProvider", throw_exception=True)
-        sp = self.get_xos_object(ServiceProvider, name=sp_name)
-        return {"name": self.obj_name,
-                "serviceProvider": sp}
-
-    def can_delete(self, obj):
-        if obj.cdnprefix_set.exists():
-            self.info("%s %s has active CDN prefixes; skipping delete" % (self.xos_model.__class__, obj.name))
-            return False
-        return super(XOSContentProvider, self).can_delete(obj)
-
diff --git a/xos/tosca/resources/hpchealthcheck.py b/xos/tosca/resources/hpchealthcheck.py
deleted file mode 100644
index 93a0912..0000000
--- a/xos/tosca/resources/hpchealthcheck.py
+++ /dev/null
@@ -1,39 +0,0 @@
-import importlib
-import os
-import pdb
-import sys
-import tempfile
-sys.path.append("/opt/tosca")
-from translator.toscalib.tosca_template import ToscaTemplate
-import pdb
-
-from services.hpc.models import HpcHealthCheck, HpcService
-
-from xosresource import XOSResource
-
-class XOSHpcHealthCheck(XOSResource):
-    provides = "tosca.nodes.HpcHealthCheck"
-    xos_model = HpcHealthCheck
-    name_field = None
-    copyin_props = ("kind", "resource_name", "result_contains")
-
-    def get_xos_args(self, throw_exception=True):
-        args = super(XOSHpcHealthCheck, self).get_xos_args()
-
-        service_name = self.get_requirement("tosca.relationships.MemberOfService", throw_exception=throw_exception)
-        if service_name:
-            args["hpcService"] = self.get_xos_object(HpcService, throw_exception=throw_exception, name=service_name)
-
-        return args
-
-    def get_existing_objs(self):
-        args = self.get_xos_args(throw_exception=True)
-
-        return list( HpcHealthCheck.objects.filter(hpcService=args["hpcService"], kind=args["kind"], resource_name=args["resource_name"]) )
-
-    def postprocess(self, obj):
-        pass
-
-    def can_delete(self, obj):
-        return super(XOSTenant, self).can_delete(obj)
-
diff --git a/xos/tosca/resources/originserver.py b/xos/tosca/resources/originserver.py
deleted file mode 100644
index 46cf87e..0000000
--- a/xos/tosca/resources/originserver.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import os
-import pdb
-import sys
-import tempfile
-sys.path.append("/opt/tosca")
-from translator.toscalib.tosca_template import ToscaTemplate
-
-from services.hpc.models import OriginServer, ContentProvider
-
-from xosresource import XOSResource
-
-class XOSOriginServer(XOSResource):
-    provides = "tosca.nodes.OriginServer"
-    xos_model = OriginServer
-    name_field = "url"
-    copyin_props = []
-
-    def obj_name_to_url(self):
-        url = self.obj_name
-        if url.startswith("http_"):
-            url = url[5:]
-        return url
-
-    def get_existing_objs(self):
-        url = self.obj_name_to_url()
-        return self.xos_model.objects.filter(**{self.name_field: url})
-
-    def get_xos_args(self):
-        url = self.obj_name_to_url()
-        cp_name = self.get_requirement("tosca.relationships.MemberOfContentProvider", throw_exception=True)
-        cp = self.get_xos_object(ContentProvider, name=cp_name)
-        return {"url": url,
-                "contentProvider": cp}
-
-    def can_delete(self, obj):
-        return super(XOSOriginServer, self).can_delete(obj)
-
diff --git a/xos/tosca/resources/serviceprovider.py b/xos/tosca/resources/serviceprovider.py
deleted file mode 100644
index 2c9a167..0000000
--- a/xos/tosca/resources/serviceprovider.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import os
-import pdb
-import sys
-import tempfile
-sys.path.append("/opt/tosca")
-from translator.toscalib.tosca_template import ToscaTemplate
-
-from services.hpc.models import ServiceProvider, HpcService
-
-from xosresource import XOSResource
-
-class XOSServiceProvider(XOSResource):
-    provides = "tosca.nodes.ServiceProvider"
-    xos_model = ServiceProvider
-    copyin_props = []
-
-    def get_xos_args(self):
-        hpc_service_name = self.get_requirement("tosca.relationships.MemberOfService", throw_exception=True)
-        hpc_service = self.get_xos_object(HpcService, name=hpc_service_name)
-        return {"name": self.obj_name,
-                "hpcService": hpc_service}
-
-    def can_delete(self, obj):
-        if obj.contentprovider_set.exists():
-            self.info("%s %s has active content providers; skipping delete" % (self.xos_model.__class__, obj.name))
-            return False
-        return super(XOSServiceProvider, self).can_delete(obj)
-
diff --git a/xos/xos/settings.py b/xos/xos/settings.py
index 8d17f08..6f82f71 100644
--- a/xos/xos/settings.py
+++ b/xos/xos/settings.py
@@ -181,7 +181,6 @@
     'rest_framework',
     'django_extensions',
     'core',
-    'services.hpc',
     'services.mcord',
     'services.requestrouter',
     'services.syndicate_storage',
diff --git a/xos/xos/urls.py b/xos/xos/urls.py
index 8cb6f34..9a2693e 100644
--- a/xos/xos/urls.py
+++ b/xos/xos/urls.py
@@ -6,9 +6,7 @@
 
 # This is the generated API
 from xosapi import *
-from hpcapi import *
 
-from core.views.legacyapi import LegacyXMLRPC
 from core.views.serviceGraph import ServiceGridView, ServiceGraphView
 from services.mcord.view import *
 # from core.views.analytics import AnalyticsAjaxView
@@ -67,7 +65,6 @@
     url(r'^serviceGrid', ServiceGridView.as_view(), name='serviceGrid'),
 
     url(r'^serviceGraph.png', ServiceGraphView.as_view(), name='serviceGraph'),
-    url(r'^hpcConfig', 'core.views.hpc_config.HpcConfig', name='hpcConfig'),
 
     # url(r'^docs/', include('rest_framework_swagger.urls')),
 
@@ -81,8 +78,6 @@
 
     # url(r'^admin/xoslib/(?P<name>\w+)/$', XOSLibDataView.as_view(), name="xoslib"),
 
-    url(r'^xmlrpc/legacyapi/$', 'core.views.legacyapi.LegacyXMLRPC', name='xmlrpc'),
-
     # url(r'^analytics/(?P<name>\w+)/$', AnalyticsAjaxView.as_view(), name="analytics"),
 
     url(r'^files/', redirect_to_apache),
@@ -95,4 +90,4 @@
 
     url(r'^', include('api.import_methods', namespace='api')),
 
-  ) + get_REST_patterns() + get_hpc_REST_patterns()
+  ) + get_REST_patterns()
