diff --git a/planetstack/core/dashboard/views/shell.py b/planetstack/core/dashboard/views/shell.py
index 7d23043..5efe239 100644
--- a/planetstack/core/dashboard/views/shell.py
+++ b/planetstack/core/dashboard/views/shell.py
@@ -15,18 +15,78 @@
         # datetime is not json serializable
         if isinstance(v, datetime.datetime):
             d2[k] = time.mktime(v.timetuple())
+        elif v.__class__.__name__ == "Geoposition":
+            pass
         else:
             d2[k] = v
     return d2
 
+def sliver_to_dict(sliver):
+    d = model_to_dict(sliver)
+    d["slice_id"] = sliver.slice.id
+    d["node_id"] = sliver.node.id
+    return d
+
+def slice_to_dict(slice):
+    d = model_to_dict(slice)
+    d["slivers"] = [sliver_to_dict(x) for x in slice.slivers]
+    return d
+
+def node_to_dict(node):
+    d = model_to_dict(node)
+    d["slivers"] = []
+
+
+class OpenCloudData:
+    def __init__(self, user):
+        self.loadAll()
+
+    def loadAll(self):
+        self.allNodes = list(Node.objects.all())
+        self.allSlices = list(Slice.objects.all())
+        self.allSlivers = list(Sliver.objects.all())
+        self.allSites = list(Site.objects.all())
+
+        self.site_id = {}
+        for site in self.allSites:
+            d = model_to_dict(site)
+            d["node_ids"] = []
+            d["slice_ids"] = []
+            self.site_id[site.id] = ensure_serializable(d)
+
+        self.node_id = {}
+        for node in self.allNodes:
+            d = model_to_dict(node)
+            d["sliver_ids"] = []
+            self.node_id[node.id] = ensure_serializable(d)
+            self.site_id[node.site_id]["node_ids"].append(node.id)
+
+        self.slice_id = {}
+        for slice in self.allSlices:
+            d = model_to_dict(slice)
+            d["sliver_ids"] = []
+            self.slice_id[slice.id] = ensure_serializable(d)
+            self.site_id[slice.site_id]["slice_ids"].append(site.id)
+
+        print self.slice_id.keys()
+
+        self.sliver_id = {}
+        for sliver in self.allSlivers:
+            self.sliver_id[sliver.id] = model_to_dict(sliver)
+
+            self.slice_id[sliver.slice_id]["sliver_ids"].append(sliver.id)
+            self.node_id[sliver.node_id]["sliver_ids"].append(sliver.id)
+
+    def get_opencloud_data(self):
+        return {"slices": self.slice_id.values(),
+                "slivers": self.sliver_id.values(),
+                "nodes": self.node_id.values(),
+                "sites": self.site_id.values()}
+
 class ShellDataView(View):
     url = r'^shelldata/'
 
     def get(self, request, **kwargs):
-        allSlices = []
-        for slice in Slice.objects.all():
-            allSlices.append(ensure_serializable(model_to_dict(slice)))
-
-        result = {"slices": allSlices}
+        result = OpenCloudData(request.user).get_opencloud_data()
 
         return HttpResponse(json.dumps(result), mimetype='application/json')
