diff --git a/.gitignore b/.gitignore
index eba7b164c2dfcb3290ff160e2ad49bead31fc2d2..af2b847af25782ddc7b99e033dee329464c2713a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@ celerybeat-schedule.dat
 celerybeat-schedule.dir
 docker-django.env.prodnetworks.zip
 data/Networks/
+docker-django.env
diff --git a/docker-compose.yml b/docker-compose.yml
index dbb61b5f643f8f4a8f2af40aee46057add3b0736..69a7920416aa6c1cdd20cf352b30f9b8bd969919 100755
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,7 +9,7 @@ services:
       - "scripts/docker-entrypoint.sh"
     build: .
     env_file:
-      - 'docker-django.env.dev'
+      - 'docker-django.env'
     restart: always
     volumes:
       - drugstone_db_schema_volume:/usr/src/drugstone/drugstone/migrations
@@ -62,7 +62,7 @@ services:
     volumes:
       - ./data:/usr/src/drugstone/data
     env_file:
-      - './docker-django.env.dev'
+      - './docker-django.env'
     depends_on:
       - redis
       - db
@@ -77,7 +77,7 @@ services:
     container_name: drugstone_celery_beat
     hostname: drugstone_celery_beat
     env_file:
-      - './docker-django.env.dev'
+      - './docker-django.env'
     depends_on:
       - redis
       - db
diff --git a/docker-django.env b/docker-django.env
deleted file mode 100755
index defd3e70b9c0efba92870547a9b16ef0e84aecc5..0000000000000000000000000000000000000000
--- a/docker-django.env
+++ /dev/null
@@ -1,16 +0,0 @@
-DEBUG=1
-SECRET_KEY="0&y9v0@9%@c^woz8m+h2(^$#3gd^c@d82kmmq8tu*nesc_x9i+"
-SUPERUSER_NAME=admin
-SUPERUSER_PASS=Mb2R7CbqAPbpaKawKg7Z
-SQL_ENGINE=django.db.backends.postgresql
-SQL_DATABASE=drugstone
-SQL_USER=drugstone
-SQL_PASSWORD=t6278yczAH7rPKVMxaDD
-SQL_HOST=drugstone_postgres
-SQL_PORT=5432
-REDIS_HOST=redis
-REDIS_PORT=6379
-GT_THREADS=16
-DJANGO_SETTINGS_MODULE=drugstone.settings
-CELERY_BROKER_URL=redis://redis:6379/0
-DB_UPDATE_ON_START=0
\ No newline at end of file
diff --git a/drugstone/settings/settings.py b/drugstone/settings/settings.py
index e274b939ad22c3d39a64578ad62306b5f8d7d686..7ac243950d59e330e63ccf4a4f6d5125e3666499 100755
--- a/drugstone/settings/settings.py
+++ b/drugstone/settings/settings.py
@@ -166,6 +166,14 @@ CACHES = {
     }
 }
 
+EMAIL_HOST = "exchange.uni-hamburg.de"
+EMAIL_PORT = 587
+EMAIL_HOST_USER="taa0368"
+EMAIL_ADDRESS = "tools-cosybio.zbh@uni-hamburg.de"
+EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD')
+EMAIL_USE_SSL = False
+EMAIL_USE_TLS = True
+
 CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL')
 # timezones: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
 CELERY_TIMEZONE = 'Europe/Berlin'
diff --git a/drugstone/urls.py b/drugstone/urls.py
index f3afb678504fb5f84487113c5c98145d3ba3a687..959a161b9e6ffb3a3b7cfb9feb05781c6f7850cf 100755
--- a/drugstone/urls.py
+++ b/drugstone/urls.py
@@ -19,7 +19,7 @@ from django.urls import path
 from drugstone.views import map_nodes, tasks_view, result_view, \
     graph_export, TissueView, TissueExpressionView, query_tissue_proteins, TaskView, \
     adjacent_drugs, adjacent_disorders, fetch_edges, create_network, load_network, get_license, get_datasets, \
-    get_max_tissue_expression, convert_compact_ids, get_default_params
+    get_max_tissue_expression, convert_compact_ids, get_default_params, send_bugreport, save_selection, get_view
 
 # cache time is 6 hours
 urlpatterns = [
@@ -41,5 +41,8 @@ urlpatterns = [
     path('create_network', create_network),
     path('load_network', load_network),
     path('get_default_params', get_default_params),
-    path('get_license', get_license)
+    path('get_license', get_license),
+    path('send_bugreport/', send_bugreport),
+    path('save_selection', save_selection),
+    path('view/', get_view)
 ]
diff --git a/drugstone/util/mailer.py b/drugstone/util/mailer.py
new file mode 100644
index 0000000000000000000000000000000000000000..c48b15d8c183df9c0a191c262dba438df634bfb6
--- /dev/null
+++ b/drugstone/util/mailer.py
@@ -0,0 +1,15 @@
+from django.core.mail import send_mail
+from drugstone.settings import settings
+
+default_sender = settings.EMAIL_ADDRESS
+
+
+def bugreport(title, body, cc=None):
+    if cc is None:
+        send(title, body)
+    else:
+        send(title=title, body=body, recipient=['contact@drugst.one', cc])
+
+
+def send(title, body, sender=default_sender, recipient=['contact@drugst.one'], fail_silently=False):
+    send_mail(title, body, sender, recipient, fail_silently=fail_silently)
diff --git a/drugstone/views.py b/drugstone/views.py
index 418ae06b0cd487d95fa15c5c39835e43c3719fb4..375c60258411a3f3b6a0c7b6b9683df9609d457a 100755
--- a/drugstone/views.py
+++ b/drugstone/views.py
@@ -12,9 +12,12 @@ import networkx as nx
 from django.http import HttpResponse
 from django.db.models import Q, Max
 from django.db import IntegrityError
+from rest_framework import status
 from rest_framework.decorators import api_view
 from rest_framework.response import Response
 from rest_framework.views import APIView
+
+from drugstone.util.mailer import bugreport
 from drugstone.util.query_db import query_proteins_by_identifier, clean_proteins_from_compact_notation
 
 from drugstone.models import *
@@ -109,7 +112,8 @@ def get_license(request) -> Response:
 def get_default_params(request) -> Response:
     algorithm = request.GET.get('algorithm')
     connect = {'algorithm': 'multisteiner', 'numTrees': 5, 'tolerance': 5, 'hubPenalty': 0.5}
-    quick = {'algorithm': 'closeness', 'result_size': 50, 'hub_penalty': 0, 'include_non_approved_drugs': False, 'include_indirect_drugs': False}
+    quick = {'algorithm': 'closeness', 'result_size': 50, 'hub_penalty': 0, 'include_non_approved_drugs': False,
+             'include_indirect_drugs': False}
     resp = {}
     if algorithm in ['quick', 'super', 'connect', 'connectSelected']:
         resp['protein'] = connect
@@ -670,6 +674,47 @@ def query_proteins(request) -> Response:
     })
 
 
+@api_view(['POST'])
+def send_bugreport(request) -> Response:
+    data = request.data
+    title = data.get("title")
+    body = data.get("body")
+    email = data.get("email", None)
+    if email and len(email) == 0:
+        email = None
+    if not title or not body:
+        return Response({"status": 400})
+
+    bugreport(title, body, email)
+    return Response({"status": 200})
+
+
+@api_view(['POST'])
+def save_selection(request) -> Response:
+    chars = string.ascii_lowercase + string.ascii_uppercase + string.digits
+    token_str = ''.join(random.choice(chars) for _ in range(32))
+
+    config = request.data.get("config")
+    network = request.data.get("network")
+
+    Network.objects.create(id=token_str, config=config, nodes=network["nodes"], edges=network["edges"])
+    return Response({
+        'token': token_str,
+    })
+
+@api_view(['GET'])
+def get_view(request) -> Response:
+    token = request.query_params.get('token')
+    network = Network.objects.get(id=token)
+    return Response({
+        'config': network.config,
+        'network': {
+            'nodes': network.nodes,
+            'edges': network.edges,
+        }
+    })
+
+
 @api_view(['GET'])
 def get_max_tissue_expression(request) -> Response:
     tissue = Tissue.objects.get(id=request.query_params.get('tissue'))