diff --git a/README.md b/README.md
index e9bcc25c13962ede2210be00889309c16a16626c..aae03bf42200727fc9cdb044a6c148b01867e4cf 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,19 @@ If you haven't done yet: download the latest jupyter-openbis-extension from pip.
 pip install --upgrade jupyter-openbis-extension
 ```
 
+or, if you would like to develop:
+
+```
+$ git clone git@sissource.ethz.ch:sispub/jupyter-openbis-extension.git
+$ cd jupyter-openbis-extension
+$ virtualenv venv
+$ source venv/bin/activate
+(venv) $ pip install -e .
+(venv) $ jupyter serverextension enable --py jupyter-openbis-extension
+(venv) $ jupyter nbextension install --py jupyter-openbis-extension --user --symlink
+(venv) $ jupyter nbextension enable jupyter-openbis-extension --user --py
+```
+
 **Register the Jupyter server extension** which will communicate both with openBIS and the notebook:
 
 ```
@@ -159,4 +172,4 @@ Known nbextensions:
     notebook section
       jupyter-openbis-extension/dialog  enabled 
       - Validating: OK
-```
\ No newline at end of file
+```
diff --git a/jupyter-openbis-extension/server.py b/jupyter-openbis-extension/server.py
index beccb3252d0e7b672813a35b9742c51e5d28fa6d..8c5fb7847e5163e223649e16222ea4c5429d91b9 100644
--- a/jupyter-openbis-extension/server.py
+++ b/jupyter-openbis-extension/server.py
@@ -2,7 +2,6 @@ from notebook.utils import url_path_join
 from notebook.base.handlers import IPythonHandler
 from pybis import Openbis
 import numpy as np
-
 import os
 from urllib.parse import unquote
 import yaml
@@ -31,8 +30,8 @@ def _load_configuration(paths, filename='openbis-connections.yaml'):
                     config = yaml.safe_load(stream)
                     for connection in config['connections']:
                         connections.append(connection)
-                except yaml.YAMLexception as exc:
-                    print(exc)
+                except yaml.YAMLexception as e:
+                    print(e)
                     return None
 
     return connections
@@ -473,9 +472,14 @@ class DataSetTypesHandler(IPythonHandler):
             # and add it to the dataset collection
             for dt in dts:
                 dataset_type = conn.openbis.get_dataset_type(dt['code'])
-                pa = dataset_type.get_propertyAssignments()
-                pa_dict = pa.to_dict(orient='records')
-                dt['propertyAssignments'] = pa_dict
+                pa = dataset_type.get_propertyAssignments(including_vocabulary=True)
+                pa_dicts = pa.to_dict(orient='records')
+                for pa_dict in pa_dicts:
+                    if pa_dict['dataType'] == 'CONTROLLEDVOCABULARY':
+                        terms = conn.openbis.get_terms(pa_dict['vocabulary']['code'])
+                        pa_dict['terms'] = terms.df[['code','label','description','official','ordinal']].to_dict(orient='records')
+
+                dt['propertyAssignments'] = pa_dicts
 
             self.write({
                 "dataSetTypes": dts
@@ -483,6 +487,7 @@ class DataSetTypesHandler(IPythonHandler):
             return
 
         except Exception as e:
+            print(e)
             self.set_status(500)
             self.write({
                 "reason":'Could not fetch dataset-types: {}'.format(e)
@@ -491,60 +496,112 @@ class DataSetTypesHandler(IPythonHandler):
 
 
 class DataSetUploadHandler(IPythonHandler):
-    """Handle the requests for /openbis/dataset/connection"""
+    """Handle the POST requests for /openbis/dataset/connection_name"""
 
     def upload_data(self, conn, data):
         if not conn.is_session_active():
             try:
                 conn.login()
-            except Exception as exc:
+            except Exception as e:
+                print(e)
+                self.set_status(500)
                 self.write({
-                    "reason": 'connection to {} could not be established: {}'.format(conn.name, exc)
+                    "reason": 'connection to {} could not be established: {}'.format(conn.name, e)
                 })
                 return
 
-        try:
-            sample = conn.openbis.get_sample(data.get('sampleIdentifier'))
-        except Exception as exc:
-            self.set_status(404)
-            self.write({
-                "reason" : 'No such sample: {}'.format(data.get('sampleIdentifier'))
-            })
-            return
+        errors = []
+
+        sample = None
+        experiment = None
+
+        if (data.get('sampleIdentifier')):
+            try:
+                sample = conn.openbis.get_sample(data.get('sampleIdentifier'))
+            except Exception as e:
+                print(e)
+                errors.append(
+                    {"sampleIdentifier" : 'No such sample: {}'.format(data.get('sampleIdentifier')) }
+                )
+        else:
+            errors.append(
+                {"sampleIdentifier": "please provide a sample identifier"}
+            )
+        print("--------------_HERE_-----------1")
+
+        if (data.get('experimentIdentifier')):
+            try:
+                experiment = conn.openbis.get_experiment(data.get('experimentIdentifier'))
+            except Exception as e:
+                print(e)
+                errors.append(
+                    {"experimentIdentifier" : 'No such experiment: {}'.format(data.get('experimentIdentifier')) }
+                )
+        print("--------------_HERE_-----------2")
 
         filenames = []
         for filename in data.get('files'):
             filename = unquote(filename)
-            filenames.append(filename)
+            if os.path.isfile(filename):
+                filenames.append(filename)
+            else:
+                errors.append({
+                    "file": "File not found: {}".format(filename)
+                })
+        print("--------------_HERE_-----------3")
 
-        try: 
-            ds = conn.openbis.new_dataset(
-#                name        = data.get('name'),
-#                description = data.get('description'),
-                type        = data.get('type'),
-                sample      = sample,
-                files       = filenames
-            ) 
-        except Exception as exc:
-            self.write({
-                "reason": 'Error while creating the dataset: {}'.format(exc)
+        try:
+            dataset = conn.openbis.new_dataset(
+                type   = data.get('type'),
+                sample = sample,
+                experiment = experiment,
+                files  = filenames,
+            )
+        except Exception as e:
+            print(e)
+            errors.append({
+                "create": 'Error while creating the dataset: {}'.format(e)
             })
+        print("--------------_HERE_-----------4")
+
+        # write errors back if already occured
+        if errors:
+            self.set_status(500)
+            self.write({ "errors": errors })
             return
+        print("--------------_HERE_-----------5")
+
+        # try to set the properties
+        if (data.get('props')):
+            props = data.et('props')
+            for prop, value in props.items():
+                try:
+                    setattr(dataset.props, prop, value)
+                except Exception as e:
+                    errors.append({
+                        "prop."+prop : e
+                    })
+        print("--------------_HERE_-----------6")
 
         try:
-            ds.save()
-        except Exception as exc:
+            dataset.save()
+        except Exception as e:
+            errors.append({
+                "save": 'Error while saving the dataset: {}'.format(e)
+            })
+        print("--------------_HERE_-----------7")
+
+        # write errors back if they occured
+        if errors:
+            self.set_status(500)
+            self.write({ "errors": errors })
+        else:
+            # ...or return a success message
             self.write({
-                "reason": 'Error while saving the dataset: {}'.format(exc)
+                'status': 200,
+                'statusText': 'Jupyter Notebook was successfully uploaded to: {} with permId: {}'.format(conn.name, dataset.permId)
             })
-            return
-        
-            
-        # return success message
-        self.write({
-            'status': 200,
-            'statusText': 'Jupyter Notebook was successfully uploaded to: {} with permId: {}'.format(conn.name, ds.permId)
-        })
+        print("--------------_HERE_-----------8")
 
     def post(self, **params):
         """Handle a request to /openbis/dataset/connection_name/permId
@@ -560,4 +617,6 @@ class DataSetUploadHandler(IPythonHandler):
             return
 
         data = self.get_json_body()
-        results = self.upload_data(conn=conn,data=data)
+        print("Received DATA")
+        print(data)
+        self.upload_data(conn=conn,data=data)
diff --git a/setup.py b/setup.py
index d3942628b5236082ccf3c9c14312236185e60736..5eb05d0e8fa2ed017d3c0c8b07134ecc7377537e 100644
--- a/setup.py
+++ b/setup.py
@@ -24,7 +24,7 @@ setup(
     install_requires=[
         'jupyter-nbextensions-configurator',
         'jupyter',
-        'pybis',
+        'pybis=>1.8.1',
     ],
     python_requires=">=3.3",
     classifiers=[