diff --git a/dune/solvers/iterationsteps/multigridstep.hh b/dune/solvers/iterationsteps/multigridstep.hh
index b7939bad2a7232e3e7c872269523eafa2362dd8f..7b22bf088c10f1e9a58e4ba31c7cf5daeebb9719 100644
--- a/dune/solvers/iterationsteps/multigridstep.hh
+++ b/dune/solvers/iterationsteps/multigridstep.hh
@@ -160,10 +160,11 @@ namespace Dune {
             levelWiseSmoothers_.clear();
         }
 
-        /** \brief Set the smoother iteration step from a smart pointer*/
-        virtual void setSmoother(std::shared_ptr<LinearStepType> smoother)
+        /** \brief Set the smoother iteration step from a smart pointer, reference or temporary*/
+        template <class Smoother, class = std::enable_if_t<not std::is_pointer<Smoother>::value> >
+        void setSmoother(Smoother&& smoother)
         {
-            presmootherDefault_ = postsmootherDefault_ = smoother;
+            presmootherDefault_ = postsmootherDefault_ = wrap_own_share<LinearStepType>(std::forward<Smoother>(smoother));
 
             levelWiseSmoothers_.clear();
         }
@@ -178,11 +179,10 @@ namespace Dune {
             levelWiseSmoothers_.clear();
         }
 
-        virtual void setSmoother(std::shared_ptr<LinearStepType> preSmoother,
-                                 std::shared_ptr<LinearStepType> postSmoother)
-        {
-                presmootherDefault_  = std::move(preSmoother);
-                postsmootherDefault_ = std::move(postSmoother);
+        template <class Smoother, class = std::enable_if_t<not std::is_pointer<Smoother>::value> >
+        void setSmoother(Smoother&& preSmoother, Smoother&& postSmoother) {
+            presmootherDefault_  = wrap_own_share<LinearStepType>(std::forward<Smoother>(preSmoother));
+            postsmootherDefault_ = wrap_own_share<LinearStepType>(std::forward<Smoother>(postSmoother));
 
             levelWiseSmoothers_.clear();
         }
@@ -194,9 +194,10 @@ namespace Dune {
         }
 
         /** \brief Set the smoother iteration step for a particular level, from a smart pointer */
-        virtual void setSmoother(std::shared_ptr<LinearStepType> smoother, std::size_t level)
+        template <class Smoother, class = std::enable_if_t<not std::is_pointer<Smoother>::value> >
+        void setSmoother(Smoother&& smoother, std::size_t level)
         {
-            levelWiseSmoothers_[level] = smoother;
+            levelWiseSmoothers_[level] = wrap_own_share<LinearStepType>(std::forward<Smoother>(smoother));
         }
 
         /** \brief Set base solver */