diff --git a/dune/solvers/iterationsteps/mmgstep.cc b/dune/solvers/iterationsteps/mmgstep.cc
index acc6c2e73cb48d6676a0a339074d2d78fa84151e..a3ace8cf3388357650b2402cac1a5f1fd89736d6 100644
--- a/dune/solvers/iterationsteps/mmgstep.cc
+++ b/dune/solvers/iterationsteps/mmgstep.cc
@@ -74,8 +74,8 @@ preprocess()
 
         typedef ProjectedBlockGSStep<MatrixType, VectorType> SmootherType;
 
-        dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->hasObstacle_ = hasObstacleHierarchy_[0];
-        dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->obstacles_   = obstacleHierarchy_[0];
+        dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->hasObstacle_ = hasObstacleHierarchy_[0];
+        dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->obstacles_   = obstacleHierarchy_[0];
 
 #if HAVE_IPOPT
     } else if (typeid(*this->basesolver_) == typeid(QuadraticIPOptSolver<MatrixType,VectorType>)) {
diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc
index 97b1fd213d618acd9b4fe89ee4f7ca65b65527be..1d14abfe8ad60bf867c3c44b820464556d3a5bc7 100644
--- a/dune/solvers/iterationsteps/multigridstep.cc
+++ b/dune/solvers/iterationsteps/multigridstep.cc
@@ -151,10 +151,10 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess()
             DuneSolversLoopSolver* loopBaseSolver = dynamic_cast<DuneSolversLoopSolver*> (this->basesolver_.get());
 
             typedef LinearIterationStep<MatrixType, VectorType> SmootherType;
-            assert(dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_));
+            assert(dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep()));
 
-            dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]);
-            dynamic_cast<SmootherType*>(loopBaseSolver->iterationStep_)->ignoreNodes_ = ignoreNodesHierarchy_[0];
+            dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]);
+            dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setIgnore(*ignoreNodesHierarchy_[0]);
 
         }
         else if (dynamic_cast<LinearSolver<MatrixType, VectorType>*>(this->basesolver_.get())) {
diff --git a/dune/solvers/solvers/loopsolver.hh b/dune/solvers/solvers/loopsolver.hh
index bb9c11c83a989ea0a28badb65b2843eed4d6b45c..9b9465e18fdb875080580edc33cc53f854eba8a6 100644
--- a/dune/solvers/solvers/loopsolver.hh
+++ b/dune/solvers/solvers/loopsolver.hh
@@ -3,6 +3,8 @@
 #ifndef LOOP_SOLVER_HH
 #define LOOP_SOLVER_HH
 
+#include <type_traits>
+
 #include <dune/solvers/solvers/iterativesolver.hh>
 #include <dune/solvers/iterationsteps/iterationstep.hh>
 #include <dune/solvers/norms/norm.hh>
@@ -30,6 +32,7 @@ class LoopSolver : public IterativeSolver<VectorType, BitVectorType>
 public:
 
     /** \brief Constructor taking all relevant data */
+    DUNE_DEPRECATED_MSG("Handing over raw pointer in the constructor is deprecated!")
     LoopSolver(IterationStep<VectorType, BitVectorType>* iterationStep,
                int maxIterations,
                double tolerance,
@@ -39,12 +42,32 @@ public:
                const VectorType* referenceSolution=0)
         : IterativeSolver<VectorType, BitVectorType>(maxIterations,
                                                      tolerance,
-                                                     errorNorm,
+                                                     *errorNorm,
+                                                     verbosity,
+                                                     useRelativeError),
+          referenceSolution_(referenceSolution)
+    {
+        this->setIterationStep(*iterationStep);
+    }
+
+    /** \brief Constructor taking all relevant data */
+    template <class Step, class RealNorm, class Enable = std::enable_if_t<
+                not std::is_pointer<Step>::value and not std::is_pointer<RealNorm>::value> >
+    LoopSolver(Step&& iterationStep,
+               int maxIterations,
+               double tolerance,
+               RealNorm&& errorNorm,
+               Solver::VerbosityMode verbosity,
+               bool useRelativeError=true,
+               const VectorType* referenceSolution=0)
+        : IterativeSolver<VectorType, BitVectorType>(maxIterations,
+                                                     tolerance,
+                                                     std::forward<RealNorm>(errorNorm),
                                                      verbosity,
                                                      useRelativeError),
           referenceSolution_(referenceSolution)
     {
-        this->iterationStep_ = iterationStep;
+        this->setIterationStep(std::forward<Step>(iterationStep));
     }
 
     /**
diff --git a/dune/solvers/solvers/trustregionsolver.cc b/dune/solvers/solvers/trustregionsolver.cc
index e37d7dc0b1c4ea6a51c68ab939a19e34e24b2353..f552c3ae36946291fc650bff74be35e14977f909 100644
--- a/dune/solvers/solvers/trustregionsolver.cc
+++ b/dune/solvers/solvers/trustregionsolver.cc
@@ -16,7 +16,7 @@ void TrustRegionSolver<ProblemType,VectorType,MatrixType>::solve()
 
     // if the inner solver is a monotone multigrid set up a max-norm trust-region
     if (dynamic_cast<::LoopSolver<VectorType>*>(innerSolver_.get())) {
-        mgStep = dynamic_cast<MonotoneMGStep<MatrixType,VectorType>*>(dynamic_cast<::LoopSolver<VectorType>*>(innerSolver_.get())->iterationStep_);
+        mgStep = dynamic_cast<MonotoneMGStep<MatrixType,VectorType>*>(dynamic_cast<::LoopSolver<VectorType>*>(&innerSolver_.get()).getIterationStep());
 
     }
 
diff --git a/dune/solvers/solvers/trustregionsolver.hh b/dune/solvers/solvers/trustregionsolver.hh
index 04aa5cb16cd0d5d3d243956cd97a829cbf0a5b15..79fe87bdff7aee9a7b91bc92395b60d2ed15cce2 100644
--- a/dune/solvers/solvers/trustregionsolver.hh
+++ b/dune/solvers/solvers/trustregionsolver.hh
@@ -79,12 +79,13 @@ public:
 
 
     /** \brief Set up the solver. */
+    template <class Norm>
     void setup(const Dune::ParameterTree& trConfig,
-               Norm<VectorType>& errorNorm,
+               Norm&& errorNorm,
                ProblemType& problem, Solver& innerSolver) {
 
         setupTrParameter(trConfig);
-        this->errorNorm_ = &errorNorm;
+        this->setErrorNorm(std::forward<Norm>(errorNorm));
         problem_ = Dune::stackobject_to_shared_ptr(problem);
         innerSolver_ = Dune::stackobject_to_shared_ptr(innerSolver);
     }