diff --git a/dune/istl/cholmod.hh b/dune/istl/cholmod.hh
index 420038fc4a5ea7fa35efa4fe7f1a27c794dbaea8..87c29eb693c7ccc3b8239d0aeb21892f8c5e588e 100644
--- a/dune/istl/cholmod.hh
+++ b/dune/istl/cholmod.hh
@@ -250,7 +250,7 @@ public:
 
   /** @brief simple forward to apply(X&, Y&, InverseOperatorResult&)
     */
-  void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
+  void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
   {
     apply(x,b,res);
   }
@@ -260,7 +260,7 @@ public:
    * The method assumes that setMatrix() was called before
    * In the case of a given ignore field the corresponding entries of both in x and b will stay untouched in this method.
   */
-  void apply(Vector& x, Vector& b, InverseOperatorResult& res)
+  void apply(Vector& x, Vector& b, InverseOperatorResult& res) override
   {
     // do nothing if N=0
     if ( nIsZero_ )
@@ -468,7 +468,7 @@ public:
     CholmodMethod::factorize(M.get(), L_, &c_);
   }
 
-  virtual SolverCategory::Category category() const
+  SolverCategory::Category category() const override
   {
     return SolverCategory::Category::sequential;
   }
diff --git a/dune/istl/eigenvalue/poweriteration.hh b/dune/istl/eigenvalue/poweriteration.hh
index 9802c244b4cba240ea14c30020f1d2e6af6e0fe6..c345dd8847596eea2c70a9d618c426ac789b212b 100644
--- a/dune/istl/eigenvalue/poweriteration.hh
+++ b/dune/istl/eigenvalue/poweriteration.hh
@@ -56,13 +56,13 @@ namespace Dune
           mutable_scaling_(mutable_scaling)
       {}
 
-      virtual void apply (const X& x, Y& y) const
+      void apply (const X& x, Y& y) const override
       {
         y = x;
         y *= immutable_scaling_*mutable_scaling_;
       }
 
-      virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
+      void applyscaleadd (field_type alpha, const X& x, Y& y) const override
       {
         X temp(x);
         temp *= immutable_scaling_*mutable_scaling_;
@@ -70,7 +70,7 @@ namespace Dune
       }
 
       //! Category of the linear operator (see SolverCategory::Category)
-      virtual SolverCategory::Category category() const
+      SolverCategory::Category category() const override
       {
         return SolverCategory::sequential;
       }
@@ -108,14 +108,14 @@ namespace Dune
           "Range type of both operators doesn't match!");
       }
 
-      virtual void apply (const domain_type& x, range_type& y) const
+      void apply (const domain_type& x, range_type& y) const override
       {
         op1_.apply(x,y);
         op2_.applyscaleadd(1.0,x,y);
       }
 
-      virtual void applyscaleadd (field_type alpha,
-        const domain_type& x, range_type& y) const
+      void applyscaleadd (field_type alpha,
+        const domain_type& x, range_type& y) const override
       {
         range_type temp(y);
         op1_.apply(x,temp);
@@ -124,7 +124,7 @@ namespace Dune
       }
 
       //! Category of the linear operator (see SolverCategory::Category)
-      virtual SolverCategory::Category category() const
+      SolverCategory::Category category() const override
       {
         return SolverCategory::sequential;
       }
diff --git a/dune/istl/ldl.hh b/dune/istl/ldl.hh
index ce1df59b044aa3615a919eafc4708107ad484caf..0c2ed6babe05e85363e8c07ed371af19c22f113c 100644
--- a/dune/istl/ldl.hh
+++ b/dune/istl/ldl.hh
@@ -87,7 +87,7 @@ namespace Dune {
     typedef Dune::BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > range_type;
 
     //! Category of the solver (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::Category::sequential;
     }
@@ -149,7 +149,7 @@ namespace Dune {
     }
 
     /** \copydoc InverseOperator::apply(X&, Y&, InverseOperatorResult&) */
-    virtual void apply(domain_type& x, range_type& b, InverseOperatorResult& res)
+    void apply(domain_type& x, range_type& b, InverseOperatorResult& res) override
     {
       const int dimMat(ldlMatrix_.N());
       ldl_perm(dimMat, Y_, reinterpret_cast<double*>(&b[0]), P_);
@@ -163,7 +163,7 @@ namespace Dune {
     }
 
     /** \copydoc InverseOperator::apply(X&,Y&,double,InverseOperatorResult&) */
-    virtual void apply(domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
+    void apply(domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
     {
       apply(x,b,res);
     }
diff --git a/dune/istl/novlpschwarz.hh b/dune/istl/novlpschwarz.hh
index 61d9755212618324e062e282d58cf5b001689f35..574e47a7e21597b9c379377731a39e664eee2663 100644
--- a/dune/istl/novlpschwarz.hh
+++ b/dune/istl/novlpschwarz.hh
@@ -98,7 +98,7 @@ namespace Dune {
     {}
 
     //! apply operator to x:  \f$ y = A(x) \f$
-    virtual void apply (const X& x, Y& y) const
+    void apply (const X& x, Y& y) const override
     {
       y = 0;
       novlp_op_apply(x,y,1);
@@ -106,7 +106,7 @@ namespace Dune {
     }
 
     //! apply operator to x, scale and add:  \f$ y = y + \alpha A(x) \f$
-    virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
+    void applyscaleadd (field_type alpha, const X& x, Y& y) const override
     {
       // only apply communication to alpha*A*x to make it consistent,
       // y already has to be consistent.
@@ -118,7 +118,7 @@ namespace Dune {
     }
 
     //! get matrix via *
-    virtual const matrix_type& getmat () const
+    const matrix_type& getmat () const override
     {
       return *_A_;
     }
@@ -232,7 +232,7 @@ namespace Dune {
     }
 
     //! Category of the linear operator (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::nonoverlapping;
     }
@@ -312,7 +312,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(domain_type&,range_type&)
      */
-    virtual void pre (domain_type& x, range_type& b)
+    void pre (domain_type& x, range_type& b) override
     {
       _preconditioner->pre(x,b);
     }
@@ -322,7 +322,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(domain_type&,const range_type&)
      */
-    virtual void apply (domain_type& v, const range_type& d)
+    void apply (domain_type& v, const range_type& d) override
     {
       // block preconditioner equivalent to WrappedPreconditioner from
       // pdelab/backend/ovlpistsolverbackend.hh,
@@ -343,13 +343,13 @@ namespace Dune {
 
        \copydoc Preconditioner::post(domain_type&)
      */
-    virtual void post (domain_type& x)
+    void post (domain_type& x) override
     {
       _preconditioner->post(x);
     }
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::nonoverlapping;
     }
diff --git a/dune/istl/overlappingschwarz.hh b/dune/istl/overlappingschwarz.hh
index 2c2d4a862c3ae97e8aa47714fdd96d20ce6f640a..8b5262091fc5ad250d278f9febb72ffbdda5c1d1 100644
--- a/dune/istl/overlappingschwarz.hh
+++ b/dune/istl/overlappingschwarz.hh
@@ -843,7 +843,7 @@ namespace Dune
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] X& b)
+    void pre ([[maybe_unused]] X& x, [[maybe_unused]] X& b) override
     {}
 
     /*!
@@ -851,21 +851,21 @@ namespace Dune
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const X& d);
+    void apply (X& v, const X& d) override;
 
     /*!
        \brief Postprocess the preconditioner.
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post ([[maybe_unused]] X& x)
+    void post ([[maybe_unused]] X& x) override
     {}
 
     template<bool forward>
     void apply(X& v, const X& d);
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::sequential;
     }
diff --git a/dune/istl/paamg/twolevelmethod.hh b/dune/istl/paamg/twolevelmethod.hh
index dc31fa3443ae2e080d8448765dbc300e7c4d007a..336f4a47443a7aaa3c87e38e553e629300eb025d 100644
--- a/dune/istl/paamg/twolevelmethod.hh
+++ b/dune/istl/paamg/twolevelmethod.hh
@@ -273,7 +273,7 @@ private:
       : amg_(op, crit,args), first_(true)
     {}
 
-    void apply(X& x, X& b, [[maybe_unused]] double reduction, [[maybe_unused]] InverseOperatorResult& res)
+    void apply(X& x, X& b, [[maybe_unused]] double reduction, [[maybe_unused]] InverseOperatorResult& res) override
     {
       if(first_)
       {
@@ -284,13 +284,13 @@ private:
       amg_.apply(x,b);
     }
 
-    void apply(X& x, X& b, InverseOperatorResult& res)
+    void apply(X& x, X& b, InverseOperatorResult& res) override
     {
       return apply(x,b,1e-8,res);
     }
 
     //! Category of the solver (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return amg_.category();
     }
@@ -428,15 +428,15 @@ public:
     delete coarseSolver_;
   }
 
-  void pre(FineDomainType& x, FineRangeType& b)
+  void pre(FineDomainType& x, FineRangeType& b) override
   {
     smoother_->pre(x,b);
   }
 
-  void post([[maybe_unused]] FineDomainType& x)
+  void post([[maybe_unused]] FineDomainType& x) override
   {}
 
-  void apply(FineDomainType& v, const FineRangeType& d)
+  void apply(FineDomainType& v, const FineRangeType& d) override
   {
     FineDomainType u(v);
     FineRangeType rhs(d);
@@ -463,7 +463,7 @@ public:
   }
 
   //! Category of the preconditioner (see SolverCategory::Category)
-  virtual SolverCategory::Category category() const
+  SolverCategory::Category category() const override
   {
     return SolverCategory::sequential;
   }
diff --git a/dune/istl/preconditioners.hh b/dune/istl/preconditioners.hh
index 77a6d57546bc6235c7c40cdaff81a82644a87f74..edacb143d52b2ad1fb6509fd68a58822c1320d96 100644
--- a/dune/istl/preconditioners.hh
+++ b/dune/istl/preconditioners.hh
@@ -99,21 +99,21 @@ namespace Dune {
         DUNE_THROW(InvalidStateException, "User-supplied solver category does not match that of the given inverse operator");
     }
 
-    virtual void pre(domain_type&,range_type&)
+    void pre([[maybe_unused]] domain_type&,[[maybe_unused]] range_type&) override
     {}
 
-    virtual void apply(domain_type& v, const range_type& d)
+    void apply(domain_type& v, const range_type& d) override
     {
       InverseOperatorResult res;
       range_type copy(d);
       inverse_operator_.apply(v, copy, res);
     }
 
-    virtual void post(domain_type&)
+    void post([[maybe_unused]] domain_type&) override
     {}
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::category(inverse_operator_);
     }
@@ -206,7 +206,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
+    void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) override
     {}
 
     /*!
@@ -214,7 +214,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const Y& d)
+    void apply (X& v, const Y& d) override
     {
       for (int i=0; i<_n; i++) {
         bsorf(_A_,v,d,_w,BL<l>());
@@ -227,11 +227,11 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post ([[maybe_unused]] X& x)
+    void post ([[maybe_unused]] X& x) override
     {}
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::sequential;
     }
@@ -326,7 +326,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
+    void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) override
     {}
 
     /*!
@@ -334,7 +334,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const Y& d)
+    void apply (X& v, const Y& d) override
     {
       this->template apply<true>(v,d);
     }
@@ -365,11 +365,11 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post ([[maybe_unused]] X& x)
+    void post ([[maybe_unused]] X& x) override
     {}
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::sequential;
     }
@@ -477,7 +477,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
+    void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) override
     {}
 
     /*!
@@ -485,7 +485,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const Y& d)
+    void apply (X& v, const Y& d) override
     {
       for (int i=0; i<_n; i++) {
         dbjac(_A_,v,d,_w,BL<l>());
@@ -497,11 +497,11 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post ([[maybe_unused]] X& x)
+    void post ([[maybe_unused]] X& x) override
     {}
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::sequential;
     }
@@ -636,7 +636,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre([[maybe_unused]] X &x, [[maybe_unused]] Y &b)
+    void pre([[maybe_unused]] X &x, [[maybe_unused]] Y &b) override
     {
     }
 
@@ -645,7 +645,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply(X &v, const Y &d)
+    void apply(X &v, const Y &d) override
     {
 
       DILU::blockDILUBacksolve(_A_, Dinv_, v, d);
@@ -661,12 +661,12 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post([[maybe_unused]] X &x)
+    void post([[maybe_unused]] X &x) override
     {
     }
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::sequential;
     }
@@ -810,7 +810,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
+    void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) override
     {}
 
     /*!
@@ -818,7 +818,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const Y& d)
+    void apply (X& v, const Y& d) override
     {
       if( ILU_ )
       {
@@ -840,11 +840,11 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post ([[maybe_unused]] X& x)
+    void post ([[maybe_unused]] X& x) override
     {}
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::sequential;
     }
@@ -917,7 +917,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
+    void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b) override
     {}
 
     /*!
@@ -925,7 +925,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const Y& d)
+    void apply (X& v, const Y& d) override
     {
       v = d;
       v *= _w;
@@ -936,11 +936,11 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post ([[maybe_unused]] X& x)
+    void post ([[maybe_unused]] X& x) override
     {}
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::sequential;
     }
diff --git a/dune/istl/scalarproducts.hh b/dune/istl/scalarproducts.hh
index 16682a5df61280dc4210b4d29d0391196494ef4d..c2642ac61746bfceb3f001ee9f217af1b68dc0c3 100644
--- a/dune/istl/scalarproducts.hh
+++ b/dune/istl/scalarproducts.hh
@@ -136,7 +136,7 @@ namespace Dune {
        It is assumed that the vectors are consistent on the interior+border
        partition.
      */
-    virtual field_type dot (const X& x, const X& y) const override
+    field_type dot (const X& x, const X& y) const override
     {
       field_type result(0);
       _communication->dot(x,y,result); // explicitly loop and apply masking
@@ -146,13 +146,13 @@ namespace Dune {
     /*! \brief Norm of a right-hand side vector.
        The vector must be consistent on the interior+border partition
      */
-    virtual real_type norm (const X& x) const override
+    real_type norm (const X& x) const override
     {
       return _communication->norm(x);
     }
 
     //! Category of the scalar product (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const override
+    SolverCategory::Category category() const override
     {
       return _category;
     }
diff --git a/dune/istl/schwarz.hh b/dune/istl/schwarz.hh
index 5dd2f465e7b6928e6f5f97f332e1b2d3eed54593..262ab3f61aebc2a1f8dec5af7a9701af824d122c 100644
--- a/dune/istl/schwarz.hh
+++ b/dune/istl/schwarz.hh
@@ -113,7 +113,7 @@ namespace Dune {
     {}
 
     //! apply operator to x:  \f$ y = A(x) \f$
-    virtual void apply (const X& x, Y& y) const
+    void apply (const X& x, Y& y) const override
     {
       y = 0;
       _A_->umv(x,y);     // result is consistent on interior+border
@@ -122,7 +122,7 @@ namespace Dune {
     }
 
     //! apply operator to x, scale and add:  \f$ y = y + \alpha A(x) \f$
-    virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
+    void applyscaleadd (field_type alpha, const X& x, Y& y) const override
     {
       _A_->usmv(alpha,x,y);     // result is consistent on interior+border
       communication.project(y);     // we want this here to avoid it before the preconditioner
@@ -130,13 +130,13 @@ namespace Dune {
     }
 
     //! get the sequential assembled linear operator.
-    virtual const matrix_type& getmat () const
+    const matrix_type& getmat () const override
     {
       return *_A_;
     }
 
     //! Category of the linear operator (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::overlapping;
     }
@@ -203,7 +203,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre (X& x, [[maybe_unused]] Y& b)
+    void pre (X& x, [[maybe_unused]] Y& b) override
     {
       communication.copyOwnerToAll(x,x);     // make dirichlet values consistent
     }
@@ -213,7 +213,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const Y& d)
+    void apply (X& v, const Y& d) override
     {
       for (int i=0; i<_n; i++) {
         bsorf(_A_,v,d,_w);
@@ -227,10 +227,10 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post ([[maybe_unused]] X& x) {}
+    void post ([[maybe_unused]] X& x) override {}
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::overlapping;
     }
@@ -323,7 +323,7 @@ namespace Dune {
 
        \copydoc Preconditioner::pre(X&,Y&)
      */
-    virtual void pre (X& x, Y& b)
+    void pre (X& x, Y& b) override
     {
       _communication.copyOwnerToAll(x,x);     // make dirichlet values consistent
       _preconditioner->pre(x,b);
@@ -334,7 +334,7 @@ namespace Dune {
 
        \copydoc Preconditioner::apply(X&,const Y&)
      */
-    virtual void apply (X& v, const Y& d)
+    void apply (X& v, const Y& d) override
     {
       _preconditioner->apply(v,d);
       _communication.copyOwnerToAll(v,v);
@@ -352,13 +352,13 @@ namespace Dune {
 
        \copydoc Preconditioner::post(X&)
      */
-    virtual void post (X& x)
+    void post (X& x) override
     {
       _preconditioner->post(x);
     }
 
     //! Category of the preconditioner (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::overlapping;
     }
diff --git a/dune/istl/solver.hh b/dune/istl/solver.hh
index 2d97a5f4b12652e490814f11c4d512fe1cd7c5b0..48696d0ecd50bf7ee1ff7389a08a35e1db2460fe 100644
--- a/dune/istl/solver.hh
+++ b/dune/istl/solver.hh
@@ -373,7 +373,7 @@ namespace Dune
 
        \copydoc InverseOperator::apply(X&,Y&,double,InverseOperatorResult&)
      */
-    virtual void apply (X& x, X& b, double reduction, InverseOperatorResult& res)
+    void apply (X& x, X& b, double reduction, InverseOperatorResult& res) override
     {
       scalar_real_type saved_reduction = _reduction;
       _reduction = reduction;
@@ -382,7 +382,7 @@ namespace Dune
     }
 
     //! Category of the solver (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return _category;
     }
diff --git a/dune/istl/solvers.hh b/dune/istl/solvers.hh
index 6c327de38f25c1fbcba974a19486800b19f2af92..98dbc9fdf17bc3d70ba5b1e63f918e243c19be6f 100644
--- a/dune/istl/solvers.hh
+++ b/dune/istl/solvers.hh
@@ -70,7 +70,7 @@ namespace Dune {
     using IterativeSolver<X,X>::apply;
 
     //! \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
-    virtual void apply (X& x, X& b, InverseOperatorResult& res)
+    void apply (X& x, X& b, InverseOperatorResult& res) override
     {
       Iteration iteration(*this, res);
       _prec->pre(x,b);
@@ -139,7 +139,7 @@ namespace Dune {
 
        \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
      */
-    virtual void apply (X& x, X& b, InverseOperatorResult& res)
+    void apply (X& x, X& b, InverseOperatorResult& res) override
     {
       Iteration iteration(*this, res);
       _prec->pre(x,b);             // prepare preconditioner
@@ -276,7 +276,7 @@ namespace Dune {
              E.g. numeric_limits<double>::quiet_NaN()*0.0==0.0 with gcc-5.3
              -ffast-math.
      */
-    virtual void apply (X& x, X& b, InverseOperatorResult& res)
+    void apply (X& x, X& b, InverseOperatorResult& res) override
     {
       Iteration iteration(*this,res);
       _prec->pre(x,b);             // prepare preconditioner
@@ -436,7 +436,7 @@ namespace Dune {
 
        \note Currently, the BiCGSTABSolver aborts when it detects a breakdown.
      */
-    virtual void apply (X& x, X& b, InverseOperatorResult& res)
+    void apply (X& x, X& b, InverseOperatorResult& res) override
     {
       using std::abs;
       const Simd::Scalar<real_type> EPSILON=1e-80;
@@ -624,7 +624,7 @@ namespace Dune {
 
        \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
      */
-    virtual void apply (X& x, X& b, InverseOperatorResult& res)
+    void apply (X& x, X& b, InverseOperatorResult& res) override
     {
       using std::sqrt;
       using std::abs;
@@ -907,7 +907,7 @@ namespace Dune {
        \note Currently, the RestartedGMResSolver aborts when it detects a
              breakdown.
      */
-    virtual void apply (X& x, Y& b, InverseOperatorResult& res)
+    void apply (X& x, Y& b, InverseOperatorResult& res) override
     {
       apply(x,b,Simd::max(_reduction),res);
     }
@@ -920,7 +920,7 @@ namespace Dune {
        \note Currently, the RestartedGMResSolver aborts when it detects a
              breakdown.
      */
-    virtual void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
+    void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
     {
       using std::abs;
       const Simd::Scalar<real_type> EPSILON = 1e-80;
@@ -1388,7 +1388,7 @@ private:
 
        \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
      */
-    virtual void apply (X& x, X& b, InverseOperatorResult& res)
+    void apply (X& x, X& b, InverseOperatorResult& res) override
     {
       Iteration iteration(*this, res);
       _prec->pre(x,b);                 // prepare preconditioner
@@ -1580,7 +1580,7 @@ private:
              -ffast-math.
      */
 
-    virtual void apply (X& x, X& b, InverseOperatorResult& res)
+    void apply (X& x, X& b, InverseOperatorResult& res) override
     {
       using rAlloc = ReboundAllocatorType<X,field_type>;
       res.clear();
@@ -1690,7 +1690,8 @@ private:
     using RestartedFCGSolver<X>::apply;
 
     // just a minor part of the RestartedFCGSolver apply method will be modified
-    virtual void apply (X& x, X& b, InverseOperatorResult& res) override {
+    void apply (X& x, X& b, InverseOperatorResult& res) override
+    {
       // reset limiter of orthogonalization loop
       _k_limit = 0;
       this->RestartedFCGSolver<X>::apply(x,b,res);
@@ -1698,7 +1699,7 @@ private:
 
   private:
     // This function is called every iteration to orthogonalize against the last search directions.
-    virtual void orthogonalizations(const int& i_bounded,const std::vector<X>& Ad, const X& w, const std::vector<field_type,ReboundAllocatorType<X,field_type>>& ddotAd,std::vector<X>& d) override {
+    void orthogonalizations(const int& i_bounded,const std::vector<X>& Ad, const X& w, const std::vector<field_type,ReboundAllocatorType<X,field_type>>& ddotAd,std::vector<X>& d) override {
       // This FCGSolver uses values with higher array indexes too, if existent.
       for (int k = 0; k < _k_limit; k++) {
         if(i_bounded!=k)
@@ -1711,7 +1712,7 @@ private:
     };
 
     // This function is called every mmax iterations to handle limited array sizes.
-    virtual void cycle(std::vector<X>& Ad, [[maybe_unused]] std::vector<X>& d, [[maybe_unused]] std::vector<field_type,ReboundAllocatorType<X,field_type> >& ddotAd,int& i_bounded) override {
+    void cycle(std::vector<X>& Ad, [[maybe_unused]] std::vector<X>& d, [[maybe_unused]] std::vector<field_type,ReboundAllocatorType<X,field_type> >& ddotAd,int& i_bounded) override {
       // Only the loop index i_bounded return to 0, if it reached mmax.
       i_bounded = 0;
       // Now all arrays are filled and the loop in void orthogonalizations can use the whole arrays.
diff --git a/dune/istl/spqr.hh b/dune/istl/spqr.hh
index daaf0ba42c36e7df20cef412df30e9b5bc7455af..61c05510cd347025cc630d70c7fb25f995b9cfcb 100644
--- a/dune/istl/spqr.hh
+++ b/dune/istl/spqr.hh
@@ -79,7 +79,7 @@ namespace Dune {
     typedef Dune::BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > range_type;
 
     //! Category of the solver (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::Category::sequential;
     }
@@ -152,7 +152,7 @@ namespace Dune {
     }
 
     /** \copydoc InverseOperator::apply(X&, Y&, InverseOperatorResult&) */
-    virtual void apply(domain_type& x, range_type& b, InverseOperatorResult& res)
+    void apply(domain_type& x, range_type& b, InverseOperatorResult& res) override
     {
       const std::size_t numRows(spqrMatrix_.N());
       // fill B
@@ -188,7 +188,7 @@ namespace Dune {
     }
 
     /** \copydoc InverseOperator::apply(X&,Y&,double,InverseOperatorResult&) */
-    virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
+    void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
     {
       apply(x, b, res);
     }
diff --git a/dune/istl/superlu.hh b/dune/istl/superlu.hh
index 498fcd45163c638ff1547b43bbe717ff94692f47..783e9d194ede3d6adfe1bddccc73e400ec341086 100644
--- a/dune/istl/superlu.hh
+++ b/dune/istl/superlu.hh
@@ -284,7 +284,7 @@ namespace Dune
     using range_type = typename Impl::SuperLUVectorChooser<M>::range_type;
 
     //! Category of the solver (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::Category::sequential;
     }
@@ -334,12 +334,12 @@ namespace Dune
     /**
      *  \copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
      */
-    void apply(domain_type& x, range_type& b, InverseOperatorResult& res);
+    void apply(domain_type& x, range_type& b, InverseOperatorResult& res) override;
 
     /**
      *  \copydoc InverseOperator::apply(X&,Y&,double,InverseOperatorResult&)
      */
-    void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
+    void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
     {
       apply(x,b,res);
     }
diff --git a/dune/istl/supermatrix.hh b/dune/istl/supermatrix.hh
index e5e7fdc13b153e060b7ba4cbed9e211fdd0636ba..7df48fee9ffccc1b59f1af2df7956c781e409daf 100644
--- a/dune/istl/supermatrix.hh
+++ b/dune/istl/supermatrix.hh
@@ -300,7 +300,7 @@ namespace Dune
     }
 
     /** @brief free allocated space. */
-    virtual void free()
+    void free() override
     {
       ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>::free();
       SUPERLU_FREE(A.Store);
@@ -326,7 +326,7 @@ namespace Dune
     SuperMatrixInitializer() : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>()
     {}
 
-    virtual void createMatrix() const
+    void createMatrix() const override
     {
       ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>::createMatrix();
       SuperMatrixCreateSparseChooser<typename Matrix::field_type>
diff --git a/dune/istl/umfpack.hh b/dune/istl/umfpack.hh
index 60bfd20fb1cccfb00ac4b8856ecad9f51bc6f03d..54cb264b08a39ad8094c3f1e931dedcac34201ee 100644
--- a/dune/istl/umfpack.hh
+++ b/dune/istl/umfpack.hh
@@ -274,7 +274,7 @@ namespace Dune {
     using range_type = Impl::UMFPackRangeType<M>;
 
     //! Category of the solver (see SolverCategory::Category)
-    virtual SolverCategory::Category category() const
+    SolverCategory::Category category() const override
     {
       return SolverCategory::Category::sequential;
     }
@@ -400,7 +400,7 @@ namespace Dune {
     /**
      *  \copydoc InverseOperator::apply(X&, Y&, InverseOperatorResult&)
      */
-    virtual void apply(domain_type& x, range_type& b, InverseOperatorResult& res)
+    void apply(domain_type& x, range_type& b, InverseOperatorResult& res) override
     {
       if (umfpackMatrix_.N() != b.dim())
         DUNE_THROW(Dune::ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
@@ -451,7 +451,7 @@ namespace Dune {
     /**
      *  \copydoc InverseOperator::apply(X&,Y&,double,InverseOperatorResult&)
      */
-    virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
+    void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
     {
       apply(x,b,res);
     }
@@ -534,7 +534,7 @@ namespace Dune {
       // and a mapping from the compressed indices
       std::vector<size_type> subIndices;
 
-      int numberOfIgnoredDofs = 0;
+      [[maybe_unused]] int numberOfIgnoredDofs = 0;
       int nonZeros = 0;
 
       if constexpr ( useBitVector )