diff --git a/src/fixedpointiterator.cc b/src/fixedpointiterator.cc
index 4bc8dee70b45e5dd98d705401d7c52e35424dc62..e08ef8715ca81df6ae30e55b967afe1300e0d0f7 100644
--- a/src/fixedpointiterator.cc
+++ b/src/fixedpointiterator.cc
@@ -42,8 +42,8 @@ FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::run(
 
   EnergyNorm<Matrix, Vector> energyNorm(velocityMatrix);
   LoopSolver<Vector> velocityProblemSolver(
-      multigridStep, velocityMaxIterations_, velocityTolerance_, &energyNorm,
-      verbosity_, false); // absolute error
+      multigridStep.get(), velocityMaxIterations_, velocityTolerance_,
+      &energyNorm, verbosity_, false); // absolute error
 
   size_t fixedPointIteration;
   size_t multigridIterations = 0;
diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc
index 1cf9d0ba4b9b2043ebe7f6e63e4cbde5a80654ab..99616319383e8d22bfd4f4aeef37cff36f9dd2e0 100644
--- a/src/sand-wedge.cc
+++ b/src/sand-wedge.cc
@@ -238,7 +238,7 @@ int main(int argc, char *argv[]) {
       auto multigridStep = factory.getSolver();
       multigridStep->setProblem(_x, problem);
       LoopSolver<Vector> solver(
-          multigridStep, _localParset.get<size_t>("maximumIterations"),
+          multigridStep.get(), _localParset.get<size_t>("maximumIterations"),
           _localParset.get<double>("tolerance"), &_norm,
           _localParset.get<Solver::VerbosityMode>("verbosity"),
           false); // absolute error
diff --git a/src/solverfactory.cc b/src/solverfactory.cc
index 81f06b4bffa2c386cf00279ae8475da022a3d8de..2d58ea178322d5e34f3c51fb216f97d99468266f 100644
--- a/src/solverfactory.cc
+++ b/src/solverfactory.cc
@@ -21,7 +21,8 @@ SolverFactory<dim, BlockProblem, Grid>::SolverFactory(
                        parset.get<double>("linear.tolerance"), &baseEnergyNorm,
                        Solver::QUIET),
       transferOperators(refinements),
-      multigridStep(new Solver(linearIterationStep, nonlinearSmoother)) {
+      multigridStep(
+          std::make_shared<Solver>(linearIterationStep, nonlinearSmoother)) {
   // linear iteration step
   linearIterationStep.setMGType(parset.get<int>("linear.cycle"),
                                 parset.get<int>("linear.pre"),
@@ -47,12 +48,11 @@ template <size_t dim, class BlockProblem, class Grid>
 SolverFactory<dim, BlockProblem, Grid>::~SolverFactory() {
   for (auto &&x : transferOperators)
     delete x;
-
-  delete multigridStep;
 }
 
 template <size_t dim, class BlockProblem, class Grid>
-auto SolverFactory<dim, BlockProblem, Grid>::getSolver() -> Solver * {
+auto SolverFactory<dim, BlockProblem, Grid>::getSolver()
+    -> std::shared_ptr<Solver> {
   return multigridStep;
 }
 
diff --git a/src/solverfactory.hh b/src/solverfactory.hh
index 93188af419bc08e89d8a423ff866a703aa4d2dd5..550a4f17d70a0f23b807f8e18eea43d5c6b4b3a6 100644
--- a/src/solverfactory.hh
+++ b/src/solverfactory.hh
@@ -35,7 +35,7 @@ class SolverFactory {
 
   ~SolverFactory();
 
-  Solver *getSolver();
+  std::shared_ptr<Solver> getSolver();
 
 private:
   TruncatedBlockGSStep<Matrix, Vector> linearBaseSolverStep;
@@ -46,6 +46,6 @@ class SolverFactory {
   MultigridStep<Matrix, Vector> linearIterationStep;
   std::vector<CompressedMultigridTransfer<Vector> *> transferOperators;
   NonlinearSmoother nonlinearSmoother;
-  Solver *multigridStep;
+  std::shared_ptr<Solver> multigridStep;
 };
 #endif