diff --git a/app/routes.py b/app/routes.py
index 4d72f361cfe9cbbf19bc8b0f5d2970c0eb903ab6..3f39f2b9c210372f10b1f122e5f566ca5b143710 100644
--- a/app/routes.py
+++ b/app/routes.py
@@ -1,5 +1,5 @@
 from glob import glob
-from os.path import basename, join, exists
+from os.path import basename, join, exists, splitext
 from functools import wraps
 import toml
 from flask import render_template, send_from_directory, request, Response
@@ -14,7 +14,7 @@ app.config['FREEZER_DESTINATION'] = '../km3web'
 PLOTS = [['dom_activity', 'dom_rates'], ['pmt_rates', 'pmt_hrv'],
          ['trigger_rates'], ['ztplot', 'triggermap']]
 
-AHRS_PLOTS = [['yaw_calib_du*'], ['pitch_calib_du*'], ['roll_calib_du*']]
+AHRS_PLOTS = ['yaw_calib_du*', 'pitch_calib_du*', 'roll_calib_du*']
 TRIGGER_PLOTS = [['trigger_rates'], ['trigger_rates_lin']]
 K40_PLOTS = [['intradom'], ['angular_k40rate_distribution']]
 RTTC_PLOTS = [['rttc']]
@@ -32,6 +32,21 @@ if exists(CONFIG_PATH):
         PASSWORD = config["WebServer"]["password"]
 
 
+def expand_wildcards(plot_layout):
+    """Replace wildcard entries with list of files"""
+    plots = []
+    for row in AHRS_PLOTS:
+        if not isinstance(row, list) and '*' in row:
+            plots.append(
+                sorted([
+                    splitext(basename(p))[0]
+                    for p in glob(join(app.root_path, PLOTS_PATH, row))
+                ]))
+        else:
+            plots.append(row)
+    return plots
+
+
 def check_auth(username, password):
     """This function is called to check if a username /
     password combination is valid.
@@ -77,38 +92,31 @@ def add_header(r):
 @app.route('/index.html')
 @requires_auth
 def index():
-    return render_template('plots.html', plots=PLOTS)
+    return render_template('plots.html', plots=expand_wildcards(PLOTS))
 
 
 @app.route('/ahrs.html')
 @requires_auth
 def ahrs():
-    plots = []
-    for row in AHRS_PLOTS:
-        if not isinstance(row, list) and '*' in row:
-            plots.append(
-                sorted([basename(p) for p in glob(join(PLOTS_PATH, row))]))
-        else:
-            plots.append(row)
-    return render_template('plots.html', plots=plots)
+    return render_template('plots.html', plots=expand_wildcards(AHRS_PLOTS))
 
 
 @app.route('/reco.html')
 @requires_auth
 def reco():
-    return render_template('plots.html', plots=RECO_PLOTS)
+    return render_template('plots.html', plots=expand_wildcards(RECO_PLOTS))
 
 
 @app.route('/sn.html')
 @requires_auth
 def supernova():
-    return render_template('plots.html', plots=SN_PLOTS)
+    return render_template('plots.html', plots=expand_wildcards(SN_PLOTS))
 
 
 @app.route('/compact.html')
 @requires_auth
 def compact():
-    return render_template('plots.html', plots=COMPACT_PLOTS)
+    return render_template('plots.html', plots=expand_wildcards(COMPACT_PLOTS))
 
 
 @app.route('/rttc.html')
@@ -116,7 +124,7 @@ def compact():
 def rttc():
     return render_template(
         'plots.html',
-        plots=RTTC_PLOTS,
+        plots=expand_wildcards(RTTC_PLOTS),
         info=
         "Cable Round Trip Time calculated from realtime data provided by the "
         "Detector Manager. The red lines shows the median and the STD "
@@ -129,7 +137,7 @@ def rttc():
 def k40():
     return render_template(
         'plots.html',
-        plots=K40_PLOTS,
+        plots=expand_wildcards(K40_PLOTS),
         info="The first plot shows the intra-DOM calibration. "
         "y-axis: delta_t [ns], x-axis: cosine of angles. "
         "The second plot the angular distribution of K40 rates. "
@@ -140,7 +148,7 @@ def k40():
 @app.route('/trigger.html')
 @requires_auth
 def trigger():
-    return render_template('plots.html', plots=TRIGGER_PLOTS)
+    return render_template('plots.html', plots=expand_wildcards(TRIGGER_PLOTS))
 
 
 @app.route('/plots/<path:filename>')