diff --git a/python/dune/perftool/generation/__init__.py b/python/dune/perftool/generation/__init__.py
index e541e71366371039157cb757201f710ffd0a19ca..d2712471e4cff347b37a9a5f5452e2a34a4feb72 100644
--- a/python/dune/perftool/generation/__init__.py
+++ b/python/dune/perftool/generation/__init__.py
@@ -31,6 +31,10 @@ from dune.perftool.generation.cpp import (base_class,
                                           template_parameter,
                                           )
 
+from dune.perftool.generation.hooks import (register_hook,
+                                            run_hook,
+                                            )
+
 from dune.perftool.generation.loopy import (barrier,
                                             constantarg,
                                             domain,
diff --git a/python/dune/perftool/generation/hooks.py b/python/dune/perftool/generation/hooks.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd3fc0a137c3ab401dc744a55e1e3bbed8d03fb9
--- /dev/null
+++ b/python/dune/perftool/generation/hooks.py
@@ -0,0 +1,16 @@
+""" All the infrastructure code related to adding hooks to the code generation process """
+
+
+_hooks = {}
+
+
+def register_hook(hookname, func):
+    current = _hooks.setdefault(hookname, ())
+    current = list(current)
+    current.append(func)
+    _hooks[hookname] = tuple(current)
+
+
+def run_hook(hookname, *args, **kwargs):
+    for hook in _hooks[hookname]:
+        hook(*args, **kwargs)
diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 1f808ef1c90f4b358b60d6f4744a2322a726e055..f5ac0b8db07da66e21fe4c3dcc53c08610c2084b 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -28,6 +28,7 @@ from dune.perftool.generation import (backend,
                                       post_include,
                                       retrieve_cache_functions,
                                       retrieve_cache_items,
+                                      run_hook,
                                       template_parameter,
                                       )
 from dune.perftool.cgen.clazz import (AccessModifier,
@@ -452,6 +453,8 @@ def visit_integral(integral):
     visitor = get_visitor(measure, subdomain_id)
     visitor.accumulate(integrand)
 
+    run_hook("after_visit", visitor)
+
 
 def generate_kernel(integrals):
     logger = logging.getLogger(__name__)