diff --git a/src/fixedpointiterator.cc b/src/fixedpointiterator.cc
index b8fa3e55173cac8f270b50ca7688a6bf18cfd851..295574802fee524025492d400cde0a7258b445c5 100644
--- a/src/fixedpointiterator.cc
+++ b/src/fixedpointiterator.cc
@@ -19,7 +19,7 @@ FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::
     FixedPointIterator(Factory &factory, Dune::ParameterTree const &parset,
                        std::shared_ptr<Nonlinearity> globalFriction,
                        ErrorNorm const &errorNorm)
-    : factory_(factory),
+    : step_(factory.getStep()),
       parset_(parset),
       globalFriction_(globalFriction),
       fixedPointMaxIterations_(parset.get<size_t>("v.fpi.maximumIterations")),
@@ -38,12 +38,10 @@ FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::run(
     std::shared_ptr<VelocityUpdater> velocityUpdater,
     Matrix const &velocityMatrix, Vector const &velocityRHS,
     Vector &velocityIterate) {
-  auto multigridStep = factory_.getStep();
-
   EnergyNorm<Matrix, Vector> energyNorm(velocityMatrix);
-  LoopSolver<Vector> velocityProblemSolver(
-      multigridStep.get(), velocityMaxIterations_, velocityTolerance_,
-      &energyNorm, verbosity_, false); // absolute error
+  LoopSolver<Vector> velocityProblemSolver(step_.get(), velocityMaxIterations_,
+                                           velocityTolerance_, &energyNorm,
+                                           verbosity_, false); // absolute error
 
   size_t fixedPointIteration;
   size_t multigridIterations = 0;
@@ -56,7 +54,7 @@ FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::run(
     ConvexProblem convexProblem(1.0, velocityMatrix, *globalFriction_,
                                 velocityRHS, velocityIterate);
     BlockProblem velocityProblem(parset_, convexProblem);
-    multigridStep->setProblem(velocityIterate, velocityProblem);
+    step_->setProblem(velocityIterate, velocityProblem);
     velocityProblemSolver.preprocess();
     velocityProblemSolver.solve();
 
diff --git a/src/fixedpointiterator.hh b/src/fixedpointiterator.hh
index f7c8ccec5d1c286d7e4d8a00e2508da96cc07acf..56ba7f28bce2c5e1ef9dd09bd623de1a2f934e53 100644
--- a/src/fixedpointiterator.hh
+++ b/src/fixedpointiterator.hh
@@ -38,7 +38,7 @@ class FixedPointIterator {
       Vector &velocityIterate);
 
 private:
-  Factory &factory_;
+  std::shared_ptr<typename Factory::Step> step_;
   Dune::ParameterTree const &parset_;
   std::shared_ptr<Nonlinearity> globalFriction_;
 
diff --git a/src/solverfactory.hh b/src/solverfactory.hh
index 9135328973f7bd3a272cf5da7c02eb7177c12141..055401f455b79cc03abe8ebf87817a5216c52f7e 100644
--- a/src/solverfactory.hh
+++ b/src/solverfactory.hh
@@ -26,10 +26,11 @@ class SolverFactory {
 
 private:
   using NonlinearSmoother = GenericNonlinearGS<BlockProblem>;
+
+public:
   using Step =
       TruncatedNonsmoothNewtonMultigrid<BlockProblem, NonlinearSmoother>;
 
-public:
   SolverFactory(Dune::ParameterTree const &parset, size_t refinements,
                 Grid const &grid, Dune::BitSetVector<dim> const &ignoreNodes);