diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 1c31f16fe75a4180e9e980675848930b3a8de71f..4b56ab139f35aa23555ec3c9ddfcc39165025aeb 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -320,6 +320,10 @@ int main(int argc, char *argv[]) {
     FrictionWriter<Dune::BitSetVector<1>> writer(frictionData, frictionalNodes);
     writer.writeInfo(alpha_initial, u_initial, v_initial);
 
+    MyVTKWriter<typename MyAssembler::VertexBasis,
+                typename MyAssembler::CellBasis>
+    vtkWriter(myAssembler.cellBasis, myAssembler.vertexBasis, "obs");
+
     // Set up TNNMG solver
     using NonlinearFactory =
         SolverFactory<dims, MyBlockProblem<ConvexProblem<
@@ -458,11 +462,10 @@ int main(int argc, char *argv[]) {
       relaxationWriter << std::endl;
 
       if (parset.get<bool>("io.writeVTK")) {
-        ScalarVector vonMisesStress;
+        ScalarVector stress;
         myAssembler.assembleVonMisesStress(youngModulus, poissonRatio, u,
-                                           vonMisesStress);
-        writeVtk(myAssembler.vertexBasis, u, alpha, myAssembler.cellBasis,
-                 vonMisesStress, (boost::format("obs%d") % run).str());
+                                           stress);
+        vtkWriter.write(u, v, alpha, stress);
       }
     }
     iterationWriter.close();
diff --git a/src/vtk.cc b/src/vtk.cc
index 7383dfc092124fdc825238e031af06b8dfab4e12..f1a1e6dfaf227ca55d614c6238a4e86e576d52ee 100644
--- a/src/vtk.cc
+++ b/src/vtk.cc
@@ -8,28 +8,45 @@
 
 #include "vtk.hh"
 
-template <class VertexBasis, class CellBasis, class Vector, class ScalarVector>
-void writeVtk(VertexBasis const &vertexBasis, Vector const &displacement,
-              ScalarVector const &logState, CellBasis const &cellBasis,
-              ScalarVector const &stress, std::string const &filename) {
+template <class VertexBasis, class CellBasis>
+MyVTKWriter<VertexBasis, CellBasis>::MyVTKWriter(
+    CellBasis const &_cellBasis, VertexBasis const &_vertexBasis,
+    std::string _prefix)
+    : cellBasis(_cellBasis),
+      vertexBasis(_vertexBasis),
+      prefix(_prefix),
+      counter(0) {}
+
+template <class VertexBasis, class CellBasis>
+template <class Vector, class ScalarVector>
+void MyVTKWriter<VertexBasis, CellBasis>::write(Vector const &u,
+                                                Vector const &v,
+                                                ScalarVector const &alpha,
+                                                ScalarVector const &stress) {
   Dune::VTKWriter<typename VertexBasis::GridView> writer(
       vertexBasis.getGridView());
 
   auto const displacementPointer =
       std::make_shared<VTKBasisGridFunction<VertexBasis, Vector> const>(
-          vertexBasis, displacement, "displacement");
+          vertexBasis, u, "displacement");
   writer.addVertexData(displacementPointer);
 
+  auto const velocityPointer =
+      std::make_shared<VTKBasisGridFunction<VertexBasis, Vector> const>(
+          vertexBasis, v, "velocity");
+  writer.addVertexData(velocityPointer);
+
   auto const logStatePointer =
       std::make_shared<VTKBasisGridFunction<VertexBasis, ScalarVector> const>(
-          vertexBasis, logState, "logState");
+          vertexBasis, alpha, "logState");
   writer.addVertexData(logStatePointer);
 
-  auto const vonmisesPointer =
+  auto const stressPointer =
       std::make_shared<VTKBasisGridFunction<CellBasis, ScalarVector> const>(
           cellBasis, stress, "stress");
-  writer.addCellData(vonmisesPointer);
+  writer.addCellData(stressPointer);
 
+  std::string const filename = prefix + std::to_string(counter++);
   writer.write(filename.c_str());
 }
 
diff --git a/src/vtk.hh b/src/vtk.hh
index 5b06cd0aa691acfc6d60488228307f667e393e32..e1e19c05e4cd7bc27825b3a65f1c51379043ade8 100644
--- a/src/vtk.hh
+++ b/src/vtk.hh
@@ -1,9 +1,20 @@
 #ifndef VTK_HH
 #define VTK_HH
 
-template <class VertexBasis, class CellBasis, class Vector, class ScalarVector>
-void writeVtk(VertexBasis const &vertexBasis, Vector const &displacement,
-              ScalarVector const &logState, CellBasis const &cellBasis,
-              ScalarVector const &stress, std::string const &filename);
+template <class VertexBasis, class CellBasis> class MyVTKWriter {
+  CellBasis const &cellBasis;
+  VertexBasis const &vertexBasis;
+  std::string const prefix;
+
+  size_t counter;
+
+public:
+  MyVTKWriter(CellBasis const &cellBasis, VertexBasis const &vertexBasis,
+              std::string prefix);
+
+  template <class Vector, class ScalarVector>
+  void write(Vector const &u, Vector const &v, ScalarVector const &alpha,
+             ScalarVector const &stress);
+};
 
 #endif
diff --git a/src/vtk_tmpl.cc b/src/vtk_tmpl.cc
index bad777b6f2b6bf1027defaaddac8ce5b3ce14bef..027d42f977807e2259f689f9164814802bceed6a 100644
--- a/src/vtk_tmpl.cc
+++ b/src/vtk_tmpl.cc
@@ -8,10 +8,11 @@
 #include <dune/fufem/functionspacebases/p0basis.hh>
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 
-using P1Basis = P1NodalBasis<GridView, double>;
 using MyP0Basis = P0Basis<GridView, double>;
+using P1Basis = P1NodalBasis<GridView, double>;
+
+template class MyVTKWriter<P1Basis, MyP0Basis>;
 
-template void writeVtk<P1Basis, MyP0Basis, Vector, ScalarVector>(
-    P1Basis const &vertexBasis, Vector const &displacement,
-    ScalarVector const &logState, MyP0Basis const &cellBasis,
-    ScalarVector const &stress, std::string const &filename);
+template void MyVTKWriter<P1Basis, MyP0Basis>::write<Vector, ScalarVector>(
+    Vector const &u, Vector const &v, ScalarVector const &alpha,
+    ScalarVector const &stress);