diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc
index 70414dd3a1e7f910f7a73beaa3c1cb74a604a34f..126ed3ee58b83f6bdeff641528df1defdf6aa349 100644
--- a/dune/gfe/riemanniantrsolver.cc
+++ b/dune/gfe/riemanniantrsolver.cc
@@ -17,6 +17,7 @@
 #include <dune/solvers/transferoperators/truncatedcompressedmgtransfer.hh>
 #include <dune/solvers/transferoperators/mandelobsrestrictor.hh>
 #include <dune/solvers/solvers/iterativesolver.hh>
+#include <dune/solvers/solvers/loopsolver.hh>
 #include "maxnormtrustregion.hh"
 
 #include <dune/solvers/norms/twonorm.hh>
@@ -74,21 +75,15 @@ setup(const GridType& grid,
 
 #ifdef HAVE_IPOPT
     // First create an IPOpt base solver
-    auto  baseSolver = std::make_shared<QuadraticIPOptSolver<MatrixType,CorrectionType> >();
-    baseSolver->setVerbosity(NumProc::QUIET);
-    baseSolver->setTolerance(baseTolerance);
+    QuadraticIPOptSolver<MatrixType,CorrectionType> baseSolver;
+    baseSolver.setSolverParameter(baseTolerance, 100, NumProc::QUIET);
 #else
-    // First create a Gauss-seidel base solver
-    auto baseSolverStep = std::make_shared<TrustRegionGSStep<MatrixType, CorrectionType> >();
-
     // Hack: the two-norm may not scale all that well, but it is fast!
-    auto baseNorm = std::make_shared<TwoNorm<CorrectionType> >();
-
-    auto baseSolver = std::make_shared<::LoopSolver<CorrectionType> >(baseSolverStep,
-                                                                            baseIterations,
-                                                                            baseTolerance,
-                                                                            baseNorm,
-                                                                            Solver::QUIET);
+    ::LoopSolver<CorrectionType> baseSolver(TrustRegionGSStep<MatrixType, CorrectionType>{},
+                                                        baseIterations,
+                                                        baseTolerance,
+                                                        TwoNorm<CorrectionType>{},
+                                                        Solver::QUIET);
 #endif
 #if HAVE_MPI
     // Transfer all Dirichlet data to the master processor
@@ -108,10 +103,10 @@ setup(const GridType& grid,
     auto mmgStep = std::make_shared<MonotoneMGStep<MatrixType, CorrectionType> >();
 
     mmgStep->setMGType(mu, nu1, nu2);
-    mmgStep->ignoreNodes_ = globalDirichletNodes;
-    mmgStep->setBaseSolver(baseSolver);
+    mmgStep->setIgnore(*globalDirichletNodes);
+    mmgStep->setBaseSolver(std::move(baseSolver));
     mmgStep->setSmoother(smoother);
-    mmgStep->setObstacleRestrictor(std::make_shared<MandelObstacleRestrictor<CorrectionType> >());
+    mmgStep->setObstacleRestrictor(MandelObstacleRestrictor<CorrectionType>{});
     mmgStep->setVerbosity(Solver::QUIET);
 
     // //////////////////////////////////////////////////////////////////////////////////////
@@ -301,7 +296,6 @@ void RiemannianTrustRegionSolver<Basis,TargetSpace>::solve()
     if (dynamic_cast<LoopSolver<CorrectionType>*>(innerSolver_.get())) {
         auto loopSolver = std::dynamic_pointer_cast<LoopSolver<CorrectionType> >(innerSolver_);
         mgStep = dynamic_cast<MonotoneMGStep<MatrixType,CorrectionType>*>(&loopSolver->getIterationStep());
-
     }
 
 #if HAVE_MPI