diff --git a/docker-compose.yml b/docker-compose.yml
index bb3045b5f7d1c84fb7c694d4943d759c5bd4b580..4e8688633619205a4b2cba1d6684d1a05feab2d7 100755
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -83,7 +83,7 @@ services:
       - db
     networks:
       - drugstone_net
-  flower:  
+  flower:
     image: mher/flower
     container_name: drugstone_flower
     env_file:
diff --git a/drugstone/settings/celery_schedule.py b/drugstone/settings/celery_schedule.py
index b066327c53c3c8f9beb7f969723311d538371221..83ee1d3cc6f2ff8192707e58814d705491f51758 100644
--- a/drugstone/settings/celery_schedule.py
+++ b/drugstone/settings/celery_schedule.py
@@ -3,6 +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=1, hour=5, minute=0),
+        'schedule': crontab(day_of_week=1, hour=6, minute=0),
+        # 'schedule': crontab(minute='*/1'),
     },
 }
diff --git a/drugstone/views.py b/drugstone/views.py
index 5a4025f87ef863e13ee986f2e508c491540022c7..5b66baf656c2070df5fc25a37b834bb63c446665 100755
--- a/drugstone/views.py
+++ b/drugstone/views.py
@@ -27,7 +27,6 @@ from drugstone.settings import DEFAULTS
 def get_ppi_ds(source, licenced):
     try:
         ds = models.PPIDataset.objects.filter(name__iexact=source, licenced=licenced).last()
-        ds.id
         return ds
     except:
         if licenced:
@@ -38,7 +37,6 @@ def get_ppi_ds(source, licenced):
 def get_pdi_ds(source, licenced):
     try:
         ds = models.PDIDataset.objects.filter(name__iexact=source, licenced=licenced).last()
-        ds.id
         return ds
     except:
         if licenced:
@@ -49,7 +47,6 @@ def get_pdi_ds(source, licenced):
 def get_pdis_ds(source, licenced):
     try:
         ds = models.PDisDataset.objects.filter(name__iexact=source, licenced=licenced).last()
-        ds.id
         return ds
     except:
         if licenced:
@@ -60,7 +57,6 @@ def get_pdis_ds(source, licenced):
 def get_drdis_ds(source, licenced):
     try:
         ds = models.DrDiDataset.objects.filter(name__iexact=source, licenced=licenced).last()
-        ds.id
         return ds
     except:
         if licenced:
@@ -76,6 +72,11 @@ class TaskView(APIView):
         parameters = request.data['parameters']
         licenced = parameters.get('licenced', False)
 
+        print(models.PDIDataset.objects.all())
+
+        print(get_ppi_ds(parameters.get('ppi_dataset', DEFAULTS['ppi']), licenced))
+        print(get_pdi_ds(parameters.get('pdi_dataset', DEFAULTS['pdi']), licenced))
+
         # find databases based on parameter strings
         parameters['ppi_dataset'] = PPIDatasetSerializer().to_representation(
             get_ppi_ds(parameters.get('ppi_dataset', DEFAULTS['ppi']), licenced))
@@ -660,60 +661,23 @@ class TissueExpressionView(APIView):
 
     def get(self, request) -> Response:
         tissue = Tissue.objects.get(id=request.query_params.get('tissue'))
-
-        if request.query_params.get('proteins'):
-            ids = json.loads(request.query_params.get('proteins'))
-            proteins = list(Protein.objects.filter(id__in=ids).all())
-        elif request.query_params.get('token'):
-            proteins = []
-            task = Task.objects.get(token=request.query_params['token'])
-            result = task_result(task)
-            network = result['network']
-            node_attributes = result.get('node_attributes')
-            if not node_attributes:
-                node_attributes = {}
-            node_types = node_attributes.get('node_types')
-            if not node_types:
-                node_types = {}
-            parameters = json.loads(task.parameters)
-            seeds = parameters['seeds']
-            nodes = network['nodes']
-            for node in nodes + seeds:
-                node_type = node_types.get(node)
-                details = None
-                if node_type == 'protein':
-                    if details:
-                        proteins.append(details)
-                    else:
-                        try:
-                            prot = Protein.objects.get(uniprot_code=node)
-                            if prot not in proteins:
-                                proteins.append(Protein.objects.get(uniprot_code=node))
-                        except Protein.DoesNotExist:
-                            pass
-
-        pt_expressions = {}
-
-        for protein in proteins:
-            try:
-                expression_level = ExpressionLevel.objects.get(protein=protein, tissue=tissue)
-                pt_expressions[
-                    ProteinSerializer().to_representation(protein)['drugstone_id']] = expression_level.expression_level
-            except ExpressionLevel.DoesNotExist:
-                pt_expressions[ProteinSerializer().to_representation(protein)['drugstone_id']] = None
-
-        return Response(pt_expressions)
-
+        proteins = request.query_params.get('proteins')
+        token = request.query_params.get('token')
+        return self.get_tissue_expression(tissue, proteins, token)
 
     def post(self, request) -> Response:
         tissue = Tissue.objects.get(id=request.data.get('tissue'))
+        proteins = request.data.get('proteins')
+        token = request.data.get('token')
+        return self.get_tissue_expression(tissue, proteins, token)
 
-        if request.data.get('proteins'):
-            ids = json.loads(request.data.get('proteins'))
+    def get_tissue_expression(self, tissue, proteins, token):
+        if proteins is not None:
+            ids = json.loads(proteins)
             proteins = list(Protein.objects.filter(id__in=ids).all())
-        elif request.data.get('token'):
+        elif token is not None:
             proteins = []
-            task = Task.objects.get(token=request.data['token'])
+            task = Task.objects.get(token=token)
             result = task_result(task)
             network = result['network']
             node_attributes = result.get('node_attributes')
diff --git a/scripts/docker-entrypoint.sh b/scripts/docker-entrypoint.sh
index db7a2d39ad5d4040b6dd34294c675ea20ae7b9bf..43bf32df3da5898d25d96f8abd734edf4872ea3c 100755
--- a/scripts/docker-entrypoint.sh
+++ b/scripts/docker-entrypoint.sh
@@ -4,7 +4,7 @@ python3 manage.py makemigrations drugstone
 python3 manage.py migrate
 python3 manage.py createfixtures
 python3 manage.py cleanuptasks
-#python3 manage.py populate_db --update -a
-#python3 manage.py make_graphs
+python3 manage.py populate_db --update -a
+python3 manage.py make_graphs
 
 /usr/bin/supervisord -c "/etc/supervisor/conf.d/supervisord.conf"
diff --git a/tasks/betweenness_centrality.py b/tasks/betweenness_centrality.py
index deba02742d9647ce1525a5944ad396b9608f5f7d..d4b9e212d46ec228c62be933eff34ecff9e3b031 100755
--- a/tasks/betweenness_centrality.py
+++ b/tasks/betweenness_centrality.py
@@ -1,3 +1,4 @@
+from tasks.util.custom_edges import add_edges
 from tasks.util.read_graph_tool_graph import read_graph_tool_graph
 from tasks.util.scores_to_results import scores_to_results
 from tasks.util.edge_weights import edge_weights
@@ -172,6 +173,8 @@ def betweenness_centrality(task_hook: TaskHook):
 
     id_space = task_hook.parameters["config"].get("identifier","symbol")
 
+    custom_edges = task_hook.parameters.get("custom_edges", False)
+
     # Parsing input file.
     task_hook.set_progress(0 / 3.0, "Parsing input.")
     filename = f"{id_space}_{ppi_dataset['name']}-{pdi_dataset['name']}"
@@ -187,6 +190,11 @@ def betweenness_centrality(task_hook: TaskHook):
         include_non_approved_drugs,
         target=search_target
     )
+
+    if custom_edges:
+      edges = task_hook.parameters.get("input_network")['edges']
+      g = add_edges(g, edges)
+
     weights = edge_weights(g, hub_penalty)
 
     # Set number of threads if OpenMP support is enabled.
diff --git a/tasks/closeness_centrality.py b/tasks/closeness_centrality.py
index 1c306ee3ec759a98e56d6832d1e909ffcfdd46dd..3dafc5143918d0efadf8b6e2da212cb847817895 100755
--- a/tasks/closeness_centrality.py
+++ b/tasks/closeness_centrality.py
@@ -1,4 +1,5 @@
 import numpy as np
+from tasks.util.custom_edges import add_edges
 from tasks.util.read_graph_tool_graph import read_graph_tool_graph
 from tasks.util.scores_to_results import scores_to_results
 from tasks.util.edge_weights import edge_weights
@@ -173,13 +174,18 @@ def closeness_centrality(task_hook: TaskHook):
 
     id_space = task_hook.parameters["config"].get("identifier", "symbol")
 
-    node_name_attribute = "internal_id"
+    custom_edges = task_hook.parameters.get("custom_edges", False)
 
     filename = f"{id_space}_{ppi_dataset['name']}-{pdi_dataset['name']}"
     if ppi_dataset['licenced'] or pdi_dataset['licenced']:
         filename += "_licenced"
     filename = os.path.join(task_hook.data_directory, filename + ".gt")
     g, seed_ids, drug_ids = read_graph_tool_graph(filename, seeds, id_space, max_deg, include_indirect_drugs, include_non_approved_drugs, search_target)
+    
+    if custom_edges:
+      edges = task_hook.parameters.get("input_network")['edges']
+      g = add_edges(g, edges)
+    
     task_hook.set_progress(1 / 4.0, "Computing edge weights.")
     weights = edge_weights(g, hub_penalty) 
     
diff --git a/tasks/degree_centrality.py b/tasks/degree_centrality.py
index e529c8a6a73b7c2882f4d5142ff3be864fd014ff..368b5a1659c5df8e551bc5af730af1481c162596 100755
--- a/tasks/degree_centrality.py
+++ b/tasks/degree_centrality.py
@@ -1,5 +1,6 @@
 from tasks.util.read_graph_tool_graph import read_graph_tool_graph
 from tasks.util.scores_to_results import scores_to_results
+from tasks.util.custom_edges import add_edges
 from tasks.task_hook import TaskHook
 import graph_tool as gt
 import os.path
@@ -147,6 +148,8 @@ def degree_centrality(task_hook: TaskHook):
     search_target = task_hook.parameters.get("target", "drug-target")
 
     filterPaths = task_hook.parameters.get("filter_paths", True)
+
+    custom_edges = task_hook.parameters.get("custom_edges", False)
     
     # Parsing input file.
     task_hook.set_progress(0 / 3.0, "Parsing input.")
@@ -160,6 +163,10 @@ def degree_centrality(task_hook: TaskHook):
     # g, seed_ids, viral_protein_ids, drug_ids = read_graph_tool_graph(file_path, seeds, datasets, ignored_edge_types, max_deg, ignore_non_seed_baits, False, include_non_approved_drugs)
     g, seed_ids, drug_ids = read_graph_tool_graph(filename, seeds, id_space, max_deg, False, include_non_approved_drugs, search_target)
     
+    if custom_edges:
+      edges = task_hook.parameters.get("input_network")['edges']
+      g = add_edges(g, edges)
+
     # Set number of threads if OpenMP support is enabled.
     if gt.openmp_enabled():
         gt.openmp_set_num_threads(num_threads)
diff --git a/tasks/multi_steiner.py b/tasks/multi_steiner.py
index cc479adde3ae6816c0fa6e974505e7c75ae10f31..210b82af4b1c674c1e8c9c2ef9d68c69cd24892a 100755
--- a/tasks/multi_steiner.py
+++ b/tasks/multi_steiner.py
@@ -1,4 +1,5 @@
 from tasks.task_hook import TaskHook
+from tasks.util.custom_edges import add_edges
 from tasks.util.steiner_tree import steiner_tree
 from tasks.util.find_bridges import find_bridges
 from tasks.util.read_graph_tool_graph import read_graph_tool_graph
@@ -99,6 +100,8 @@ def multi_steiner(task_hook: TaskHook):
 
     node_name_attribute = "internal_id" # nodes in the input network which is created from RepoTrialDB have primaryDomainId as name attribute
 
+    custom_edges = task_hook.parameters.get("custom_edges", False)
+
     # Set number of threads if OpenMP support is enabled.
     if gt.openmp_enabled():
         gt.openmp_set_num_threads(num_threads)
@@ -112,7 +115,13 @@ def multi_steiner(task_hook: TaskHook):
     if ppi_dataset['licenced'] or pdi_dataset['licenced']:
         filename += "_licenced"
     filename = os.path.join(task_hook.data_directory, filename + ".gt")
+    print(filename)
     g, seed_ids, _ = read_graph_tool_graph(filename, seeds, id_space, max_deg, target=search_target)
+
+    if custom_edges:
+      edges = task_hook.parameters.get("input_network")['edges']
+      g = add_edges(g, edges)
+
     seed_map = {g.vertex_properties[node_name_attribute][node]: node for node in seed_ids}
     task_hook.set_progress(1 / (float(num_trees + 3)), "Computing edge weights.")
     weights = edge_weights(g, hub_penalty)
diff --git a/tasks/network_proximity.py b/tasks/network_proximity.py
index c07beeeb0f620e8b13d5d770d5781ab79949a030..af1ad4ab28c91a97343d0486fe7e5a2f90082849 100755
--- a/tasks/network_proximity.py
+++ b/tasks/network_proximity.py
@@ -1,4 +1,5 @@
 from tasks.task_hook import TaskHook
+from tasks.util.custom_edges import add_edges
 from tasks.util.read_graph_tool_graph import read_graph_tool_graph
 from tasks.util.edge_weights import edge_weights
 import os.path
@@ -79,6 +80,8 @@ def network_proximity(task_hook: TaskHook):
 
     filter_paths = task_hook.parameters.get("filter_paths", True)
 
+    custom_edges = task_hook.parameters.get("custom_edges", False)
+
     node_name_attribute = "internal_id"  # nodes in the input network which is created from RepoTrialDB have primaryDomainId as name attribute
     # Set number of threads if OpenMP support is enabled.
     if gt.openmp_enabled():
@@ -95,6 +98,11 @@ def network_proximity(task_hook: TaskHook):
     filename = os.path.join(task_hook.data_directory, filename + ".gt")
     # g, seed_ids, _, drug_ids = read_graph_tool_graph(file_path, seeds, "", "", max_deg, False, True, include_non_approved_drugs)
     g, seed_ids, drug_ids = read_graph_tool_graph(filename, seeds, id_space, max_deg, True, include_non_approved_drugs, target=search_target)
+    
+    if custom_edges:
+      edges = task_hook.parameters.get("input_network")['edges']
+      g = add_edges(g, edges)
+    
     # Computing edge weights.
     task_hook.set_progress(1.0 / 8, "Computing edge weights.")
     weights = edge_weights(g, hub_penalty)
diff --git a/tasks/trust_rank.py b/tasks/trust_rank.py
index 6922fa6b1b219efa2f648a8154bb7703f90e6b63..0b3d677ae63c684fac803e2c070f21a7870a4afb 100755
--- a/tasks/trust_rank.py
+++ b/tasks/trust_rank.py
@@ -1,3 +1,4 @@
+from tasks.util.custom_edges import add_edges
 from tasks.util.read_graph_tool_graph import read_graph_tool_graph
 from tasks.util.scores_to_results import scores_to_results
 from tasks.util.edge_weights import edge_weights
@@ -195,6 +196,8 @@ def trust_rank(task_hook: TaskHook):
     search_target = task_hook.parameters.get("target", "drug-target")
 
     filter_paths = task_hook.parameters.get("filter_paths", True)
+
+    custom_edges = task_hook.parameters.get("custom_edges", False)
     
     # Parsing input file.
     task_hook.set_progress(0 / 4.0, "Parsing input.")
@@ -206,6 +209,11 @@ def trust_rank(task_hook: TaskHook):
         filename += "_licenced"
     filename = os.path.join(task_hook.data_directory, filename+".gt")
     g, seed_ids, drug_ids = read_graph_tool_graph(filename, seeds, id_space, max_deg, include_indirect_drugs, include_non_approved_drugs, search_target)
+    
+    if custom_edges:
+      edges = task_hook.parameters.get("input_network")['edges']
+      g = add_edges(g, edges)
+      
     task_hook.set_progress(1 / 4.0, "Computing edge weights.")
     weights = edge_weights(g, hub_penalty, inverse=True)
     
diff --git a/tasks/util/custom_edges.py b/tasks/util/custom_edges.py
new file mode 100644
index 0000000000000000000000000000000000000000..713f679f912cbae400f10df6beb59fb46d0bb928
--- /dev/null
+++ b/tasks/util/custom_edges.py
@@ -0,0 +1,20 @@
+def make_node_id_map(g):
+    mapping = {}
+    for node in range(g.num_vertices()):
+        mapping[g.vertex_properties['internal_id'][node]] = node
+    return mapping
+
+def add_edges(g, edge_list):
+    """
+    edge list is [{"fom":..., "to":...}, ...]
+    """
+    mapping = make_node_id_map(g)
+    edge_id_list = []
+    for edge in edge_list:
+        a = mapping[edge['from']] if edge['from'] in mapping else False
+        b = mapping[edge['to']] if edge['to'] in mapping else False
+        if a and b:
+            edge_id_list.append((a, b, 'protein-protein'))
+    e_type = g.edge_properties["type"]
+    g.add_edge_list(edge_id_list, eprops=[e_type])
+    return g
\ No newline at end of file
diff --git a/tasks/util/read_graph_tool_graph.py b/tasks/util/read_graph_tool_graph.py
index 2db32cfd3b1064fca2276d8f98db063ff018ef98..ca70eefd4dc5f3fd41a3324dc71f69dbb55bc7dc 100755
--- a/tasks/util/read_graph_tool_graph.py
+++ b/tasks/util/read_graph_tool_graph.py
@@ -125,11 +125,6 @@ def read_graph_tool_graph(file_path, seeds, id_space, max_deg, include_indirect_
     for edge in deleted_edges:
         g.remove_edge(edge)
     g.set_fast_edge_removal(fast=False)
-    # vertices = 0
-    # for _ in g.vertices():
-    #     vertices += 1
-    # edges = 0
-    # for _ in g.edges():
-    #     edges += 1
+
     # Return the graph and the indices of the seed_ids and the seeds.
     return g, list(seed_ids.keys()), drug_ids