diff --git a/dune/matrix-vector/genericvectortools.hh b/dune/matrix-vector/genericvectortools.hh
index f6bdc2fed1ddf5f013d2379959f15dc5464116e6..f4143f871a1b5fbf4368fa842e1d9c6689611842 100644
--- a/dune/matrix-vector/genericvectortools.hh
+++ b/dune/matrix-vector/genericvectortools.hh
@@ -24,6 +24,11 @@ void writeBinary(std::ostream& s, const Vector& v) {
   Helper<Vector>::writeBinary(s, v);
 }
 
+//! Truncate vector by given bit set
+template <class Vector, class BitVector>
+void truncate(Vector& v, const BitVector& tr) {
+  Helper<Vector>::truncate(v, tr);
+}
 
 template <class Vector>
 struct Helper {
@@ -32,6 +37,12 @@ struct Helper {
       Generic::writeBinary(s, vi);
   }
 
+  template <class BitVector>
+  static void truncate(Vector& v, const BitVector& tr) {
+    sparseRangeFor(v, [&tr](auto&& vi, auto&& i) {
+      Generic::truncate(vi, tr[i]);
+    });
+  }
 };
 
 template <class Field, int n>
@@ -43,10 +54,16 @@ struct Helper<FieldVector<Field, n>> {
       s.write(reinterpret_cast<const char*>(&vi), sizeof(Field));
   }
 
+  template<class BitVector>
+  static void truncate(Vector& v, const BitVector& tr) {
+    for (auto it = v.begin(), end = v.end(); it != end; ++it)
+      if(tr[it.index()])
+        *it = 0;
+  }
+};
 
 } // end namespace Generic
 } // end namespace MatrixVector
 } // end namespace Dune
 
 #endif // DUNE_MATRIX_VECTOR_GENERICVECTORTOOLS_HH
-