diff --git a/src/assemblers.cc b/src/assemblers.cc
index 280b24f4f6ee854a4ce4073b1c75d5fe6cc8fe96..6b66fa445f9f83aa1cb0b44f058b0a6c153e7887 100644
--- a/src/assemblers.cc
+++ b/src/assemblers.cc
@@ -5,6 +5,7 @@
 #include <dune/istl/scaledidmatrix.hh>
 
 #include <dune/fufem/boundarypatch.hh>
+#include <dune/fufem/functions/basisgridfunction.hh>
 #include <dune/fufem/functions/constantfunction.hh>
 #include <dune/fufem/assemblers/localassemblers/boundarymassassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/l2functionalassembler.hh>
@@ -12,6 +13,7 @@
 #include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/stvenantkirchhoffassembler.hh>
 #include <dune/fufem/assemblers/localassemblers/viscosityassembler.hh>
+#include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh>
 
 #include <dune/tectonic/globalruinanonlinearity.hh>
 
@@ -19,8 +21,10 @@
 
 template <class GridView, int dimension>
 MyAssembler<GridView, dimension>::MyAssembler(GridView const &_gridView)
-    : vertexBasis(_gridView),
+    : cellBasis(_gridView),
+      vertexBasis(_gridView),
       gridView(_gridView),
+      cellAssembler(cellBasis, cellBasis),
       vertexAssembler(vertexBasis, vertexBasis) {}
 
 template <class GridView, int dimension>
@@ -111,4 +115,16 @@ auto MyAssembler<GridView, dimension>::assembleFrictionNonlinearity(
       frictionalNodes, weights, fd);
 }
 
+template <class GridView, int dimension>
+void MyAssembler<GridView, dimension>::assembleVonMisesStress(
+    double youngModulus, double poissonRatio, Vector const &u,
+    ScalarVector &stress) {
+  auto const gridDisplacement =
+      std::make_shared<BasisGridFunction<VertexBasis, Vector> const>(
+          vertexBasis, u);
+  VonMisesStressAssembler<Grid, LocalCellBasis> localStressAssembler(
+      youngModulus, poissonRatio, gridDisplacement);
+  cellAssembler.assembleFunctional(localStressAssembler, stress);
+}
+
 #include "assemblers_tmpl.cc"
diff --git a/src/assemblers.hh b/src/assemblers.hh
index 36f1d357359ad1ae04ff75a83122ec27c3ed758f..aa5ad3e395172362ab3fcb002aff57da03e4c5bb 100644
--- a/src/assemblers.hh
+++ b/src/assemblers.hh
@@ -7,6 +7,10 @@
 #include <dune/istl/bvector.hh>
 
 #include <dune/fufem/assemblers/assembler.hh>
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wsign-compare"
+#include <dune/fufem/functionspacebases/p0basis.hh>
+#pragma clang diagnostic pop
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 
 #include <dune/tectonic/globalnonlinearity.hh>
@@ -19,15 +23,21 @@ template <class GridView, int dimension> class MyAssembler {
   using ScalarVector = Dune::BlockVector<Dune::FieldVector<double, 1>>;
   using Vector = Dune::BlockVector<Dune::FieldVector<double, dimension>>;
 
+  using CellBasis = P0Basis<GridView, double>;
   using VertexBasis = P1NodalBasis<GridView, double>;
+
+  CellBasis cellBasis;
   VertexBasis vertexBasis;
 
 private:
   using Grid = typename GridView::Grid;
   using LocalVector = typename Vector::block_type;
+
+  using LocalCellBasis = typename CellBasis::LocalFiniteElement;
   using LocalVertexBasis = typename VertexBasis::LocalFiniteElement;
 
   GridView const &gridView;
+  Assembler<CellBasis, CellBasis> cellAssembler;
   Assembler<VertexBasis, VertexBasis> vertexAssembler;
 
 public:
@@ -56,6 +66,9 @@ template <class GridView, int dimension> class MyAssembler {
   assembleFrictionNonlinearity(
       BoundaryPatch<GridView> const &frictionalBoundary,
       FrictionData const &fd);
+
+  void assembleVonMisesStress(double youngModulus, double poissonRatio,
+                              Vector const &u, ScalarVector &stress);
 };
 
 #endif
diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 657e4a4b5d6415ee90303f7e52a8a7c639a8e116..1c31f16fe75a4180e9e980675848930b3a8de71f 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -49,17 +49,10 @@
 #include <dune/istl/bcrsmatrix.hh>
 #include <dune/istl/bvector.hh>
 
-#include <dune/fufem/assemblers/assembler.hh>
-#include <dune/fufem/assemblers/localassemblers/vonmisesstressassembler.hh>
 #include <dune/fufem/boundarypatch.hh>
 #include <dune/fufem/dunepython.hh>
 #include <dune/fufem/functions/basisgridfunction.hh>
 
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wsign-compare"
-#include <dune/fufem/functionspacebases/p0basis.hh>
-#pragma clang diagnostic pop
-
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 #include <dune/fufem/sharedpointermap.hh>
 #include <dune/solvers/norms/energynorm.hh>
@@ -145,11 +138,6 @@ int main(int argc, char *argv[]) {
     GridView const leafView = grid->leafView();
     // }}}
 
-    // Set up bases
-    using P0Basis = P0Basis<GridView, double>;
-    P0Basis const p0Basis(leafView);
-    Assembler<P0Basis, P0Basis> const p0Assembler(p0Basis, p0Basis);
-
     // Set up the boundary
     Dune::BitSetVector<dims> velocityDirichletNodes(fineVertexCount, false);
     Dune::BitSetVector<dims> const &displacementDirichletNodes =
@@ -470,16 +458,11 @@ int main(int argc, char *argv[]) {
       relaxationWriter << std::endl;
 
       if (parset.get<bool>("io.writeVTK")) {
-        auto const gridDisplacement = std::make_shared<
-            BasisGridFunction<typename MyAssembler::VertexBasis, Vector> const>(
-            myAssembler.vertexBasis, u);
         ScalarVector vonMisesStress;
-        VonMisesStressAssembler<Grid, P0Basis::LocalFiniteElement>
-        localStressAssembler(youngModulus, poissonRatio, gridDisplacement);
-        p0Assembler.assembleFunctional(localStressAssembler, vonMisesStress);
-
-        writeVtk(myAssembler.vertexBasis, u, alpha, p0Basis, vonMisesStress,
-                 (boost::format("obs%d") % run).str());
+        myAssembler.assembleVonMisesStress(youngModulus, poissonRatio, u,
+                                           vonMisesStress);
+        writeVtk(myAssembler.vertexBasis, u, alpha, myAssembler.cellBasis,
+                 vonMisesStress, (boost::format("obs%d") % run).str());
       }
     }
     iterationWriter.close();