diff --git a/dune/matrix-vector/genericvectortools.hh b/dune/matrix-vector/genericvectortools.hh
index 493c6c605b8431501b757431db8db40074a363f5..4b753e5b22773bb9153d8e2c5a5373635e736d54 100644
--- a/dune/matrix-vector/genericvectortools.hh
+++ b/dune/matrix-vector/genericvectortools.hh
@@ -26,6 +26,12 @@ void writeBinary(std::ostream& s, const Vector& v) {
   Helper<Vector>::writeBinary(s, v);
 }
 
+//! Read vector from given stream
+template <class Vector>
+void readBinary(std::istream& s, Vector& v) {
+  Helper<Vector>::readBinary(s, v);
+}
+
 //! Truncate vector by given bit set
 template <class Vector, class BitVector>
 void truncate(Vector& v, const BitVector& tr) {
@@ -38,6 +44,10 @@ struct Helper {
     Hybrid::forEach(v, [&s](auto&& vi) { Generic::writeBinary(s, vi); });
   }
 
+  static void readBinary(std::istream& s, Vector& v) {
+    Hybrid::forEach(v, [&s](auto&& vi) { Generic::readBinary(s, vi); });
+  }
+
   template <class BitVector>
   static void truncate(Vector& v, const BitVector& tr) {
     sparseRangeFor(v, [&tr](auto&& vi, auto&& i) {
@@ -55,6 +65,11 @@ struct Helper<FieldVector<Field, n>> {
       s.write(reinterpret_cast<const char*>(&vi), sizeof(Field));
   }
 
+  static void readBinary(std::ostream& s, Vector& v) {
+    for (auto&& vi : v)
+      s.write(reinterpret_cast<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)