diff --git a/applications/convection_diffusion/conv_diff_dg.mini b/applications/convection_diffusion/conv_diff_dg.mini
index 7476dd5e0913c620236371bfeb378d9e92ef2a9b..904f1e6eb909f23e144fa1181fbc9dcac8af6e5c 100644
--- a/applications/convection_diffusion/conv_diff_dg.mini
+++ b/applications/convection_diffusion/conv_diff_dg.mini
@@ -1,5 +1,5 @@
 __name = app_conv_diff_{__exec_suffix}
-__exec_suffix = deg{formcompiler.ufl_variants.degree}_{opcount_suffix}
+__exec_suffix = deg{formcompiler.ufl_variants.degree}_{opcount_suffix}_level{formcompiler.instrumentation_level}
 
 opcount_suffix = opcount, nonopcount | expand opcount
 
@@ -26,6 +26,9 @@ extension = 1.0 | repeat {dim}
 cells = {firstdircells} {otherdircells}
 partitioning = {ranks} {ones}
 
+# Set up the timing identifier
+identifier = convdiff_deg{formcompiler.ufl_variants.degree}
+
 [wrapper.vtkcompare]
 name = {__name}
 extension = vtu
@@ -35,7 +38,7 @@ fastdg = 1
 sumfact = 1
 vectorize_quad = 1
 vectorize_grads = 1
-instrumentation_level = 2
+instrumentation_level = 2, 3, 4 | expand
 opcounter = 1, 0 | expand opcount
 time_opcounter = 0, 1 | expand opcount
 exact_solution_expression = g
diff --git a/applications/poisson_dg/poisson_dg.mini b/applications/poisson_dg/poisson_dg.mini
index a8aac4c2a2cef789f5380010c3cfd1fa6111500a..14426746f57cb42ab2c32be6089b42618ffc2802 100644
--- a/applications/poisson_dg/poisson_dg.mini
+++ b/applications/poisson_dg/poisson_dg.mini
@@ -1,5 +1,5 @@
-__name = app_poisson_dg_{dim}d_{__exec_suffix}
-__exec_suffix = deg{formcompiler.ufl_variants.degree}_{opcount_suffix}
+__name = app_poisson_dg_{__exec_suffix}
+__exec_suffix = deg{formcompiler.ufl_variants.degree}_{opcount_suffix}_level{formcompiler.instrumentation_level}
 
 opcount_suffix = opcount, nonopcount | expand opcount
 
@@ -21,6 +21,9 @@ dimminusone = {dim} - 1 | eval
 ones = 1 | repeat {dimminusone}
 otherdircells = {cellsperdir} | repeat {dimminusone}
 
+# Set up the timing identifier
+identifier = poisson_dg_deg{formcompiler.ufl_variants.degree}
+
 # Setup the grid!
 extension = 1.0 | repeat {dim}
 cells = {firstdircells} {otherdircells}
@@ -35,7 +38,7 @@ fastdg = 1
 sumfact = 1
 vectorize_quad = 1
 vectorize_grads = 1
-instrumentation_level = 2
+instrumentation_level = 2, 3, 4 | expand
 opcounter = 1, 0 | expand opcount
 time_opcounter = 0, 1 | expand opcount
 
diff --git a/dune/perftool/common/timer.hh b/dune/perftool/common/timer.hh
index c6d3198f30ada8fa9f079c722791e5b86f0d4c46..d7d208adf20b716511d184b6b499cc7230edc76a 100644
--- a/dune/perftool/common/timer.hh
+++ b/dune/perftool/common/timer.hh
@@ -77,26 +77,26 @@
 
 #define DUMP_TIMER(name,os,reset)\
   if (HP_TIMER_ELAPSED(name) > 1e-12) \
-    os << exec << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
-  HP_TIMER_OPCOUNTERS(name).reportOperations(os,exec,#name,reset);
+    os << ident << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
+  HP_TIMER_OPCOUNTERS(name).reportOperations(os,ident,#name,reset);
 
 #define DUMP_AND_ACCUMULATE_TIMER(name,os,reset,time,ops)  \
   if (HP_TIMER_ELAPSED(name) > 1e-12) \
-    os << exec << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
+    os << ident << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
   time += HP_TIMER_ELAPSED(name); \
   ops += HP_TIMER_OPCOUNTERS(name); \
-  HP_TIMER_OPCOUNTERS(name).reportOperations(os,exec,#name,reset);
+  HP_TIMER_OPCOUNTERS(name).reportOperations(os,ident,#name,reset);
 
 #elif defined ENABLE_HP_TIMERS
 
 #define DUMP_TIMER(name,os,reset)                       \
   if (HP_TIMER_ELAPSED(name) > 1e-12) \
-    os << exec << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
+    os << ident << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
   if (reset) HP_TIMER_RESET(name);
 
 #define DUMP_AND_ACCUMULATE_TIMER(name,os,reset,time,ops)  \
   if (HP_TIMER_ELAPSED(name) > 1e-12) \
-    os << exec << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
+    os << ident << " " << #name << " time " << HP_TIMER_ELAPSED(name) << std::endl; \
   time += HP_TIMER_ELAPSED(name); \
   if (reset) HP_TIMER_RESET(name);
 
diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py
index 26de3b67de909ee8156d33aefafcaff3727c718d..34eb37d2a28fb922cd3c230116ec065f516bfa3d 100644
--- a/python/dune/perftool/pdelab/driver.py
+++ b/python/dune/perftool/pdelab/driver.py
@@ -1166,9 +1166,9 @@ def define_timing_stream(name):
 
 @preamble
 def dump_dof_numbers(stream):
-    exe = name_exec()
+    ident = name_timing_identifier()
     return "{} << {} << \" dofs dofs \" << {}.size() << std::endl;".format(stream,
-                                                                           exe,
+                                                                           ident,
                                                                            name_gfs(_driver_data['form'].coefficients()[0].ufl_element()))
 
 
@@ -1222,7 +1222,7 @@ def dune_solve():
         for formdata in formdatas:
             lop_name = name_localoperator(formdata)
             timestream = name_timing_stream()
-            print_times.append("{}.dump_timers({}, argv[0], true);".format(lop_name, timestream))
+            print_times.append("{}.dump_timers({}, {}, true);".format(lop_name, timestream, name_timing_identifier()))
 
         solve = ["HP_TIMER_START(solve);",
                  "{}".format(solve),
@@ -1425,13 +1425,14 @@ def setup_timer():
 
 
 @preamble
-def define_exec(name):
-    return "char* {} = argv[0];".format(name)
+def define_timing_identifier(name):
+    ini = name_initree()
+    return "auto {} = {}.get<std::string>(\"identifier\", argv[0]);".format(name, ini)
 
 
-def name_exec():
-    name = "exec"
-    define_exec(name)
+def name_timing_identifier():
+    name = "ident"
+    define_timing_identifier(name)
     return name
 
 
@@ -1455,7 +1456,7 @@ def evaluate_residual_timer():
     for formdata in formdatas:
         lop_name = name_localoperator(formdata)
         if get_option('instrumentation_level') >= 3:
-            print_times.append("{}.dump_timers({}, argv[0], true);".format(lop_name, timestream))
+            print_times.append("{}.dump_timers({}, {}, true);".format(lop_name, timestream, name_timing_identifier()))
 
     if get_option('instrumentation_level') >= 2:
         evaluation = ["HP_TIMER_START(residual_evaluation);",
@@ -1495,7 +1496,7 @@ def apply_jacobian_timer():
     for formdata in formdatas:
         lop_name = name_localoperator(formdata)
         if get_option('instrumentation_level') >= 3:
-            print_times.append("{}.dump_timers({}, argv[0], true);".format(lop_name, timestream))
+            print_times.append("{}.dump_timers({}, {}, true);".format(lop_name, timestream, name_timing_identifier()))
 
     if get_option('instrumentation_level') >= 2:
         evaluation = ["HP_TIMER_START(apply_jacobian);",
@@ -1532,7 +1533,7 @@ def assemble_matrix_timer():
     for formdata in formdatas:
         lop_name = name_localoperator(formdata)
         if get_option('instrumentation_level') >= 3:
-            print_times.append("{}.dump_timers({}, argv[0], true);".format(lop_name, timestream))
+            print_times.append("{}.dump_timers({}, {}, true);".format(lop_name, timestream, name_timing_identifier()))
 
     if get_option('instrumentation_level') >= 2:
         assembly = ["HP_TIMER_START(matrix_assembly);",