diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py
index 97f876eb06f35943aa32522cf749cacaff8d388d..dfbaf7c4b8acbf2d944a46bd56333af9c91dd942 100644
--- a/python/dune/perftool/pdelab/driver.py
+++ b/python/dune/perftool/pdelab/driver.py
@@ -777,30 +777,43 @@ def define_compositegfs_parameterfunction(name, *children):
                                                                     ', '.join(children))
 
 
+def expression_splitter(expr, length):
+    if expr is None:
+        return (None,) * length
+    else:
+        from dune.perftool.ufl.execution import split_expression
+        return split_expression(expr)
+
+
 @symbol
-def name_boundary_function(expr):
+def _name_boundary_function(element, boundary, name=None):
     from ufl import MixedElement, VectorElement, TensorElement
-    if isinstance(expr, (VectorElement, TensorElement)):
-        element, (_, boundary) = get_constraints_metadata(expr)
+    if isinstance(element, (VectorElement, TensorElement)):
         from dune.perftool.generation import get_global_context_value
-        name = get_global_context_value("data").object_names.get(id(boundary), "zero")
-        define_boundary_function(boundary, name)
-        return name
-    if isinstance(expr, MixedElement):
-        children = tuple(name_boundary_function(el) for el in expr.sub_elements())
+        basename = get_global_context_value("data").object_names.get(id(boundary), "veczero")
+        children = tuple(_name_boundary_function(el, exp, basename + '_' + str(i)) for el, exp, i in zip(element.sub_elements(), expression_splitter(boundary, element.num_sub_elements()), range(element.num_sub_elements())))
+        define_compositegfs_parameterfunction(basename, *children)
+        return basename
+    if isinstance(element, MixedElement):
+        children = tuple(name_boundary_function(el) for el in element.sub_elements())
         name = '_'.join(children)
         define_compositegfs_parameterfunction(name, *children)
         return name
 
-    # This is a scalar leaf of the ansatz function tree
-    element, (_, boundary) = get_constraints_metadata(expr)
-
     from dune.perftool.generation import get_global_context_value
-    name = get_global_context_value("data").object_names.get(id(boundary), "zero")
+    if name is None:
+        name = get_global_context_value("data").object_names.get(id(boundary), "zero")
 
     define_boundary_function(boundary, name)
     return name
 
+def name_boundary_function(expr):
+    # This is a scalar leaf of the ansatz function tree
+    element, (_, boundary) = get_constraints_metadata(expr)
+
+    return _name_boundary_function(element, boundary)
+
+
 
 @symbol
 def name_solution_function(expr):
diff --git a/test/stokes/stokes.ufl b/test/stokes/stokes.ufl
index e88a011ad8f96852c9a7af2d2cdcde5b835e50da..da632caf9ecbf0f93eb5aa1c70cd5df17aba01b6 100644
--- a/test/stokes/stokes.ufl
+++ b/test/stokes/stokes.ufl
@@ -1,6 +1,6 @@
 v_bctype = Expression("if (x[0] < 1. - 1e-8) return 1; else return 0;", on_intersection=True)
 g_v = Expression(("4*x[1]*(1.-x[1])", "0.0"))
-g_p = Expression("8*x[0]")
+g_p = Expression("8*(1.-x[0])")
 
 g = g_v * g_p
 
diff --git a/test/stokes/stokes_stress.ufl b/test/stokes/stokes_stress.ufl
index 9eb4f3b750e26bb930acda17387da3644773d044..71a323994f8d5d7e39e3565c527935a11259f310 100644
--- a/test/stokes/stokes_stress.ufl
+++ b/test/stokes/stokes_stress.ufl
@@ -1,8 +1,10 @@
 v_bctype = Expression("if (x[0] < 1. - 1e-8) return 1; else return 0;", on_intersection=True)
-v_dirichlet = Expression("Dune::FieldVector<double, 2> y(0.0); y[0] = 4*x[1]*(1.-x[1]); return y;")
+g_v = Expression(("4*x[1]*(1.-x[1])", "0.0"))
+g_p = Expression("8*(1.-x[0])")
+g = g_v * g_p
 
 cell = triangle
-P2 = VectorElement("Lagrange", cell, 2, dirichlet_constraints=v_bctype, dirichlet_expression=v_dirichlet)
+P2 = VectorElement("Lagrange", cell, 2, dirichlet_constraints=v_bctype, dirichlet_expression=g_v)
 P1 = FiniteElement("Lagrange", cell, 1)
 P2_stress = TensorElement("Lagrange", cell, 2)