diff --git a/dune/solvers/iterationsteps/multigridstep.cc b/dune/solvers/iterationsteps/multigridstep.cc
index e49ad6489a385147c492acc52030cf24f62a0b6a..0361d6d34b1adadc0e1c7959a77e985cebb0f4c1 100644
--- a/dune/solvers/iterationsteps/multigridstep.cc
+++ b/dune/solvers/iterationsteps/multigridstep.cc
@@ -156,25 +156,18 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess()
     if (basesolver_)
     {
         // If the base solver can ignore dofs give it the ignoreNodes field
-        if (dynamic_cast<CanIgnore<BitVectorType>*>(this->basesolver_.get()))
-            dynamic_cast<CanIgnore<BitVectorType>*>(this->basesolver_.get())->setIgnore(*ignoreNodesHierarchy_[0]);
+        if (auto canIgnore = std::dynamic_pointer_cast< CanIgnore<BitVectorType> >(this->basesolver_))
+            canIgnore->setIgnore(*ignoreNodesHierarchy_[0]);
 
         typedef ::LoopSolver<VectorType> DuneSolversLoopSolver;
 
-        if (dynamic_cast<DuneSolversLoopSolver*>(this->basesolver_.get())) {
-
-            DuneSolversLoopSolver* loopBaseSolver = dynamic_cast<DuneSolversLoopSolver*> (this->basesolver_.get());
-
-            assert(dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep()));
-
-            dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]);
-            dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->setIgnore(*ignoreNodesHierarchy_[0]);
-
+        if (auto loopBaseSolver = std::dynamic_pointer_cast<DuneSolversLoopSolver>(this->basesolver_)) {
+            auto iterationStep = dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep());
+            assert(iterationStep);
+            iterationStep->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]);
+            iterationStep->setIgnore(*ignoreNodesHierarchy_[0]);
         }
-        else if (dynamic_cast<LinearSolverType*>(this->basesolver_.get())) {
-
-            LinearSolverType* linearBaseSolver = dynamic_cast<LinearSolverType*> (this->basesolver_.get());
-
+        else if (auto linearBaseSolver = std::dynamic_pointer_cast<LinearSolverType>(this->basesolver_)) {
             linearBaseSolver->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]);
         }
         else {