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 49ed48cea30b998d40c494676b7e2073d00b1c51..364e1570b3162a59073c5046a63efbd22c143a3d 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
     user: '0'
     volumes:
@@ -63,7 +63,7 @@ services:
     volumes:
       - ./data:/usr/src/drugstone/data
     env_file:
-      - './docker-django.env.dev'
+      - './docker-django.env'
     depends_on:
       - redis
       - db
@@ -78,7 +78,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/management/commands/createfixtures.py b/drugstone/management/commands/createfixtures.py
index 5fc990941bfce46b3f1571defb7a361c9c45a4eb..95a833027c988b6b4a32eb3b582bf2c4c43ba50d 100755
--- a/drugstone/management/commands/createfixtures.py
+++ b/drugstone/management/commands/createfixtures.py
@@ -22,6 +22,6 @@ class Command(BaseCommand):
         user.is_superuser = True
         user.is_staff = True
         user.save()
-
+        
         if created:
             print('created admin superuser')
diff --git a/drugstone/management/commands/import_from_nedrex.py b/drugstone/management/commands/import_from_nedrex.py
index f13aeb21226769539e2790dfe9b9686c77796dff..472bca8b1854f4e16d7d71d54e4088fbe7c1fdf3 100644
--- a/drugstone/management/commands/import_from_nedrex.py
+++ b/drugstone/management/commands/import_from_nedrex.py
@@ -122,7 +122,7 @@ class NedrexImporter:
                 protein.entrez = to_id(edge['targetDomainId'])
                 gene_to_prots[protein.entrez].add(id)
             except:
-                print(f"Edge was not mapped: {edge['sourceDomainId']}-{edge['targetDomainId']}")
+                print(f'Edge could not be saved: {edge["sourceDomainId"]} - {edge["targetDomainId"]}')
 
         def add_genes(node):
             id = to_id(node['primaryDomainId'])
diff --git a/drugstone/management/commands/populate_db.py b/drugstone/management/commands/populate_db.py
index 5bc37ed7e45baa944bfe1542aa0f9040c3fd4915..0c2ec7510bda16357ec082c0e15aa40d0bc82bdb 100755
--- a/drugstone/management/commands/populate_db.py
+++ b/drugstone/management/commands/populate_db.py
@@ -118,6 +118,7 @@ def populate(kwargs):
     total_n = 0
     nedrex_update = False
 
+
     if 'all' in kwargs and kwargs['all']:
         kwargs['drugs'] = True
         kwargs['disorders'] = True
diff --git a/drugstone/management/includes/DataPopulator.py b/drugstone/management/includes/DataPopulator.py
index 01715b4b7fd52ad7590de90f28e54e3f2ab44390..4a4a570b230ee4b7e1067dc1b7332049daec152d 100755
--- a/drugstone/management/includes/DataPopulator.py
+++ b/drugstone/management/includes/DataPopulator.py
@@ -22,6 +22,9 @@ class DataPopulator:
         bulk = set()
         uniq = set()
 
+        if update:
+            uniq = {hash(expr) for expr in models.ExpressionLevel.objects.all()}
+
         size = 0
         for _, row in df.iterrows():
             gene_name = row['Description']
diff --git a/drugstone/settings/celery_schedule.py b/drugstone/settings/celery_schedule.py
index 6c068944fe4b6bf516a180d5677b32c2ff0d7250..0e52106d458a271b2a3c889f6c6ea3b86d632bec 100644
--- a/drugstone/settings/celery_schedule.py
+++ b/drugstone/settings/celery_schedule.py
@@ -3,7 +3,7 @@ from celery.schedules import crontab
 CELERY_BEAT_SCHEDULE = {
     'update_db': {
         'task': 'drugstone.tasks.task_update_db_from_nedrex',
-        'schedule': crontab(day_of_week=2, hour=3, minute=0),
+        'schedule': crontab(day_of_week=1, hour=22, minute=0),
         # 'schedule': crontab(minute='*/1'),
     },
 }
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/tasks.py b/drugstone/tasks.py
index fd09e65ef21c0a321294f85d0389042855df90ab..2a7181dd7e5bfc2b447918a380afdf5dfdb27d5d 100644
--- a/drugstone/tasks.py
+++ b/drugstone/tasks.py
@@ -6,7 +6,6 @@ from drugstone.management.commands.populate_db import populate
 
 logger = get_task_logger(__name__)
 
-nedrex_api_url = "http://82.148.225.92:8123/"
 data_dir = "/usr/src/drugstone/data"
 
 
diff --git a/drugstone/urls.py b/drugstone/urls.py
index 680f18bf922ca024b4b952e7ba883faef65f1c33..eb547c75c0b82fa759778cc5820f1924e261a9e0 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_max_tissue_expression, convert_compact_ids, get_default_params, send_bugreport, save_selection, get_view, get_view_infos
 
 # cache time is 6 hours
 urlpatterns = [
@@ -40,5 +40,10 @@ urlpatterns = [
     path('admin/', admin.site.urls),
     path('create_network', create_network),
     path('load_network', load_network),
-    path('get_license', get_license)
+    path('get_default_params', get_default_params),
+    path('get_license', get_license),
+    path('send_bugreport/', send_bugreport),
+    path('save_selection', save_selection),
+    path('view/', get_view),
+    path('view_infos', get_view_infos)
 ]
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 45ff92405eaa2e2388aed9e92dfccbfc2d47d34b..e4cf1bb1a39f6546f4e7c50b13222db75f9a8fa7 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 *
@@ -59,7 +62,7 @@ class TaskView(APIView):
         token_str = ''.join(random.choice(chars) for _ in range(32))
         parameters = request.data['parameters']
         licenced = parameters.get('licenced', False)
-
+        algorithm = request.data['algorithm']
 
         # find databases based on parameter strings
         parameters['ppi_dataset'] = PPIDatasetSerializer().to_representation(
@@ -68,9 +71,14 @@ class TaskView(APIView):
         parameters['pdi_dataset'] = PDIDatasetSerializer().to_representation(
             get_pdi_ds(parameters.get('pdi_dataset', DEFAULTS['pdi']), licenced))
 
+        # if algorithm in ['connect', 'connectSelected', 'quick', 'super']:
+        #     parameters["num_trees"] = 5
+        #     parameters["tolerance"] = 5
+        #     parameters["hub_penalty"] = 0.5
+
         task = Task.objects.create(token=token_str,
                                    target=request.data['target'],
-                                   algorithm=request.data['algorithm'],
+                                   algorithm=algorithm,
                                    parameters=json.dumps(parameters))
         start_task(task)
         task.save()
@@ -100,6 +108,20 @@ def get_license(request) -> Response:
     return Response({'license': import_license()})
 
 
+@api_view(['GET'])
+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}
+    resp = {}
+    if algorithm in ['quick', 'super', 'connect', 'connectSelected']:
+        resp['protein'] = connect
+    if algorithm in ['quick', 'super']:
+        resp['drug'] = quick
+    return Response(resp)
+
+
 @api_view(['POST'])
 def fetch_edges(request) -> Response:
     """Retrieves interactions between nodes given as a list of drugstone IDs.
@@ -652,6 +674,58 @@ 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=json.dumps(config), nodes=json.dumps(network["nodes"]), edges=json.dumps(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': json.loads(network.config),
+        'created_at': network.created_at,
+        'network': {
+            'nodes': json.loads(network.nodes),
+            'edges': json.loads(network.edges),
+        }
+    })
+
+
+@api_view(['POST'])
+def get_view_infos(request) -> Response:
+    tokens = request.data.get('tokens')
+    networks = Network.objects.filter(id__in = tokens)
+    return Response([{
+        'token': n.id,
+        'created_at': n.created_at,
+    } for n in networks])
+
+
 @api_view(['GET'])
 def get_max_tissue_expression(request) -> Response:
     tissue = Tissue.objects.get(id=request.query_params.get('tissue'))