diff --git a/python/dune/perftool/pdelab/localoperator.py b/python/dune/perftool/pdelab/localoperator.py
index 3d39a24368659e3272c09f2a92b497258fa4f834..5d53d25d0d6fe6ae8a4e29f5306d05d1d4e4a1f5 100644
--- a/python/dune/perftool/pdelab/localoperator.py
+++ b/python/dune/perftool/pdelab/localoperator.py
@@ -34,6 +34,7 @@ from pymbolic.primitives import Variable
 import pymbolic.primitives as prim
 from pytools import Record
 
+import ufl.classes as uc
 import loopy as lp
 import cgen
 
@@ -420,6 +421,13 @@ def visit_integrals(integrals):
                 if name.startswith("cse"):
                     subst_rule(name, expr, visitor)
 
+            # Ensure CSE on detjac * quadrature weight
+            domain = term.argument.argexpr.ufl_domain()
+            if term.argument.restriction:
+                subst_rule("integration_factor", uc.FacetJacobianDeterminant(domain)*uc.QuadratureWeight(domain), visitor)
+            else:
+                subst_rule("integration_factor", uc.JacobianDeterminant(domain)*uc.QuadratureWeight(domain), visitor)
+
             get_backend(interface="accum_insn")(visitor, term, measure, subdomain_id)