diff --git a/python/dune/perftool/blockstructured/geometry.py b/python/dune/perftool/blockstructured/geometry.py
index 3211d051badb600050f264b1ec4553ff6497e3db..ae8e06710afe6feb456d98827f7ed10ca6ade102 100644
--- a/python/dune/perftool/blockstructured/geometry.py
+++ b/python/dune/perftool/blockstructured/geometry.py
@@ -8,7 +8,6 @@ from dune.perftool.options import (get_form_option,
                                    option_switch, get_option)
 from dune.perftool.pdelab.geometry import (world_dimension,
                                            local_dimension,
-                                           apply_to_global_transformation,
                                            name_facet_jacobian_determinant,
                                            name_element_corners,
                                            component_iname)
@@ -267,7 +266,6 @@ def pymbolic_jacobian_inverse(i, j, restriction):
         from dune.perftool.pdelab.geometry import name_constant_jacobian_inverse_transposed
         name_jit = name_constant_jacobian_inverse_transposed(restriction)
     else:
-        from dune.perftool.blockstructured.geometry import name_jacobian_inverse_transposed
         name_jit = name_jacobian_inverse_transposed(restriction)
     return prim.Product((get_form_option("number_of_blocks"),
                          prim.Subscript(prim.Variable(name_jit), (j, i))))
@@ -314,8 +312,37 @@ def name_point_in_macro(point_in_micro):
     return name
 
 
+def apply_constant_to_global_transformation(name, local):
+    temporary_variable(name, shape=(world_dimension(),), managed=True)
+    corners = name_element_corners()
+
+    if isinstance(local, str):
+        local = prim.Variable(local)
+
+    d = component_iname('to_global')
+
+    # global[d] = lower_left[d] + local[d] * (upper_right[d] - lower_left[d])
+    expr = prim.Sum((prim.Subscript(prim.Variable(corners), (0,prim.Variable(d))),
+                     prim.Product((prim.Subscript(local, (prim.Variable(d),)),
+                                   prim.Sum((prim.Subscript(prim.Variable(corners), (3, prim.Variable(d))),
+                                             -1 * prim.Subscript(prim.Variable(corners), (0, prim.Variable(d)))))
+                                   ))
+                     ))
+    assignee = prim.Subscript(prim.Variable(name), (prim.Variable(d),))
+
+    instruction(assignee=assignee, expression=expr,
+                within_inames=frozenset(sub_element_inames() + get_backend(interface="quad_inames")() + (d,)),
+                within_inames_is_final=True,
+                depends_on=frozenset({Writes(local.name), Writes(corners)})
+                )
+
+
 def to_global(local):
     macro = name_point_in_macro(local)
     name = macro + "_global"
-    apply_to_global_transformation(name, prim.Variable(macro))
+    if get_form_option("constant_transformation_matrix"):
+        apply_constant_to_global_transformation(name, prim.Variable(macro))
+    else:
+        from dune.perftool.pdelab.geometry import apply_to_global_transformation
+        apply_to_global_transformation(name, prim.Variable(macro))
     return prim.Variable(name)
diff --git a/test/blockstructured/poisson/poisson_tensor.mini b/test/blockstructured/poisson/poisson_tensor.mini
index ff6426b9129d3d0028047f7d1413a4f17761d6df..9eb55a9a1fdafcfc2e862d51b08365700e552b28 100644
--- a/test/blockstructured/poisson/poisson_tensor.mini
+++ b/test/blockstructured/poisson/poisson_tensor.mini
@@ -1,7 +1,7 @@
 __name = blockstructured_poisson_tensor_{__exec_suffix}
-__exec_suffix = numdiff, symdiff | expand num
+__exec_suffix = nonvec, vec | expand vectorized
 
-cells = 20 20
+cells = 10 10
 extension = 1. 1.
 
 [wrapper.vtkcompare]
@@ -13,6 +13,8 @@ extension = vtu
 compare_l2errorsquared = 1e-7
 
 [formcompiler.r]
-numerical_jacobian = 1, 0 | expand num
+matrix_free = 1
+vectorization_blockstructured = 0, 1 | expand vectorized
+generate_jacobians = 0
 blockstructured = 1
-number_of_blocks = 4
+number_of_blocks = 8