diff --git a/dune/common/CMakeLists.txt b/dune/common/CMakeLists.txt
index 0075584a18fcac0a6ad17fc627bd7032bf1e0f56..91ebd9e37bd038bb825cd4943ef1da03c8245ab0 100644
--- a/dune/common/CMakeLists.txt
+++ b/dune/common/CMakeLists.txt
@@ -58,6 +58,7 @@ install(FILES
         genericiterator.hh
         gmpfield.hh
         hash.hh
+        identitymatrix.hh
         indent.hh
         interfaces.hh
         ios_state.hh
diff --git a/dune/common/Makefile.am b/dune/common/Makefile.am
index 189757a8299c6a372acaae52444c8ff95a815ea7..421251575264effe2ac832eca2d8def0b2906f26 100644
--- a/dune/common/Makefile.am
+++ b/dune/common/Makefile.am
@@ -54,6 +54,7 @@ commoninclude_HEADERS = 			\
 	genericiterator.hh			\
 	gmpfield.hh				\
 	hash.hh					\
+	identitymatrix.hh                       \
 	indent.hh				\
 	interfaces.hh				\
 	ios_state.hh				\
diff --git a/dune/common/identitymatrix.hh b/dune/common/identitymatrix.hh
new file mode 100644
index 0000000000000000000000000000000000000000..646e3983c2afcd0fcb13ad0ded0b5b7827b91a7e
--- /dev/null
+++ b/dune/common/identitymatrix.hh
@@ -0,0 +1,160 @@
+#ifndef DUNE_COMMON_IDENTITYMATRIX_HH
+#define DUNE_COMMON_IDENTITYMATRIX_HH
+
+#include <dune/common/fmatrix.hh>
+#include <dune/common/ftraits.hh>
+#include <dune/common/math.hh>
+#include <dune/common/std/constexpr.hh>
+
+/**
+ * \file
+ * \ingroup DenseMatVec
+ * \brief Implementation of an identity matrix that does not store
+ *        any data.
+ * \author Christoph Gersbacher
+ */
+
+namespace Dune
+{
+
+  // IdentityMatrix
+  // --------------
+
+  /** \class IdentityMatrix
+   *
+   *  \ingroup DenseMatVec
+   *
+   *  \brief Read-only identity matrix.
+   *
+   *  Implementation of an identity matrix that does not store any data.
+   *
+   *  \tparam  K  field type
+   *  \tparam  N  dimension
+   */
+  template< class K, int N >
+  struct IdentityMatrix
+  {
+    /** \brief field type */
+    typedef K field_type;
+    /** \brief size type */
+    typedef std::size_t size_type;
+
+    /** \brief return number of rows */
+    DUNE_CONSTEXPR size_type rows () const { return N; }
+    /** \brief return number of columns */
+    DUNE_CONSTEXPR size_type cols () const { return N; }
+
+    /** \copydoc Dune::DenseMatrix::mv */
+    template< class X, class Y >
+    void mv ( const X &x, Y &y ) const
+    {
+      y = x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::mtv */
+    template< class X, class Y >
+    void mtv ( const X &x, Y &y ) const
+    {
+      y = x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::umv */
+    template< class X, class Y >
+    void umv ( const X &x, Y &y ) const
+    {
+      y += x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::umtv */
+    template< class X, class Y >
+    void umtv ( const X &x, Y &y ) const
+    {
+      y += x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::umhv */
+    template< class X, class Y >
+    void umhv ( const X &x, Y &y ) const
+    {
+      y += x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::mmv */
+    template< class X, class Y >
+    void mmv ( const X &x, Y &y ) const
+    {
+      y -= x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::mmtv */
+    template< class X, class Y >
+    void mmtv ( const X &x, Y &y ) const
+    {
+      y -= x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::mmhv */
+    template< class X, class Y >
+    void mmhv ( const X &x, Y &y ) const
+    {
+      y -= x;
+    }
+
+    /** \copydoc Dune::DenseMatrix::usmv */
+    template< class X, class Y >
+    void usmv ( const field_type &alpha, const X &x, Y &y ) const
+    {
+      y.axpy( alpha, x );
+    }
+
+    /** \copydoc Dune::DenseMatrix::usmtv */
+    template< class X, class Y >
+    void usmtv ( const field_type &alpha, const X &x, Y &y ) const
+    {
+      y.axpy( alpha, x );
+    }
+
+    /** \copydoc Dune::DenseMatrix::usmhv */
+    template< class X, class Y >
+    void usmhv ( const field_type &alpha, const X &x, Y &y ) const
+    {
+      y.axpy( alpha, x );
+    }
+
+    /** \copydoc Dune::DenseMatrix::frobenius_norm */
+    typename FieldTraits< field_type >::real_type frobenius_norm () const
+    {
+      return std::sqrt( frobenius_norm2() );
+    }
+
+    /** \copydoc Dune::DenseMatrix::frobenius_norm2 */
+    typename FieldTraits< field_type >::real_type frobenius_norm2 () const
+    {
+      return FieldTraits< field_type >::real_type( N );
+    }
+
+    /** \copydoc Dune::DenseMatrix::infinity_norm */
+    typename FieldTraits< field_type >::real_type infinity_norm () const
+    {
+      return FieldTraits< field_type >::real_type( 1 );
+    }
+
+    /** \copydoc Dune::DenseMatrix::infinity_norm_real */
+    typename FieldTraits< field_type >::real_type infinity_norm_real () const
+    {
+      return FieldTraits< field_type >::real_type( 1 );
+    }
+
+    /** \brief cast to FieldMatrix */
+    operator FieldMatrix< field_type, N, N > () const
+    {
+      FieldMatrix< field_type, N, N > fieldMatrix( 0 );
+      for( int i = 0; i < N; ++i )
+        fieldMatrix[ i ][ i ] = field_type( 1 );
+      return fieldMatrix;
+    }
+  };
+
+} // namespace Dune
+
+#endif // #ifndef DUNE_COMMON_IDENTITYMATRIX_HH