diff --git a/dune/solvers/common/canignore.hh b/dune/solvers/common/canignore.hh
index 4464ac01b4453913ba0c311d8611db074fb3f797..019e5f07af72da181cae51998100435d3b4eab48 100644
--- a/dune/solvers/common/canignore.hh
+++ b/dune/solvers/common/canignore.hh
@@ -47,6 +47,13 @@ public:
         ignoreNodes_ = &i;
     }
 
+    /**
+     * \brief Only if this returns true can ignore() safely be called.
+     */
+    bool hasIgnore() const {
+        return ignoreNodes_ != nullptr;
+    }
+
     /**
      * \brief Const access to bit vector
      */
diff --git a/dune/solvers/iterationsteps/blockgsstep.cc b/dune/solvers/iterationsteps/blockgsstep.cc
index 284351e051ae919ca2775d9164f715bf7ffaf6c4..d49c588d7335a68459b04c0cfb2b8ceeb54867ba 100644
--- a/dune/solvers/iterationsteps/blockgsstep.cc
+++ b/dune/solvers/iterationsteps/blockgsstep.cc
@@ -24,7 +24,7 @@ template<class MatrixType, class DiscFuncType, class BitVectorType>
 inline
 void BlockGSStep<MatrixType, DiscFuncType, BitVectorType>::iterate()
 {
-    assert(this->ignoreNodes_ != nullptr);
+    assert(this->hasIgnore());
 
     if (gs_type_ != Direction::BACKWARD)
         for (std::size_t i=0; i<this->x_->size(); i++)
diff --git a/dune/solvers/iterationsteps/blockgssteps.hh b/dune/solvers/iterationsteps/blockgssteps.hh
index aa995c0957657b617af58b33a2033eaf01be2a49..c8db9a23a999fd99a2c6e3cd2e39559d0735f265 100644
--- a/dune/solvers/iterationsteps/blockgssteps.hh
+++ b/dune/solvers/iterationsteps/blockgssteps.hh
@@ -310,7 +310,7 @@ struct BlockGSStep : public LinearIterationStep<Matrix, Vector, BitVector> {
       , direction_(direction) {}
 
   void iterate() {
-    assert(this->ignoreNodes_ != nullptr);
+    assert(this->hasIgnore());
     assert(this->mat_ != nullptr);
     assert(this->x_ != nullptr);
     assert(this->rhs_ != nullptr);
diff --git a/dune/solvers/iterationsteps/cgstep.cc b/dune/solvers/iterationsteps/cgstep.cc
index 4e00a3bb9fca0c9de51cbd3ca513f0897aa186fe..3085b2b776afdb0dcd96f4b1fed936b2db3ccb30 100644
--- a/dune/solvers/iterationsteps/cgstep.cc
+++ b/dune/solvers/iterationsteps/cgstep.cc
@@ -4,8 +4,6 @@
 template <class MatrixType, class VectorType>
 void CGStep<MatrixType, VectorType>::check() const
 {
-    if (this->ignoreNodes_ == nullptr)
-        DUNE_THROW(SolverError, "ignoreNodes_ member not set");
 }
 
 template <class MatrixType, class VectorType>
@@ -13,9 +11,10 @@ void CGStep<MatrixType, VectorType>::preprocess()
 {
     // Compute the residual (r starts out as the rhs)
     matrix_->mmv(*x_,r_);
-    for (size_t i=0; i < r_.size(); ++i)
-        if (this->ignore()[i].any())
-            r_[i] = 0;
+    if (this->hasIgnore())
+        for (size_t i=0; i < r_.size(); ++i)
+            if (this->ignore()[i].any())
+                r_[i] = 0;
 
     if (preconditioner_) {
         preconditioner_->setMatrix(*matrix_);
@@ -36,9 +35,10 @@ void CGStep<MatrixType, VectorType>::iterate()
     x_->axpy(alpha, p_);                            // x_1     = x_0 + alpha_0 p_0
     r_.axpy(-alpha, q);                            // r_1     = r_0 - alpha_0 Ap_0
 
-    for (size_t i=0; i < r_.size(); ++i)
-        if (this->ignore()[i].any())
-            r_[i] = 0;
+    if (this->hasIgnore())
+        for (size_t i=0; i < r_.size(); ++i)
+            if (this->ignore()[i].any())
+                r_[i] = 0;
 
     if (preconditioner_)
         preconditioner_->apply(q, r_);
diff --git a/dune/solvers/iterationsteps/trustregiongsstep.cc b/dune/solvers/iterationsteps/trustregiongsstep.cc
index 8fd542ea78931932a9e716728bab0aca207de770..f7f7208d91d807cd05b7406071cd9e87a205da38 100644
--- a/dune/solvers/iterationsteps/trustregiongsstep.cc
+++ b/dune/solvers/iterationsteps/trustregiongsstep.cc
@@ -13,7 +13,7 @@ void TrustRegionGSStep<MatrixType, VectorType>::iterate()
 
         // Dirichlet nodes in this block
         std::bitset<BlockSize> ignoreNodes(0);
-        if (this->ignoreNodes_ != nullptr)
+        if (this->hasIgnore())
             ignoreNodes = this->ignore()[i];
 
         if (ignoreNodes.all())
diff --git a/dune/solvers/solvers/umfpacksolver.hh b/dune/solvers/solvers/umfpacksolver.hh
index f2a36ac82cf11f88f18a37bcdb21a2f94a8d6f12..a89bfeb851f828d5772e87407c249aeb494af2ea 100644
--- a/dune/solvers/solvers/umfpacksolver.hh
+++ b/dune/solvers/solvers/umfpacksolver.hh
@@ -70,7 +70,7 @@ public:
     // We may use the original rhs, but ISTL modifies it, so we need a non-const type here
     VectorType mutableRhs = *rhs_;
 
-    if (this->ignoreNodes_ == nullptr)
+    if (not this->hasIgnore())
     {
       /////////////////////////////////////////////////////////////////
       //  Solve the system