diff --git a/collector.py b/collector.py
new file mode 100644
index 0000000..4d5b71d
--- /dev/null
+++ b/collector.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python3
+
+import subprocess
+import json
+import re
+import time
+import threading
+import http.server
+import socketserver
+
+ALLOWED_IPS = [
+    '116.203.81.167',  # tools-vm-he-de
+]
+
+
+def gather_stats():
+   """Gathers stats via qshape"""
+    while True:
+        real_now = time.time()
+        now = real_now - (real_now % 300)
+        recipient_data = subprocess.check_output(
+            '/usr/sbin/qshape | /usr/bin/head -n 25',
+            shell=True,
+            stderr=subprocess.DEVNULL
+        ).decode('ascii')
+        sender_data = subprocess.check_output(
+            '/usr/sbin/qshape -s | /usr/bin/head -n 25',
+            shell=True,
+            stderr=subprocess.DEVNULL
+        ).decode('ascii')
+        recipients = {}
+        senders = {}
+        for match in re.finditer(r"^\s+([^\s.]+\.\S+)\s+(\d+)((\s+\d+)+)\n", recipient_data, re.MULTILINE):
+            domain = match.group(1)
+            pending = int(match.group(2))
+            times = [int(x) for x in match.group(3).split(' ') if x]
+            recipients[domain] = {
+                'pending': pending,
+                'times': times,
+            }
+        for match in re.finditer(r"^\s+([^\s.]+\.\S+)\s+(\d+)((\s+\d+)+)\n", sender_data, re.MULTILINE):
+            domain = match.group(1)
+            pending = int(match.group(2))
+            times = [int(x) for x in match.group(3).split(' ') if x]
+            senders[domain] = {
+                'pending': pending,
+                'times': times,
+            }
+
+        try:
+            file_json = json.loads(open('qshape.json', 'r').read())
+        except:
+            file_json = []
+        while len(file_json) > 288:
+            file_json.pop()
+        file_json.append({
+            'timestamp': int(now),
+            'recipients': recipients,
+            'senders': senders,
+        })
+        with open('qshape.json', 'w') as f:
+            json.dump(file_json, f, indent=2)
+            f.close()
+
+        then = time.time()
+        diff = then - real_now
+        print("Sleeping for %u seconds now.." % (300-diff))
+        time.sleep(300 - diff)
+
+
+class StatsHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
+    def do_GET(self):
+        if self.client_address[0] in ALLOWED_IPS:
+            print("%s is allowed, handing JSON.." % self.client_address[0])
+            self.path = './qshape.json'
+            return http.server.SimpleHTTPRequestHandler.do_GET(self)
+        else:
+            return None
+
+
+def main():
+    print("Starting stats collector")
+    gs = threading.Thread(target=gather_stats)
+    gs.start()
+    server = socketserver.ThreadingTCPServer(("0.0.0.0", 8083), StatsHttpRequestHandler)
+    print("Started json server at 8083...")
+    server.serve_forever()
+
+
+if __name__ == '__main__':
+    main()
