diff --git a/dune/solvers/norms/h1seminorm.hh b/dune/solvers/norms/h1seminorm.hh
index f3e4ec449629070cd9042836e0da49f48da81210..2816e2595b616fc5675e43738baea62b4ec6875d 100644
--- a/dune/solvers/norms/h1seminorm.hh
+++ b/dune/solvers/norms/h1seminorm.hh
@@ -8,6 +8,7 @@
 #include <dune/common/fmatrix.hh>
 #include <dune/istl/bcrsmatrix.hh>
 
+#include <dune/solvers/common/wrapownshare.hh>
 #include "norm.hh"
 
 //! Specialisation of the EnergyNorm class to identity blocks
@@ -23,12 +24,13 @@ public:
     /** \brief The type used for the result */
     using typename Base::field_type;
 
-    H1SemiNorm() : matrix_(NULL) {}
+    H1SemiNorm() = default;
 
-    H1SemiNorm(const MatrixType& matrix)
-        : matrix_(&matrix)
+    template<typename Matrix>
+    H1SemiNorm(Matrix&& matrix)
+        : matrix_(Dune::Solvers::wrap_own_share<const MatrixType>(std::forward<Matrix>(matrix)))
     {
-      assert(matrix.N() == matrix.M());
+      assert(matrix_->N() == matrix_->M());
     }
 
     //! Compute the norm of the difference of two vectors
@@ -77,7 +79,7 @@ public:
         return std::sqrt(sum);
     }
 
-    const MatrixType* matrix_;
+    std::shared_ptr<const MatrixType> matrix_;
 
 };