diff --git a/dune/python/istl/bvector.hh b/dune/python/istl/bvector.hh
index 9ac0eb2c5e480590e91538d3735d329c6f2cd6b0..26bc499af3137a542ac7e8c303ce5620ba6e6ca0 100644
--- a/dune/python/istl/bvector.hh
+++ b/dune/python/istl/bvector.hh
@@ -156,24 +156,11 @@ namespace Dune
 
       cls.def( "__len__", [] ( const BlockVector &self ) { return self.N(); } );
 
-      cls.def( pybind11::self += pybind11::self );
-
-// silence a warning (false positive) emitted by clang
-// https://bugs.llvm.org/show_bug.cgi?id=43124
-#ifdef __clang__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wself-assign-overloaded"
-#endif
-
-      cls.def( pybind11::self -= pybind11::self );
-
-#ifdef __clang__
-#pragma GCC diagnostic pop
-#endif
-
       detail::registerOneTensorInterface( cls );
       detail::registerISTLIterators( cls );
 
+      cls.def( "__iadd__", [] ( BlockVector &self, const BlockVector& x ) -> BlockVector & { self += x; return self; } );
+      cls.def( "__isub__", [] ( BlockVector &self, const BlockVector& x ) -> BlockVector & { self -= x; return self; } );
       cls.def( "__imul__", [] ( BlockVector &self, field_type x ) -> BlockVector & { self *= x; return self; } );
       cls.def( "__idiv__", [] ( BlockVector &self, field_type x ) -> BlockVector & { self /= x; return self; } );
       cls.def( "__itruediv__", [] ( BlockVector &self, field_type x ) -> BlockVector & { self /= x; return self; } );
diff --git a/dune/python/test/bcrsmatrix.py b/dune/python/test/bcrsmatrix.py
index a074af433498840234a2371bba0592f23f9da467..9da76ff52d5b1e551e7c67a2c888a383063f3dca 100644
--- a/dune/python/test/bcrsmatrix.py
+++ b/dune/python/test/bcrsmatrix.py
@@ -132,3 +132,12 @@ str_x = str_x +")"
 
 if str_x != s:
     raise Exception(str(x) + " = str(x) != " + s)
+
+q=x.copy()
+q+=q
+for i in range(0,5):
+    assert(q[i][0] == 2*x[i][0])
+
+q-=x
+for i in range(0,5):
+    assert(q[i][0] == x[i][0])
\ No newline at end of file