diff --git a/python/dune/perftool/pdelab/basis.py b/python/dune/perftool/pdelab/basis.py
index 17d967b1c2ee36e732fe790fba7ebe92f3ec8624..42c475567e348aa57b08198bad54ef8fc5872599 100644
--- a/python/dune/perftool/pdelab/basis.py
+++ b/python/dune/perftool/pdelab/basis.py
@@ -16,9 +16,6 @@ from dune.perftool.pdelab.spaces import (lfs_child,
                                          name_lfs_bound,
                                          type_gfs,
                                          )
-from dune.perftool.pdelab.quadrature import (name_quadrature_position_in_cell,
-                                             quadrature_iname,
-                                             )
 from dune.perftool.pdelab.geometry import (dimension_iname,
                                            name_dimension,
                                            name_jacobian_inverse_transposed,
@@ -27,6 +24,7 @@ from dune.perftool.pdelab.geometry import (dimension_iname,
 from dune.perftool.pdelab.localoperator import (lop_template_ansatz_gfs,
                                                 lop_template_test_gfs,
                                                 )
+from dune.perftool.tools import get_pymbolic_basename
 from dune.perftool.pdelab.driver import FEM_name_mangling
 from dune.perftool.pdelab.restriction import restricted_name
 from pymbolic.primitives import Product, Subscript, Variable
@@ -71,11 +69,11 @@ def evaluate_basis(leaf_element, name, restriction):
     instruction(inames=get_backend("quad_inames")(),
                 code='{} = {}.evaluateFunction({}, {}.finiteElement().localBasis());'.format(name,
                                                                                              cache,
-                                                                                             qp,
+                                                                                             str(qp),
                                                                                              lfs,
                                                                                              ),
                 assignees=frozenset({name}),
-                read_variables=frozenset({qp}),
+                read_variables=frozenset({get_pymbolic_basename(qp)}),
                 )
 
 
@@ -93,15 +91,15 @@ def evaluate_reference_gradient(leaf_element, name, restriction):
     lfs = name_leaf_lfs(leaf_element, restriction)
     temporary_variable(name, shape=(name_lfs_bound(lfs), 1, name_dimension()), decl_method=declare_cache_temporary(leaf_element, restriction, 'Jacobian'))
     cache = name_localbasis_cache(leaf_element)
-    qp = name_quadrature_position_in_cell(restriction)
+    qp = get_backend("qp_in_cell")(restriction)
     instruction(inames=get_backend("quad_inames")(),
                 code='{} = {}.evaluateJacobian({}, {}.finiteElement().localBasis());'.format(name,
                                                                                              cache,
-                                                                                             qp,
+                                                                                             str(qp),
                                                                                              lfs,
                                                                                              ),
                 assignees=frozenset({name}),
-                read_variables=frozenset({qp}),
+                read_variables=frozenset({get_pymbolic_basename(qp)}),
                 )
 
 
diff --git a/python/dune/perftool/pdelab/geometry.py b/python/dune/perftool/pdelab/geometry.py
index f9782c8fb7aa08eaf2c24001e5d42b35e7da8d4b..a920f575700517fc9e1aec5d9fff099e653b2ca6 100644
--- a/python/dune/perftool/pdelab/geometry.py
+++ b/python/dune/perftool/pdelab/geometry.py
@@ -9,12 +9,13 @@ from dune.perftool.generation import (cached,
                                       preamble,
                                       temporary_variable,
                                       )
-from dune.perftool.pdelab.quadrature import (name_quadrature_position,
-                                             name_quadrature_position_in_cell,
+from dune.perftool.pdelab.quadrature import (pymbolic_quadrature_position_in_cell,
                                              quadrature_preamble,
                                              )
+from dune.perftool.tools import get_pymbolic_basename
 from ufl.algorithms import MultiFunction
 from pymbolic.primitives import Variable
+from pymbolic.primitives import Expression as PymbolicExpression
 
 
 @preamble
@@ -194,25 +195,27 @@ def apply_in_cell_transformation(name, local, restriction):
     geo = name_in_cell_geometry(restriction)
     return quadrature_preamble("{} = {}.global({});".format(name,
                                                             geo,
-                                                            local,
+                                                            str(local),
                                                             ),
                                assignees=frozenset({name}),
-                               read_variables=frozenset({local}),
+                               read_variables=frozenset({get_pymbolic_basename(local)}),
                                )
 
 
-def name_in_cell_coordinates(local, basename, restriction):
+def pymbolic_in_cell_coordinates(local, restriction):
+    basename = get_pymbolic_basename(local)
     name = "{}_in_{}side".format(basename, "in" if restriction is Restriction.NEGATIVE else "out")
     temporary_variable(name, shape=(name_dimension(),), shape_impl=("fv",))
     apply_in_cell_transformation(name, local, restriction)
-    return name
+    return Variable(name)
 
 
-def to_cell_coordinates(local, basename, restriction):
+def to_cell_coordinates(local, restriction):
+    assert isinstance(local, PymbolicExpression)
     if restriction == Restriction.NONE:
         return local
     else:
-        return name_in_cell_coordinates(local, basename, restriction)
+        return pymbolic_in_cell_coordinates(local, restriction)
 
 
 def name_dimension():
@@ -227,10 +230,10 @@ def name_intersection_dimension():
 
 def evaluate_unit_outer_normal(name):
     ig = name_intersection_geometry_wrapper()
-    qp = name_quadrature_position()
+    qp = get_backend("quad_pos")()
     return quadrature_preamble("{} = {}.unitOuterNormal({});".format(name, ig, qp),
                                assignees=frozenset({name}),
-                               read_variables=frozenset({qp}),
+                               read_variables=frozenset({get_pymbolic_basename(qp)}),
                                )
 
 
@@ -285,10 +288,10 @@ def define_jacobian_inverse_transposed(name, restriction):
     pos = get_backend("qp_in_cell")(restriction)
     return quadrature_preamble("{} = {}.jacobianInverseTransposed({});".format(name,
                                                                                geo,
-                                                                               pos,
+                                                                               str(pos),
                                                                                ),
                                assignees=frozenset({name}),
-                               read_variables=frozenset({pos}),
+                               read_variables=frozenset({get_pymbolic_basename(pos)}),
                                )
 
 
@@ -304,11 +307,11 @@ def define_jacobian_determinant(name):
     pos = get_backend("quad_pos")()
     code = "{} = {}.integrationElement({});".format(name,
                                                     geo,
-                                                    pos,
+                                                    str(pos),
                                                     )
     return quadrature_preamble(code,
                                assignees=frozenset({name}),
-                               read_variables=frozenset({pos}),
+                               read_variables=frozenset({get_pymbolic_basename(pos)}),
                                )
 
 
diff --git a/python/dune/perftool/pdelab/parameter.py b/python/dune/perftool/pdelab/parameter.py
index 466f382ae953f648394617b39e508f1b49834123..602182163e0ad531e7992a04525a9cc36acd4802 100644
--- a/python/dune/perftool/pdelab/parameter.py
+++ b/python/dune/perftool/pdelab/parameter.py
@@ -5,6 +5,7 @@ from dune.perftool.generation import (cached,
                                       class_member,
                                       constructor_parameter,
                                       generator_factory,
+                                      get_backend,
                                       initializer_list,
                                       preamble,
                                       temporary_variable
@@ -13,10 +14,11 @@ from dune.perftool.pdelab.geometry import (name_cell,
                                            name_dimension,
                                            name_intersection,
                                            )
-from dune.perftool.pdelab.quadrature import (name_quadrature_position,
-                                             name_quadrature_position_in_cell,
+from dune.perftool.pdelab.quadrature import (pymbolic_quadrature_position,
+                                             pymbolic_quadrature_position_in_cell,
                                              quadrature_preamble,
                                              )
+from dune.perftool.tools import get_pymbolic_basename
 from dune.perftool.cgen.clazz import AccessModifier
 from dune.perftool.pdelab.localoperator import (class_type_from_cache,
                                                 localoperator_basename,
@@ -132,12 +134,12 @@ def evaluate_cellwise_constant_parameter_function(name, restriction):
     import numpy
     valuearg(name, dtype=numpy.float64)
 
-    return '{} = {}.{}({}, {});'.format(name,
-                                        name_paramclass(),
-                                        name,
-                                        entity,
-                                        pos,
-                                        )
+    return 'auto {} = {}.{}({}, {});'.format(name,
+                                             name_paramclass(),
+                                             name,
+                                             entity,
+                                             pos,
+                                             )
 
 
 @preamble
@@ -155,26 +157,26 @@ def evaluate_intersectionwise_constant_parameter_function(name):
     import numpy
     valuearg(name, dtype=numpy.float64)
 
-    return '{} = {}.{}({}, {});'.format(name,
-                                        name_paramclass(),
-                                        name,
-                                        intersection,
-                                        pos,
-                                        )
+    return 'auto {} = {}.{}({}, {});'.format(name,
+                                             name_paramclass(),
+                                             name,
+                                             intersection,
+                                             pos,
+                                             )
 
 
 def evaluate_cell_parameter_function(name, restriction):
     param = name_paramclass()
     entity = name_cell(restriction)
-    pos = name_quadrature_position_in_cell(restriction)
+    pos = get_backend(interface="qp_in_cell")(restriction)
     return quadrature_preamble('{} = {}.{}({}, {});'.format(name,
                                                             name_paramclass(),
                                                             name,
                                                             entity,
-                                                            pos,
+                                                            str(pos),
                                                             ),
                                assignees=frozenset({name}),
-                               read_variables=frozenset({pos}),
+                               read_variables=frozenset({get_pymbolic_basename(pos)}),
                                )
 
 
@@ -186,15 +188,15 @@ def evaluate_intersection_parameter_function(name):
 
     param = name_paramclass()
     intersection = name_intersection()
-    pos = name_quadrature_position()
+    pos = get_backend("quad_pos")()
     return quadrature_preamble('{} = {}.{}({}, {});'.format(name,
                                                             name_paramclass(),
                                                             name,
                                                             intersection,
-                                                            pos,
+                                                            str(pos),
                                                             ),
                                assignees=frozenset({name}),
-                               read_variables=frozenset({pos}),
+                               read_variables=frozenset({get_pymbolic_basename(pos)}),
                                )
 
 
diff --git a/python/dune/perftool/pdelab/quadrature.py b/python/dune/perftool/pdelab/quadrature.py
index 918a0620d82e7fdcd0a1d3910823390e3b24a2f5..f12e99f0bc6ec600ce6d367fd5979b8ef2ce1337 100644
--- a/python/dune/perftool/pdelab/quadrature.py
+++ b/python/dune/perftool/pdelab/quadrature.py
@@ -130,17 +130,10 @@ def pymbolic_quadrature_position():
     return Subscript(Variable(quad_points), (Variable(quad_iname),))
 
 
-def name_quadrature_position():
-    return str(pymbolic_quadrature_position())
-
-
 @backend(interface="qp_in_cell")
-def name_quadrature_position_in_cell(restriction):
-    if restriction == Restriction.NONE:
-        return name_quadrature_position()
-    else:
-        from dune.perftool.pdelab.geometry import to_cell_coordinates
-        return to_cell_coordinates(name_quadrature_position(), name_quadrature_point(), restriction)
+def pymbolic_quadrature_position_in_cell(restriction):
+    from dune.perftool.pdelab.geometry import to_cell_coordinates
+    return to_cell_coordinates(pymbolic_quadrature_position(), restriction)
 
 
 @preamble
@@ -158,11 +151,13 @@ def typedef_quadrature_weights(name):
     dim = _local_dim()
     return "using {} = typename Dune::QuadraturePoint<{}, {}>::Field;".format(name, range_field, dim)
 
+
 def pymbolic_quadrature_weight():
     vec = name_quadrature_weights()
     return Subscript(Variable(vec),
                      tuple(Variable(i) for i in quadrature_inames()))
 
+
 def type_quadrature_weights(name):
     name = name.upper()
     typedef_quadrature_weights(name)
diff --git a/python/dune/perftool/tools.py b/python/dune/perftool/tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..104c7ebd404d8628a56cba52fa53cae7e828bf4a
--- /dev/null
+++ b/python/dune/perftool/tools.py
@@ -0,0 +1,15 @@
+""" Some grabbag tools """
+
+from pymbolic.primitives import Expression, Variable, Subscript
+
+
+def get_pymbolic_basename(expr):
+    assert isinstance(expr, Expression), "Type: {}, expr: {}".format(type(expr), expr)
+
+    if isinstance(expr, Variable):
+        return expr.name
+
+    if isinstance(expr, Subscript):
+        return get_pymbolic_basename(expr.aggregate)
+
+    raise NotImplementedError("Cannot determine basename of {}".format(expr))
\ No newline at end of file