diff --git a/python/dune/perftool/loopy/transformer.py b/python/dune/perftool/loopy/transformer.py
index db0a0fbc002d6ad5117e637db6f28ccb018d2edb..727f31b4dc13eb1fe14928d04ea5743962d1f77f 100644
--- a/python/dune/perftool/loopy/transformer.py
+++ b/python/dune/perftool/loopy/transformer.py
@@ -144,11 +144,13 @@ def transform_accumulation_term(term):
     inames = retrieve_cache_items("iname")
 
     from dune.perftool.pdelab.quadrature import name_factor
+    factor = name_factor()
     instruction(inames=inames,
                 code="{}.accumulate({}, {}*{})".format(residual,
                                                        ", ".join(accumargs),
                                                        expr_tv_name,
-                                                       name_factor()
+                                                       factor,
                                                        ),
                 assignees=residual,
+                read_variables=(factor, expr_tv_name),
                 )
diff --git a/python/dune/perftool/pdelab/__init__.py b/python/dune/perftool/pdelab/__init__.py
index 534fea4373209c9f50ea99b9711bc7c5603a0722..4d5762dd4687a2e7fa8cd7b8e4d2a4865484c3e6 100644
--- a/python/dune/perftool/pdelab/__init__.py
+++ b/python/dune/perftool/pdelab/__init__.py
@@ -1,6 +1,8 @@
 """ The pdelab specific parts of the code generation process """
 
-from dune.perftool.generation import symbol
+from dune.perftool.generation import (preamble,
+                                      symbol,
+                                      )
 
 
 # Now define some commonly used generators that do not fall into a specific category
diff --git a/python/dune/perftool/pdelab/basis.py b/python/dune/perftool/pdelab/basis.py
index e84c05f5a2a126d56e48c0015652df7cade34821..9a44bb64c6f9079d5bc26451d8c4f11745db220f 100644
--- a/python/dune/perftool/pdelab/basis.py
+++ b/python/dune/perftool/pdelab/basis.py
@@ -34,7 +34,7 @@ def name_lfs_bound(lfs):
     return bound
 
 
-@generator_factory(cache_key_generator=lambda e, **kw: e, item_tags=('blubb',))
+@generator_factory(cache_key_generator=lambda e, **kw: e)
 def name_lfs(element, prefix=None):
     # Omitting the prefix is only valid upon a second call, which will
     # result in a cache hit.
@@ -106,15 +106,10 @@ def lfs_iname(element, argcount=0):
     return _lfs_iname(element, argcount)
 
 
-@symbol
-def name_localfunctionspace(expr):
-    return 'lfsu'
-
-
 @cached
 def evaluate_basis(element, name):
     temporary_variable(name, shape=(name_lfs_bound(element),))
-    lfs = name_localfunctionspace(element)
+    lfs = name_lfs(element)
     qp = name_quadrature_point()
     instruction(inames=(quadrature_iname(),
                         ),
@@ -136,7 +131,7 @@ def name_basis(element):
 def evaluate_reference_gradient(element, name):
     # TODO this is of course not yet correct
     temporary_variable(name, shape=(name_lfs_bound(element), name_dimension()))
-    lfs = name_localfunctionspace(element)
+    lfs = name_lfs(element)
     qp = name_quadrature_point()
     instruction(inames=(quadrature_iname(),
                         ),
@@ -170,6 +165,9 @@ def evaluate_basis_gradient(element, name):
                                                     name,
                                                     ),
                 assignees=name,
+                read_variables=(reference_gradients,
+                                ),
+
                 )
 
 
@@ -182,7 +180,7 @@ def name_basis_gradient(element):
 @cached
 def evaluate_trialfunction(element, name):
     temporary_variable(name, shape=())
-    lfs = name_localfunctionspace(element)
+    lfs = name_lfs(element)
     index = lfs_iname(element)
     basis = name_basis()
     instruction(inames=(quadrature_iname(),
@@ -205,7 +203,7 @@ def evaluate_trialfunction(element, name):
 def evaluate_trialfunction_gradient(element, name):
     # TODO this is of course not yet correct
     temporary_variable(name, shape=(name_dimension(),))
-    lfs = name_localfunctionspace(element)
+    lfs = name_lfs(element)
     index = lfs_iname(element)
     basis = name_basis_gradient(element)
     instruction(inames=(quadrature_iname(),
@@ -217,4 +215,6 @@ def evaluate_trialfunction_gradient(element, name):
                                                       basis
                                                       ),
                 assignees=name,
+                read_variables=(basis,
+                                ),
                 )
diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py
index 10787306982040a08b70b9a21f42111f836a6967..5a12c91b37a70997a0399acf275a307da4b27b87 100644
--- a/python/dune/perftool/pdelab/geometry.py
+++ b/python/dune/perftool/pdelab/geometry.py
@@ -1,5 +1,6 @@
 from dune.perftool.generation import (preamble,
                                       symbol,
+                                      temporary_variable,
                                       )
 from dune.perftool.pdelab.quadrature import (name_quadrature_position,
                                              quadrature_preamble,
@@ -24,7 +25,7 @@ def type_geometry():
 @preamble
 def define_dimension(name):
     geo = type_geometry()
-    return 'auto {} = {}::Geometry::coorddimension;'.format(name, geo)
+    return 'const int {} = {}::Entity::dimension;'.format(name, geo)
 
 
 @symbol
@@ -33,13 +34,23 @@ def name_dimension():
     return "dim"
 
 
+@preamble
+def define_jacobian_inverse_transposed_temporary(name, **kwargs):
+    geo = name_geometry()
+    return "auto {} = {}.jacobianInverseTransposed({{{{ 0.0 }}}});".format(name,
+                                                                geo,
+                                                                )
+
+
 def define_jacobian_inverse_transposed(name):
+    dim = name_dimension()
+    temporary_variable(name, decl_method=define_jacobian_inverse_transposed_temporary, shape=(dim, dim))
     geo = name_geometry()
     pos = name_quadrature_position()
-    return quadrature_preamble("auto {} = {}.jacobianInverseTransposed({});".format(name,
-                                                                                    geo,
-                                                                                    pos,
-                                                                                    )
+    return quadrature_preamble("{} = {}.jacobianInverseTransposed({});".format(name,
+                                                                               geo,
+                                                                               pos,
+                                                                               )
                                )
 
 @symbol