diff --git a/dune/solvers/iterationsteps/mmgstep.cc b/dune/solvers/iterationsteps/mmgstep.cc
index 4ed55d968e29865768f7152762f34d3f46c3e56e..a9d5f8ca363ee9d82df503f7bff55412275cc077 100644
--- a/dune/solvers/iterationsteps/mmgstep.cc
+++ b/dune/solvers/iterationsteps/mmgstep.cc
@@ -66,8 +66,8 @@ preprocess()
 
         typedef ProjectedBlockGSStep<MatrixType, VectorType> SmootherType;
 
-        dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->hasObstacle_ = hasObstacleHierarchy_[0].get();
-        dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep())->obstacles_   = obstacleHierarchy_[0].get();
+        std::dynamic_pointer_cast<SmootherType>(loopBaseSolver->getIterationStep())->hasObstacle_ = hasObstacleHierarchy_[0].get();
+        std::dynamic_pointer_cast<SmootherType>(loopBaseSolver->getIterationStep())->obstacles_   = obstacleHierarchy_[0].get();
 
 #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 af839dc1f49fe0262afda5a6d3e6e041e9535a27..ad4523a192221cee723ec102e965301b2a50d92f 100644
--- a/dune/solvers/iterationsteps/multigridstep.cc
+++ b/dune/solvers/iterationsteps/multigridstep.cc
@@ -154,10 +154,10 @@ void MultigridStep<MatrixType, VectorType, BitVectorType>::preprocess()
 
             DuneSolversLoopSolver* loopBaseSolver = dynamic_cast<DuneSolversLoopSolver*> (this->basesolver_.get());
 
-            assert(dynamic_cast<SmootherType*>(&loopBaseSolver->getIterationStep()));
+            assert(std::dynamic_pointer_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]);
+            std::dynamic_pointer_cast<SmootherType>(loopBaseSolver->getIterationStep())->setProblem(*(this->matrixHierarchy_[0]), *this->xHierarchy_[0], this->rhsHierarchy_[0]);
+            std::dynamic_pointer_cast<SmootherType>(loopBaseSolver->getIterationStep())->setIgnore(*ignoreNodesHierarchy_[0]);
 
         }
         else if (dynamic_cast<LinearSolverType*>(this->basesolver_.get())) {