diff --git a/dune/solvers/iterationsteps/cgstep.hh b/dune/solvers/iterationsteps/cgstep.hh
index d4f8749a7c6ff9aa3403003b68f3d0ee71ceebe3..2ef4b232bfb7bce6b1b237cae08d83b7a2f21886 100644
--- a/dune/solvers/iterationsteps/cgstep.hh
+++ b/dune/solvers/iterationsteps/cgstep.hh
@@ -47,6 +47,12 @@ namespace Dune {
                 p_.resize(r_.size());
             }
 
+            template<typename P>
+            void setPreconditioner(P&& preconditioner)
+            {
+                preconditioner_ = wrap_own_share<Preconditioner>(std::forward<P>(preconditioner));
+            }
+
             void check() const override;
             void preprocess() override;
             void iterate() override;
diff --git a/dune/solvers/test/energynormtest.cc b/dune/solvers/test/energynormtest.cc
index 9a59df8a36fe9f5ffe507c59a5a5e57db93ea641..f01c76dd932c7fce4a68e35194b10f73ccd2fd62 100644
--- a/dune/solvers/test/energynormtest.cc
+++ b/dune/solvers/test/energynormtest.cc
@@ -266,7 +266,7 @@ int main() try
     return 1;
 
   return 0;
-} catch(Dune::Exception e) {
+} catch(const Dune::Exception& e) {
   std::cout << e << std::endl;
   return 1;
 } catch(...) {
diff --git a/dune/solvers/test/sumoperatortest.cc b/dune/solvers/test/sumoperatortest.cc
index ca6c189cc2f8f04f733b3628c95a752b83811c15..e1694f028add27e519451e1d27bd279fb6e94de8 100644
--- a/dune/solvers/test/sumoperatortest.cc
+++ b/dune/solvers/test/sumoperatortest.cc
@@ -188,7 +188,7 @@ bool checkResize() try {
     DUNE_THROW(Exception, "Resize yields unexpected vector size.");
   std::cout << "passed" << std::endl;
   return true;
-} catch(Dune::Exception e) {
+} catch(const Dune::Exception& e) {
   std::cout << " FAILED." << std::endl;
   std::cout << "Exception was: " << e << std::endl;
   return false;