diff --git a/python/dune/perftool/pdelab/driver/__init__.py b/python/dune/perftool/pdelab/driver/__init__.py
index 5c70bc39b6d0f3fee5c6803475bee0f86819a30f..b441722e89122ae46d552d1efec92a32711bebbf 100644
--- a/python/dune/perftool/pdelab/driver/__init__.py
+++ b/python/dune/perftool/pdelab/driver/__init__.py
@@ -164,22 +164,37 @@ def _flatten_list(l):
         yield l
 
 
+def _unroll_list_tensors(expr):
+    from ufl.classes import ListTensor
+    if isinstance(expr, ListTensor):
+        for op in expr.ufl_operands:
+            yield op
+    else:
+        yield expr
+
+
+def unroll_list_tensors(data):
+    for expr in data:
+        for e in _unroll_list_tensors(expr):
+            yield e
+
+
 def preprocess_leaf_data(element, data):
     data = get_object(data)
     from ufl import MixedElement
     if isinstance(element, MixedElement):
-        # Dirichlet is None -> no dirichlet boundaries
+        # data is None -> use 0 default
         if data is None:
-            return (0,) * element.value_size()
-        # Dirichlet for MixedElement is not iterable -> Same
-        # constraint on all the leafs.
-        elif not isinstance(data, (tuple, list)):
-            return (data,) * element.value_size()
-        # List sizes do not match -> flatten list
-        elif len(data) != element.value_size():
-            flattened = [i for i in _flatten_list(data)]
-            assert len(flattened) == element.value_size()
-            return flattened
+            data = (0,) * element.value_size()
+
+        # Flatten nested lists
+        data = tuple(i for i in _flatten_list(data))
+
+        # Expand any list tensors
+        data = tuple(i for i in unroll_list_tensors(data))
+
+        assert len(data) == element.value_size()
+        return data
     else:
         # Do not return lists for non-MixedElement
         if not isinstance(data, (tuple, list)):
diff --git a/python/dune/perftool/pdelab/driver/constraints.py b/python/dune/perftool/pdelab/driver/constraints.py
index 4226cdb41aba355cae54e765dbcb0e8049e3079c..97b8bf9dbf41157d4c03ae7dc5493ce5d96aa65b 100644
--- a/python/dune/perftool/pdelab/driver/constraints.py
+++ b/python/dune/perftool/pdelab/driver/constraints.py
@@ -6,7 +6,8 @@ from dune.perftool.pdelab.driver import (FEM_name_mangling,
                                          get_formdata,
                                          get_trial_element,
                                          )
-from dune.perftool.pdelab.driver.gridfunctionspace import (name_leafview,
+from dune.perftool.pdelab.driver.gridfunctionspace import (name_gfs,
+                                                           name_leafview,
                                                            name_trial_gfs,
                                                            type_range,
                                                            type_trial_gfs,
@@ -51,8 +52,8 @@ def name_bctype_function(element, is_dirichlet):
         for subel in element.sub_elements():
             subgfs.append(name_gfs(subel, is_dirichlet[k:k + subel.value_size()]))
             k = k + subel.value_size()
-        name = "_".join(subgfs)
-        define_composite_bctype_function(element, is_dirichlet, name, subgfs)
+        name = "{}_bctype".format("_".join(subgfs))
+        define_composite_bctype_function(element, is_dirichlet, name, tuple(subgfs))
         return name
     else:
         assert isinstance(element, FiniteElement)
diff --git a/python/dune/perftool/pdelab/driver/gridfunctionspace.py b/python/dune/perftool/pdelab/driver/gridfunctionspace.py
index 092c00198264ff5600a43a62b9e74405e5cce47e..e264e2ab46fb2ca4d0c8a4292d2c8a8e6b7d214f 100644
--- a/python/dune/perftool/pdelab/driver/gridfunctionspace.py
+++ b/python/dune/perftool/pdelab/driver/gridfunctionspace.py
@@ -177,7 +177,7 @@ def name_test_gfs():
 
 def name_gfs(element, is_dirichlet):
     if isinstance(element, (VectorElement, TensorElement)):
-        subel = element.sub_element()[0]
+        subel = element.sub_elements()[0]
         subgfs = name_gfs(subel, is_dirichlet[:subel.value_size()])
         name = "{}_pow{}gfs".format(subgfs, element.num_sub_elements())
         define_power_gfs(element, is_dirichlet, name, subgfs)
@@ -189,7 +189,7 @@ def name_gfs(element, is_dirichlet):
             subgfs.append(name_gfs(subel, is_dirichlet[k:k + subel.value_size()]))
             k = k + subel.value_size()
         name = "_".join(subgfs)
-        define_composite_gfs(element, is_dirichlet, name, subgfs)
+        define_composite_gfs(element, is_dirichlet, name, tuple(subgfs))
         return name
     else:
         assert isinstance(element, FiniteElement)
@@ -214,7 +214,7 @@ def type_trial_gfs():
 
 def type_gfs(element, is_dirichlet):
     if isinstance(element, (VectorElement, TensorElement)):
-        subel = element.sub_element()[0]
+        subel = element.sub_elements()[0]
         subgfs = type_gfs(subel, is_dirichlet[:subel.value_size()])
         name = "{}_POW{}GFS".format(subgfs, element.num_sub_elements())
         typedef_power_gfs(element, is_dirichlet, name, subgfs)
@@ -226,7 +226,7 @@ def type_gfs(element, is_dirichlet):
             subgfs.append(type_gfs(subel, is_dirichlet[k:k + subel.value_size()]))
             k = k + subel.value_size()
         name = "_".join(subgfs)
-        typedef_composite_gfs(element, name, subgfs)
+        typedef_composite_gfs(element, name, tuple(subgfs))
         return name
     else:
         assert isinstance(element, FiniteElement)
@@ -249,6 +249,7 @@ def define_gfs(element, is_dirichlet, name):
 def define_power_gfs(element, is_dirichlet, name, subgfs):
     gv = name_leafview()
     fem = name_fem(element.sub_elements()[0])
+    gfstype = type_gfs(element, is_dirichlet)
     return "{} {}({}, {});".format(gfstype, name, gv, fem)
 
 
diff --git a/python/dune/perftool/pdelab/driver/interpolate.py b/python/dune/perftool/pdelab/driver/interpolate.py
index 78cf078e5a1ab06c8145cd4d2b338270f166908c..a3751c84785943fea71e91c06b984ba62687c607 100644
--- a/python/dune/perftool/pdelab/driver/interpolate.py
+++ b/python/dune/perftool/pdelab/driver/interpolate.py
@@ -52,7 +52,7 @@ def name_boundary_function(element, func):
             childs.append(name_boundary_function(subel, func[k:k + subel.value_size()]))
             k = k + subel.value_size()
         name = "_".join(childs)
-        define_composite_boundary_function(name, childs)
+        define_compositegfs_parameterfunction(name, tuple(childs))
         return name
     else:
         assert isinstance(element, FiniteElement)
diff --git a/python/dune/perftool/pdelab/driver/vtk.py b/python/dune/perftool/pdelab/driver/vtk.py
index 90c394b63e52d0824d3ac6c96e1317f17b2f88af..15ca6e7f132871aab9284468c369003c34add62a 100644
--- a/python/dune/perftool/pdelab/driver/vtk.py
+++ b/python/dune/perftool/pdelab/driver/vtk.py
@@ -140,7 +140,7 @@ def _define_gfs_name(element, is_dirichlet, offset=0):
     if isinstance(element, MixedElement):
         k = 0
         for subel in element.sub_elements():
-            define_gfs_name(subel, is_dirichlet[k:k + subel.value_size()], offset=offset + k)
+            _define_gfs_name(subel, is_dirichlet[k:k + subel.value_size()], offset=offset + k)
             k = k + subel.value_size()
         return []
     else:
diff --git a/test/stokes/stokes.mini b/test/stokes/stokes.mini
index abbf4487eb32501d785a17a2c79d858904e24fd2..c236f3a87ddec3867557ef6056f3096c04f4be1e 100644
--- a/test/stokes/stokes.mini
+++ b/test/stokes/stokes.mini
@@ -14,5 +14,4 @@ extension = vtu
 
 [formcompiler]
 numerical_jacobian = 0, 1 | expand num
-exact_solution_expression = g
 compare_l2errorsquared = 1e-11
diff --git a/test/stokes/stokes.ufl b/test/stokes/stokes.ufl
index 595d3ba80a40d99ae8a6d390b3c2a0cd2ee3a394..4307fbeee64a03e4ace5cb63931458ae5d9edbcf 100644
--- a/test/stokes/stokes.ufl
+++ b/test/stokes/stokes.ufl
@@ -3,10 +3,8 @@ cell = triangle
 x = SpatialCoordinate(cell)
 v_bctype = conditional(x[0] < 1. - 1e-8, 1, 0)
 g_v = as_vector((4.*x[1]*(1.-x[1]), 0.0))
-g_p = 8.*(1.-x[0])
-g = (g_v, g_p)
 
-P2 = VectorElement("Lagrange", cell, 2, dirichlet_constraints=v_bctype, dirichlet_expression=g_v)
+P2 = VectorElement("Lagrange", cell, 2)
 P1 = FiniteElement("Lagrange", cell, 1)
 TH = P2 * P1
 
@@ -16,3 +14,6 @@ u, p = TrialFunctions(TH)
 r = (inner(grad(v), grad(u)) - div(v)*p - q*div(u))*dx
 
 forms = [r]
+is_dirichlet = v_bctype, v_bctype, 0
+dirichlet_expression = g_v, None
+exact_solution = g_v, 8.*(1.-x[0])
\ No newline at end of file