diff --git a/dune/solvers/common/arithmetic.hh b/dune/solvers/common/arithmetic.hh
index 1adca58ad9587cd103efe0d98112eacf26742f34..bee60bae9bf5ff2e1380d84b8ff8e1ef69faae35 100644
--- a/dune/solvers/common/arithmetic.hh
+++ b/dune/solvers/common/arithmetic.hh
@@ -13,6 +13,8 @@
 #include <dune/istl/matrixindexset.hh>
 #include <dune/istl/scaledidmatrix.hh>
 
+#include <dune/matrix-vector/axpy.hh>
+
 #include <dune/solvers/common/resize.hh>
 
 /** \brief Namespace containing helper classes and functions for arithmetic operations
@@ -142,386 +144,6 @@ namespace Arithmetic
     template <bool Condition, typename Type=void>
     using enable_if_t = typename std::enable_if<Condition, Type>::type;
 
-    /** \brief Internal helper class for product operations
-     *
-     */
-    template<class A, class B, class C, bool AisScalar, bool BisScalar, bool CisScalar>
-    struct ProductHelper
-    {
-        template <class ADummy=A, enable_if_t<!MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            b.umv(c, a);
-        }
-
-        template <class ADummy=A, enable_if_t<MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            typename B::ConstRowIterator bi  = b.begin();
-            typename B::ConstRowIterator bEnd = b.end();
-            for(; bi!=bEnd; ++bi)
-            {
-                typename B::ConstColIterator bik = bi->begin();
-                typename B::ConstColIterator biEnd= bi->end();
-                for(; bik!=biEnd; ++bik)
-                {
-                    typename C::ConstColIterator ckj =c[bik.index()].begin();
-                    typename C::ConstColIterator ckEnd=c[bik.index()].end();
-                    for(; ckj!=ckEnd; ++ckj)
-                        a[bi.index()][ckj.index()] += (*bik) * (*ckj);
-                }
-            }
-        }
-    };
-
-    // Internal helper class for scaled product operations (i.e., b is always a scalar)
-    template<class A, class Scalar, class B, class C, bool AisScalar, bool BisScalar, bool CisScalar>
-    struct ScaledProductHelper
-    {
-        template <class ADummy=A, enable_if_t<!MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c)
-        {
-            b.usmv(scalar, c, a);
-        }
-
-        template <class ADummy=A, enable_if_t<MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c)
-        {
-            typename B::ConstRowIterator bi  = b.begin();
-            typename B::ConstRowIterator bEnd = b.end();
-            for(; bi!=bEnd; ++bi)
-            {
-                typename B::ConstColIterator bik =b[bi.index()].begin();
-                typename B::ConstColIterator biEnd=b[bi.index()].end();
-                for(; bik!=biEnd; ++bik)
-                {
-                    typename C::ConstColIterator ckj =c[bik.index()].begin();
-                    typename C::ConstColIterator ckEnd=c[bik.index()].end();
-                    for(; ckj!=ckEnd; ++ckj)
-                        a[bi.index()][ckj.index()] += scalar * (*bik) * (*ckj);
-                }
-            }
-        }
-    };
-
-    template<class T, int n, int m, int k>
-    struct ProductHelper<Dune::FieldMatrix<T,n,k>, Dune::FieldMatrix<T,n,m>, Dune::FieldMatrix<T,m,k>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,k> A;
-        typedef Dune::FieldMatrix<T,n,m> B;
-        typedef Dune::FieldMatrix<T,m,k> C;
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            for (size_t row = 0; row < n; ++row)
-            {
-                for (size_t col = 0 ; col < k; ++col)
-                {
-                    for (size_t i = 0; i < m; ++i)
-                        a[row][col] += b[row][i]*c[i][col];
-                }
-            }
-        }
-    };
-
-    template<class T, int n, int m, int k>
-    struct ScaledProductHelper<Dune::FieldMatrix<T,n,k>, T, Dune::FieldMatrix<T,n,m>, Dune::FieldMatrix<T,m,k>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,k> A;
-        typedef Dune::FieldMatrix<T,n,m> C;
-        typedef Dune::FieldMatrix<T,m,k> D;
-        static void addProduct(A& a, const T& b, const C& c, const D& d)
-        {
-            for (size_t row = 0; row < n; ++row) {
-                for (size_t col = 0 ; col < k; ++col) {
-                    for (size_t i = 0; i < m; ++i)
-                        a[row][col] += b * c[row][i]*d[i][col];
-                }
-            }
-        }
-    };
-
-    template<class T, int n>
-    struct ProductHelper<Dune::DiagonalMatrix<T,n>, Dune::DiagonalMatrix<T,n>, Dune::DiagonalMatrix<T,n>, false, false, false>
-    {
-        typedef Dune::DiagonalMatrix<T,n> A;
-        typedef A B;
-        typedef B C;
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            for (size_t i=0; i<n; ++i)
-                a.diagonal(i) += b.diagonal(i)*c.diagonal(i);
-        }
-    };
-
-    template<class T, int n>
-    struct ScaledProductHelper<Dune::DiagonalMatrix<T,n>, T, Dune::DiagonalMatrix<T,n>, Dune::DiagonalMatrix<T,n>, false, false, false>
-    {
-        typedef Dune::DiagonalMatrix<T,n> A;
-        typedef A C;
-        typedef C D;
-        static void addProduct(A& a, const T& b, const C& c, const D& d)
-        {
-            for (size_t i=0; i<n; ++i)
-                a.diagonal(i) += b * c.diagonal(i)*d.diagonal(i);
-        }
-    };
-
-    template<class T, int n>
-    struct ProductHelper<Dune::FieldMatrix<T,n,n>, Dune::DiagonalMatrix<T,n>, Dune::DiagonalMatrix<T,n>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,n> A;
-        typedef Dune::DiagonalMatrix<T,n> B;
-        typedef B C;
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            for (size_t i=0; i<n; ++i)
-                a[i][i] += b.diagonal(i)*c.diagonal(i);
-        }
-    };
-
-    template<class T, int n>
-    struct ScaledProductHelper<Dune::FieldMatrix<T,n,n>, T, Dune::DiagonalMatrix<T,n>, Dune::DiagonalMatrix<T,n>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,n> A;
-        typedef Dune::DiagonalMatrix<T,n> C;
-        typedef C D;
-        static void addProduct(A& a, const T& b, const C& c, const D& d)
-        {
-            for (size_t i=0; i<n; ++i)
-                a[i][i] += b * c.diagonal(i)*d.diagonal(i);
-        }
-    };
-
-    template<class T, int n, int m>
-    struct ProductHelper<Dune::FieldMatrix<T,n,m>, Dune::DiagonalMatrix<T,n>, Dune::FieldMatrix<T,n,m>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,m> A;
-        typedef Dune::DiagonalMatrix<T,n> B;
-        typedef A C;
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            for (size_t i=0; i<n; ++i)
-                a[i].axpy(b.diagonal(i),c[i]);
-        }
-    };
-
-    template<class T, int n, int m>
-    struct ScaledProductHelper<Dune::FieldMatrix<T,n,m>, T, Dune::DiagonalMatrix<T,n>, Dune::FieldMatrix<T,n,m>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,m> A;
-        typedef Dune::DiagonalMatrix<T,n> C;
-        typedef A D;
-        static void addProduct(A& a, const T& b, const C& c, const D& d)
-        {
-            for (size_t i=0; i<n; ++i)
-                a[i].axpy(b*c.diagonal(i),d[i]);
-        }
-    };
-
-    template<class T, int n, int m>
-    struct ProductHelper<Dune::FieldMatrix<T,n,m>, Dune::FieldMatrix<T,n,m>, Dune::DiagonalMatrix<T,m>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,m> A;
-        typedef Dune::DiagonalMatrix<T,m> C;
-        typedef A B;
-
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            for (size_t i=0; i<n; ++i)
-                for (size_t j=0; j<m; j++)
-                    a[i][j] += c.diagonal(j)*b[i][j];
-        }
-    };
-
-    template<class T, int n, int m>
-    struct ScaledProductHelper<Dune::FieldMatrix<T,n,m>, T, Dune::FieldMatrix<T,n,m>, Dune::DiagonalMatrix<T,m>, false, false, false>
-    {
-        typedef Dune::FieldMatrix<T,n,m> A;
-        typedef Dune::DiagonalMatrix<T,m> D;
-        typedef A C;
-
-        static void addProduct(A& a, const T& b, const C& c, const D& d)
-        {
-            for (size_t i=0; i<n; ++i)
-                for (size_t j=0; j<m; j++)
-                    a[i][j] += b*d.diagonal(j)*c[i][j];
-        }
-    };
-
-    template<class T, int n>
-    struct ProductHelper<Dune::ScaledIdentityMatrix<T,n>, Dune::ScaledIdentityMatrix<T,n>, Dune::ScaledIdentityMatrix<T,n>, false, false, false>
-    {
-        typedef Dune::ScaledIdentityMatrix<T,n> A;
-        typedef A B;
-        typedef B C;
-
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            a.scalar() += b.scalar()*c.scalar();
-        }
-    };
-
-    template<class T, class Scalar, int n>
-    struct ScaledProductHelper<Dune::ScaledIdentityMatrix<T,n>, Scalar, Dune::ScaledIdentityMatrix<T,n>, Dune::ScaledIdentityMatrix<T,n>, false, false, false>
-    {
-        typedef Dune::ScaledIdentityMatrix<T,n> A;
-        typedef A C;
-        typedef C D;
-
-        static void addProduct(A& a, const Scalar& b, const C& c, const D& d)
-        {
-            a.scalar() += b * c.scalar()*d.scalar();
-        }
-    };
-
-    /** \brief Specialization for b being a scalar type
-      */
-    template<class A, class ScalarB, class C, bool AisScalar, bool CisScalar>
-    struct ProductHelper<A, ScalarB, C, AisScalar, true, CisScalar>
-    {
-        typedef ScalarB B;
-
-        template <class ADummy=A, enable_if_t<!MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            a.axpy(b, c);
-        }
-
-        template <class ADummy=A, enable_if_t<MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            typename C::ConstRowIterator ci  = c.begin();
-            typename C::ConstRowIterator cEnd = c.end();
-            for(; ci!=cEnd; ++ci)
-            {
-                typename C::ConstColIterator cik =c[ci.index()].begin();
-                typename C::ConstColIterator ciEnd=c[ci.index()].end();
-                for(; cik!=ciEnd; ++cik)
-                {
-                    a[ci.index()][cik.index()] += b*(*cik);
-                }
-            }
-        }
-    };
-
-    template<class A, class Scalar, class ScalarB, class C, bool AisScalar, bool CisScalar>
-    struct ScaledProductHelper<A, Scalar, ScalarB, C, AisScalar, true, CisScalar>
-    {
-        typedef ScalarB B;
-
-        template <class ADummy=A, enable_if_t<!MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c)
-        {
-            a.axpy(scalar*b, c);
-        }
-
-        template <class ADummy=A, enable_if_t<MatrixTraits<ADummy>::isMatrix,int> SFINAE_Dummy=0>
-        static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c)
-        {
-            typename C::ConstRowIterator ci  = c.begin();
-            typename C::ConstRowIterator cEnd = c.end();
-            for(; ci!=cEnd; ++ci)
-            {
-                typename C::ConstColIterator cik =c[ci.index()].begin();
-                typename C::ConstColIterator ciEnd=c[ci.index()].end();
-                for(; cik!=ciEnd; ++cik)
-                {
-                    a[ci.index()][cik.index()] += scalar*b*(*cik);
-                }
-            }
-        }
-    };
-
-    template<class ABlock, class ScalarB, class CBlock>
-    struct ProductHelper<Dune::BCRSMatrix<ABlock>, ScalarB, Dune::BCRSMatrix<CBlock>, false, true, false>
-    {
-        typedef Dune::BCRSMatrix<ABlock> A;
-        typedef ScalarB B;
-        typedef Dune::BCRSMatrix<CBlock> C;
-
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            // Workaround for the fact that Dune::BCRSMatrix assumes
-            // its blocks to have an axpy() implementation, yet
-            // Dune::DiagonalMatrix does not.
-
-            //a.axpy(b, c);
-
-            for (typename C::ConstIterator i=c.begin(); i!=c.end(); ++i) {
-                const size_t iindex = i.index();
-                for (typename C::row_type::ConstIterator j=i->begin(); j!=i->end(); ++j)
-                    ProductHelper<typename A::block_type, B, typename C::block_type, false, true, false>::addProduct(a[iindex][j.index()],b,*j);
-            }
-        }
-    };
-
-    template<class ABlock, class Scalar, class ScalarB, class CBlock>
-    struct ScaledProductHelper<Dune::BCRSMatrix<ABlock>, Scalar, ScalarB, Dune::BCRSMatrix<CBlock>, false, true, false>
-    {
-        typedef Dune::BCRSMatrix<ABlock> A;
-        typedef ScalarB B;
-        typedef Dune::BCRSMatrix<CBlock> C;
-
-        static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c)
-        {
-            // Workaround for the fact that Dune::BCRSMatrix assumes
-            // its blocks to have an axpy() implementation, yet
-            // Dune::DiagonalMatrix does not.
-
-            //a.axpy(scalar*b, c);
-
-            for (typename C::ConstIterator i=c.begin(); i!=c.end(); ++i) {
-                const size_t iindex = i.index();
-                for (typename C::row_type::ConstIterator j=i->begin(); j!=i->end(); ++j)
-                    ProductHelper<typename A::block_type, B, typename C::block_type, false, true, false>::addProduct(a[iindex][j.index()],scalar*b,*j);
-            }
-        }
-    };
-
-    template<class T, int n, class ScalarB>
-    struct ProductHelper<Dune::ScaledIdentityMatrix<T,n>, ScalarB, Dune::ScaledIdentityMatrix<T,n>, false, true, false>
-    {
-        typedef Dune::ScaledIdentityMatrix<T,n> A;
-        typedef ScalarB B;
-        typedef Dune::ScaledIdentityMatrix<T,n> C;
-
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            a.scalar() += b*c.scalar();
-        }
-    };
-
-    template<class T, int n, class Scalar, class ScalarB>
-    struct ScaledProductHelper<Dune::ScaledIdentityMatrix<T,n>, Scalar, ScalarB, Dune::ScaledIdentityMatrix<T,n>, false, true, false>
-    {
-        typedef Dune::ScaledIdentityMatrix<T,n> A;
-        typedef ScalarB B;
-        typedef Dune::ScaledIdentityMatrix<T,n> C;
-
-        static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c)
-        {
-            a.scalar() += scalar*b*c.scalar();
-        }
-    };
-
-    template<class A, class B, class C>
-    struct ProductHelper<A, B, C, true, true, true>
-    {
-        static void addProduct(A& a, const B& b, const C& c)
-        {
-            a += b*c;
-        }
-    };
-
-    template<class A, class B, class C, class D>
-    struct ScaledProductHelper<A, B, C, D, true, true, true>
-    {
-        static void addProduct(A& a, const B& b, const C& c, const D& d)
-        {
-            a += b*c*d;
-        }
-    };
-
    //! Helper class for computing the cross product
     template <class T, int n>
     struct CrossProductHelper
@@ -655,7 +277,7 @@ namespace Arithmetic
     template<class A, class B, class C>
     void addProduct(A& a, const B& b, const C& c)
     {
-        ProductHelper<A,B,C,ScalarTraits<A>::isScalar, ScalarTraits<B>::isScalar, ScalarTraits<C>::isScalar>::addProduct(a,b,c);
+      Dune::MatrixVector::addProduct(a,b,c);
     }
 
     /** \brief Subtract a product from some matrix or vector
@@ -672,7 +294,7 @@ namespace Arithmetic
     template<class A, class B, class C>
     void subtractProduct(A& a, const B& b, const C& c)
     {
-        ScaledProductHelper<A,int,B,C,ScalarTraits<A>::isScalar, ScalarTraits<B>::isScalar, ScalarTraits<C>::isScalar>::addProduct(a,-1,b,c);
+      Dune::MatrixVector::subtractProduct(a,b,c);
     }
 
     //! Compute the cross product of two vectors. Only works for n==3
@@ -704,7 +326,7 @@ namespace Arithmetic
     typename std::enable_if<ScalarTraits<B>::isScalar, void>::type
     addProduct(A& a, const B& b, const C& c, const D& d)
     {
-        ScaledProductHelper<A,B,C,D,ScalarTraits<A>::isScalar, ScalarTraits<C>::isScalar, ScalarTraits<D>::isScalar>::addProduct(a,b,c,d);
+      Dune::MatrixVector::addProduct(a,b,c,d);
     }
 
     /** \brief Subtract a scaled product from some matrix or vector
@@ -722,7 +344,7 @@ namespace Arithmetic
     typename std::enable_if<ScalarTraits<B>::isScalar, void>::type
     subtractProduct(A& a, const B& b, const C& c, const D& d)
     {
-        ScaledProductHelper<A,B,C,D,ScalarTraits<A>::isScalar, ScalarTraits<C>::isScalar, ScalarTraits<D>::isScalar>::addProduct(a,-b,c,d);
+      Dune::MatrixVector::subtractProduct(a,b,c,d);
     }
 
     /** \brief Internal helper class for Matrix operations
diff --git a/dune/solvers/common/staticmatrixtools.hh b/dune/solvers/common/staticmatrixtools.hh
index c9dfabe0679de3f370020b670bb89dc310e1b06d..522af0eb76eb9c568ba82c7668165d9f3dfbd2a5 100644
--- a/dune/solvers/common/staticmatrixtools.hh
+++ b/dune/solvers/common/staticmatrixtools.hh
@@ -9,6 +9,9 @@
 #include "dune/istl/bcrsmatrix.hh"
 #include "dune/istl/matrixindexset.hh"
 
+#include <dune/matrix-vector/axpy.hh>
+#include <dune/matrix-vector/scalartraits.hh>
+
 #include "arithmetic.hh"
 
 namespace StaticMatrix
@@ -169,7 +172,7 @@ namespace StaticMatrix
         {
             static void addTransformedMatrix(MatrixA& A, const ScalarTransform& T1, const MatrixB& B, const ScalarTransform& T2)
             {
-                Arithmetic::addProduct(A, T1*T2, B);
+                Dune::MatrixVector::addProduct(A, T1*T2, B);
             }
         };
 
@@ -283,7 +286,7 @@ namespace StaticMatrix
         void addTransformedMatrix(MatrixA& A, const TransformationMatrix& T1, const MatrixB& B, const TransformationMatrix& T2)
         {
             TransformMatrixHelper<MatrixA,MatrixB,TransformationMatrix,
-                            Arithmetic::ScalarTraits<MatrixA>::isScalar, Arithmetic::ScalarTraits<MatrixB>::isScalar, Arithmetic::ScalarTraits<TransformationMatrix>::isScalar>
+                            Dune::MatrixVector::ScalarTraits<MatrixA>::isScalar, Dune::MatrixVector::ScalarTraits<MatrixB>::isScalar, Dune::MatrixVector::ScalarTraits<TransformationMatrix>::isScalar>
                         ::addTransformedMatrix(A,T1,B,T2);
         }
 
@@ -292,7 +295,7 @@ namespace StaticMatrix
         {
             A = 0;
             TransformMatrixHelper<MatrixA,MatrixB,TransformationMatrix,
-                            Arithmetic::ScalarTraits<MatrixA>::isScalar, Arithmetic::ScalarTraits<MatrixB>::isScalar, Arithmetic::ScalarTraits<TransformationMatrix>::isScalar>
+                            Dune::MatrixVector::ScalarTraits<MatrixA>::isScalar, Dune::MatrixVector::ScalarTraits<MatrixB>::isScalar, Dune::MatrixVector::ScalarTraits<TransformationMatrix>::isScalar>
                         ::addTransformedMatrix(A,T1,B,T2);
         }
 
diff --git a/dune/solvers/iterationsteps/blockgsstep.cc b/dune/solvers/iterationsteps/blockgsstep.cc
index d49c588d7335a68459b04c0cfb2b8ceeb54867ba..9092e4d07649e47491ec8386878b3a7342df6f57 100644
--- a/dune/solvers/iterationsteps/blockgsstep.cc
+++ b/dune/solvers/iterationsteps/blockgsstep.cc
@@ -3,7 +3,7 @@
 
 #include <cassert>
 
-#include <dune/solvers/common/arithmetic.hh>
+#include <dune/matrix-vector/axpy.hh>
 
 template<class MatrixType, class DiscFuncType, class BitVectorType>
 inline
@@ -15,7 +15,7 @@ residual(int index, VectorBlock& r) const
     const auto& row = (*this->mat_)[index];
     for (auto cIt = row.begin(); cIt!=row.end(); ++cIt) {
         // r_i -= A_ij x_j
-        Arithmetic::subtractProduct(r, *cIt, (*this->x_)[cIt.index()]);
+        Dune::MatrixVector::subtractProduct(r, *cIt, (*this->x_)[cIt.index()]);
     }
 
 }
diff --git a/dune/solvers/iterationsteps/linegsstep.hh b/dune/solvers/iterationsteps/linegsstep.hh
index 45c0fc36c8fed1f23e0257524d63fbae63cbd89a..1c59163995009e35d3b2b9703d3108de4eca76f7 100755
--- a/dune/solvers/iterationsteps/linegsstep.hh
+++ b/dune/solvers/iterationsteps/linegsstep.hh
@@ -3,9 +3,9 @@
 #ifndef DUNE_LINE_GAUSS_SEIDEL_STEP_HH
 #define DUNE_LINE_GAUSS_SEIDEL_STEP_HH
 
-#include <dune/common/bitsetvector.hh>
+#include <dune/matrix-vector/axpy.hh>
 
-#include <dune/solvers/common/arithmetic.hh>
+#include <dune/common/bitsetvector.hh>
 
 template<class MatrixType,
          class DiscFuncType,
@@ -51,7 +51,7 @@ template<class MatrixType,
             const auto& row = (*this->mat_)[index];
             for (auto cIt = row.begin(); cIt!=row.end(); ++cIt) {
                 // r_i -= A_ij x_j
-                Arithmetic::subtractProduct(r, *cIt, (*this->x_)[cIt.index()]);
+                Dune::MatrixVector::subtractProduct(r, *cIt, (*this->x_)[cIt.index()]);
             }
         }
     };
diff --git a/dune/solvers/iterationsteps/projectedblockgsstep.hh b/dune/solvers/iterationsteps/projectedblockgsstep.hh
index 111b093078a88d1caf3644e8507838cd1ce7b69a..9a491168828f8b27f4fbd4e98b602d4865f7d881 100644
--- a/dune/solvers/iterationsteps/projectedblockgsstep.hh
+++ b/dune/solvers/iterationsteps/projectedblockgsstep.hh
@@ -5,9 +5,9 @@
 
 #include <vector>
 
-#include <dune/solvers/common/boxconstraint.hh>
+#include <dune/matrix-vector/axpy.hh>
 
-#include <dune/solvers/common/arithmetic.hh>
+#include <dune/solvers/common/boxconstraint.hh>
 #include <dune/solvers/iterationsteps/lineariterationstep.hh>
 
 template<class MatrixType, class VectorType>
@@ -42,7 +42,7 @@ public:
         const auto& row = (*this->mat_)[index];
         for (auto cIt = row.begin(); cIt!=row.end(); ++cIt) {
             // r_i -= A_ij x_j
-            Arithmetic::subtractProduct(r, *cIt, (*this->x_)[cIt.index()]);
+            Dune::MatrixVector::subtractProduct(r, *cIt, (*this->x_)[cIt.index()]);
         }
     }
 
diff --git a/dune/solvers/iterationsteps/truncatedblockgsstep.hh b/dune/solvers/iterationsteps/truncatedblockgsstep.hh
index c0c2083810079cf36e42e1aa97508c4be03e28dc..d84e285c5f8edbc0b15a1bad242fe9040329be5b 100644
--- a/dune/solvers/iterationsteps/truncatedblockgsstep.hh
+++ b/dune/solvers/iterationsteps/truncatedblockgsstep.hh
@@ -7,12 +7,13 @@
 
 #include <dune/common/bitsetvector.hh>
 
+#include <dune/matrix-vector/axpy.hh>
+
 #include <dune/solvers/iterationsteps/lineariterationstep.hh>
 #include <dune/solvers/operators/sumoperator.hh>
 #include <dune/solvers/common/staticmatrixtools.hh>
 #include <dune/solvers/common/arithmetic.hh>
 
-
 namespace TruncatedBlockGSStepNS {
 template<int blocklevel> struct RecursiveGSStep;
 }
@@ -186,7 +187,7 @@ public:
             {
                 size_t col = it.index();
                 if (col == row)
-                    Arithmetic::addProduct(Aii, 1.0, *it);
+                    Dune::MatrixVector::addProduct(Aii, 1.0, *it);
                 else
                     it->mmv(x[col],r);
             }
@@ -198,7 +199,7 @@ public:
                 const LRBlock& mki(lowrank_mat.lowRankFactor()[k][row]);
                 // Aii += m^tm[i][i]
                 // this should actually be \sum(lr_block^t*lr_block) if the blocks are nonsymmetric
-                Arithmetic::addProduct(Aii,mki,mki);
+                Dune::MatrixVector::addProduct(Aii,mki,mki);
 
                 // r -= m^tm*x, where x[row] were zero
                 mki.mmv(mx[k], r);
diff --git a/dune/solvers/transferoperators/compressedmultigridtransfer.hh b/dune/solvers/transferoperators/compressedmultigridtransfer.hh
index 31a32163d8ca9624816703ccc42fa5c9a66f62b2..1cdd9ebd8891da21db9062fb4ec3fc30310dde3c 100644
--- a/dune/solvers/transferoperators/compressedmultigridtransfer.hh
+++ b/dune/solvers/transferoperators/compressedmultigridtransfer.hh
@@ -10,8 +10,8 @@
 #include <dune/common/bitsetvector.hh>
 #include <dune/common/shared_ptr.hh>
 
+#include <dune/matrix-vector/axpy.hh>
 #include <dune/solvers/operators/sumoperator.hh>
-#include <dune/solvers/common/staticmatrixtools.hh>
 
 #include "genericmultigridtransfer.hh"
 #include "multigridtransfer.hh"
@@ -265,7 +265,7 @@ public:
                 size_t j = j_it.index();
 
                 for (size_t k=0; k<lr_fine_factor.N(); ++k)
-                    Arithmetic::addProduct(lr_coarse_factor[k][j], *j_it, lr_fine_factor[k][i]);
+                    Dune::MatrixVector::addProduct(lr_coarse_factor[k][j], *j_it, lr_fine_factor[k][i]);
             }
         }
     }
diff --git a/dune/solvers/transferoperators/genericmultigridtransfer.hh b/dune/solvers/transferoperators/genericmultigridtransfer.hh
index b1c3ffac3b583efcae2a26a0992caf07944d1bd2..b4a6ca4284c98a5bf5fb8af7ea7c3c5dbd34a00c 100644
--- a/dune/solvers/transferoperators/genericmultigridtransfer.hh
+++ b/dune/solvers/transferoperators/genericmultigridtransfer.hh
@@ -12,8 +12,9 @@
 
 #include <dune/localfunctions/lagrange/pqkfactory.hh>
 
+#include <dune/matrix-vector/axpy.hh>
+
 #include "dune/solvers/common/staticmatrixtools.hh"
-#include <dune/solvers/common/arithmetic.hh>
 
 
 /** \brief Restriction and prolongation operator for standard multigrid
@@ -697,7 +698,7 @@ public:
 
                         // Compute cm = im^T * m * jm
                         if(TransferOperatorType::block_type::rows==1)
-                            Arithmetic::addProduct(cm, (*im)[0][0] * (*jm)[0][0], *m);
+                            Dune::MatrixVector::addProduct(cm, (*im)[0][0] * (*jm)[0][0], *m);
                         else
                             StaticMatrix::addTransformedMatrix(cm, *im, *m, *jm);
                     }
@@ -764,7 +765,7 @@ public:
 
                         // Compute cm = im^T * m * jm
                         if(TransferOperatorType::block_type::rows==1)
-                            Arithmetic::addProduct(cm, (*im)[0][0] * (*jm)[0][0], *m);
+                            Dune::MatrixVector::addProduct(cm, (*im)[0][0] * (*jm)[0][0], *m);
                         else
                             StaticMatrix::addTransformedMatrix(cm, *im, *m, *jm);
                     }