diff --git a/src/python/.gitignore b/src/python/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f0c705a2289d77b10c653b6f26c401a4bc5d46fc
--- /dev/null
+++ b/src/python/.gitignore
@@ -0,0 +1,3 @@
+*~
+.*.sw?
+.ipynb_checkpoints/
diff --git a/src/python/ELNJupyter/elnjupyter/server.py b/src/python/ELNJupyter/elnjupyter/server.py
new file mode 100644
index 0000000000000000000000000000000000000000..640f3bae5c8b182d5439aa064f57e6474e223aca
--- /dev/null
+++ b/src/python/ELNJupyter/elnjupyter/server.py
@@ -0,0 +1,74 @@
+import tornado.web
+import tornado.ioloop
+import json
+import os
+import pwd
+import ssl
+from pybis import Openbis
+
+
+class CreateNotebook(tornado.web.RequestHandler):
+    def get(self, msg):
+        self.write(self.msg)
+
+    def post(self, whatever):
+        token = self.get_argument(name='token')
+        folder = self.get_argument(name='folder')
+        filename = self.get_argument(name='filename')
+        content = self.request.body
+
+
+        # check if token is still valid
+        if not self.openbis.is_token_valid(token):
+            self.send_error(401, message="token is invalid")
+            return
+
+        # extract username
+        username, code = token.split('-')
+
+        try:
+            user = pwd.getpwnam(username)
+        except KeyError:
+            self.send_error(401, message="User {} does not exist on host system".format(username))
+
+        notebook_file = os.path.join(
+            user.pw_dir, 
+            folder,
+            filename
+        )
+
+        # create necessary directories
+        os.makedirs(os.path.dirname(notebook_file), exist_ok=True)
+        with open(notebook_file, 'wb') as f:
+            f.write(content)
+        os.chown(notebook_file, user.pw_uid, user.pw_gid)
+        print(notebook_file)
+
+    def send_error(self, status_code=500, **kwargs):
+        self.set_status(status_code)
+        self.write(json.dumps(kwargs) )
+
+    def initialize(self, openbis):
+        self.openbis = openbis
+        self.set_header('Content-Type', 'application/json')
+
+def make_app(openbis):
+    """All the routing goes here...
+    """
+    app = tornado.web.Application([
+        (r"/(.*)", CreateNotebook, {"openbis": openbis})
+    ])
+    return app
+
+
+if __name__ == "__main__":
+    openbis = Openbis(url='https://localhost:8443', verify_certificates=False)
+    application = make_app(openbis)
+    application.listen(
+        8123,
+        ssl_options={
+            "certfile": "/Users/vermeul/tmp/cert.pem",
+            "keyfile": "/Users/vermeul/tmp/key.pem",
+        }
+    )
+    tornado.ioloop.IOLoop.current().start()
diff --git a/src/python/ELNJupyter/setup.py b/src/python/ELNJupyter/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..d47e43535d4fa51cabd1dc8fee4725a551fadf6f
--- /dev/null
+++ b/src/python/ELNJupyter/setup.py
@@ -0,0 +1,17 @@
+import os
+
+from setuptools import setup
+
+setup(name='elnjupyter',
+      version='0.1.0',
+      description='A webservice to create jupyter notebooks in the users home directory',
+      url='https://sissource.ethz.ch/sis/pybis/',
+      author='SIS | ID | ETH Zuerich',
+      author_email='swen@ethz.ch',
+      license='BSD',
+      packages=['pybis'],
+      install_requires=[
+          'tornado',
+          'ssl',
+      ],
+      zip_safe=True)