diff --git a/src/mysolver_tmpl.cc b/src/mysolver_tmpl.cc
index a4e7953fdfb4ca84f1dae84895c3a15ec95fcabb..26ef6cc9bfbfc26f9fc732ac616d4be5da269b45 100644
--- a/src/mysolver_tmpl.cc
+++ b/src/mysolver_tmpl.cc
@@ -13,10 +13,12 @@
 #include <dune/istl/bcrsmatrix.hh>
 #include <dune/istl/bvector.hh>
 
+#include <dune/tnnmg/nonlinearities/zerononlinearity.hh>
 #include <dune/tnnmg/problem-classes/convexproblem.hh>
 
 #include <dune/tectonic/globalnonlinearity.hh>
 #include <dune/tectonic/myblockproblem.hh>
+#include <dune/tnnmg/problem-classes/blocknonlineartnnmgproblem.hh>
 
 using SmallVector = Dune::FieldVector<double, DIM>;
 using SmallMatrix = Dune::FieldMatrix<double, DIM, DIM>;
@@ -29,3 +31,7 @@ template class MySolver<
     DIM, MyBlockProblem<ConvexProblem<
              Dune::GlobalNonlinearity<MatrixType, VectorType>, MatrixType>>,
     GridType>;
+template class MySolver<
+    DIM, BlockNonlinearTNNMGProblem<ConvexProblem<
+             ZeroNonlinearity<SmallVector, SmallMatrix>, MatrixType>>,
+    GridType>;
diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 913318103881283ce1163962f29a3d96a5653f0f..e2e22ba33b1672273ad745cc1dde6fd28a7d9b03 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -64,12 +64,13 @@
 #include <dune/fufem/functionspacebases/p0basis.hh>
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 #include <dune/fufem/sharedpointermap.hh>
-#include <dune/solvers/iterationsteps/blockgsstep.hh>
 #include <dune/solvers/norms/energynorm.hh>
 #include <dune/solvers/norms/sumnorm.hh>
 #include <dune/solvers/solvers/loopsolver.hh>
 #include <dune/solvers/solvers/solver.hh> // Solver::FULL
 #include <dune/tnnmg/problem-classes/convexproblem.hh>
+#include <dune/tnnmg/nonlinearities/zerononlinearity.hh>
+#include <dune/tnnmg/problem-classes/blocknonlineartnnmgproblem.hh>
 
 #include <dune/tectonic/myblockproblem.hh>
 #include <dune/tectonic/globalnonlinearity.hh>
@@ -350,6 +351,12 @@ int main(int argc, char *argv[]) {
     alpha_initial =
         std::log(parset.get<double>("boundary.friction.initial_state"));
 
+    using LinearFactoryType = MySolver<
+        dims, BlockNonlinearTNNMGProblem<ConvexProblem<
+                  ZeroNonlinearity<SmallVector, SmallMatrix>, MatrixType>>,
+        GridType>;
+    ZeroNonlinearity<SmallVector, SmallMatrix> zeroNonlinearity;
+
     VectorType u_initial(finestSize);
     u_initial = 0.0;
 
@@ -378,15 +385,28 @@ int main(int argc, char *argv[]) {
         problem_rhs_initial -= ell;
         problem_rhs_initial *= -1.0;
       }
-      BlockGSStep<MatrixType, VectorType> accelerationSolverStep(
-          M, a_initial, problem_rhs_initial);
-      accelerationSolverStep.ignoreNodes_ = &accelerationDirichletNodes;
-      LoopSolver<VectorType> accelerationSolver(&accelerationSolverStep,
-                                                100000,               // FIXME
-                                                1e-12,                // FIXME
-                                                &MNorm, Solver::FULL, // FIXME
-                                                false); // absolute error
-      accelerationSolver.solve();
+      LinearFactoryType accelerationFactory(parset.sub("solver.tnnmg"), // FIXME
+                                            refinements, 1e-12, // FIXME,
+                                            *grid, accelerationDirichletNodes);
+      auto multigridStep = accelerationFactory.getSolver();
+      Solver::VerbosityMode const verbosity =
+          parset.get<bool>("verbose") ? Solver::FULL : Solver::QUIET;
+
+      typename LinearFactoryType::ConvexProblemType myConvexProblem(
+          1.0, M, zeroNonlinearity, problem_rhs_initial, a_initial);
+      typename LinearFactoryType::BlockProblemType initialAccelerationProblem(
+          parset, myConvexProblem);
+
+      multigridStep->setProblem(a_initial, initialAccelerationProblem);
+      LoopSolver<VectorType> initialAccelerationProblemSolver(
+          multigridStep,
+          parset.get<size_t>("solver.tnnmg.maxiterations"), // FIXME
+          1e-12,                                            // FIXME
+          &MNorm,                                           // FIXME
+          verbosity, false);                                // absolute error
+
+      initialAccelerationProblemSolver.preprocess();
+      initialAccelerationProblemSolver.solve();
     }
     // }}}