diff --git a/planetstack/core/xoslib/xoslib.py b/planetstack/core/xoslib/xoslib.py
new file mode 100644
index 0000000..53d8b28
--- /dev/null
+++ b/planetstack/core/xoslib/xoslib.py
@@ -0,0 +1,90 @@
+# /opt/planetstack/core/dashboard/views/helloworld.py
+import datetime
+import os
+import sys
+import time
+import json
+from django.http import HttpResponse, HttpResponseServerError, HttpResponseForbidden
+from django.views.generic import TemplateView, View
+from core.models import *
+from django.forms.models import model_to_dict
+
+def ensure_serializable(d):
+    d2={}
+    for (k,v) in d.items():
+        # 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)
+
+        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):
+        result = OpenCloudData(request.user).get_opencloud_data()
+
+        return HttpResponse(json.dumps(result), mimetype='application/json')
