diff --git a/dumux/assembly/partialreassembler.hh b/dumux/assembly/partialreassembler.hh
index 1ee55a31b241a64e7a205532aaf312be71dd53bc..480c26232140f5040fa243cc3db17676118c31dc 100644
--- a/dumux/assembly/partialreassembler.hh
+++ b/dumux/assembly/partialreassembler.hh
@@ -380,12 +380,12 @@ public:
     using ParentType::ParentType;
 };
 
-//! helper function to determine whether the an engine class has vertex colors
-template<class Engine>
-auto hasVertexColor()
+//! helper struct to determine whether the an engine class has vertex colors
+struct hasVertexColor
 {
-    return isValid([](auto&& a) -> decltype(a.vertexColor(0)) {}).template check<Engine>();
-}
+    template<class Engine>
+    auto operator()(Engine&& e) -> decltype(e.vertexColor(0)) {};
+};
 
 /*!
  * \ingroup Assembly
@@ -469,7 +469,7 @@ public:
     EntityColor dofColor(size_t idx) const
     { return engine_.dofColor(idx); }
 
-    template<bool enable = decltype(hasVertexColor<Engine>())::value,
+    template<bool enable = decltype(isValid(hasVertexColor()).template check<Engine>())::value,
              typename std::enable_if_t<enable, int> = 0>
     EntityColor vertexColor(size_t idx) const
     { return engine_.vertexColor(idx); }
diff --git a/dumux/nonlinear/newtonsolver.hh b/dumux/nonlinear/newtonsolver.hh
index 51ada10fba9195f663d781860862049ad4af1f89..b50dbd7c63ca6454e4dbd1c36eb56bad8235b2ac 100644
--- a/dumux/nonlinear/newtonsolver.hh
+++ b/dumux/nonlinear/newtonsolver.hh
@@ -49,19 +49,15 @@
 
 namespace Dumux {
 
-//! helper function detecting if an assembler supports partial reassembly
-template<class Assembler>
-auto supportsPartialReassembly(const Assembler& assembler) noexcept
+//! helper struct detecting if an assembler supports partial reassembly
+struct supportsPartialReassembly
 {
-    using SolutionVector = typename Assembler::ResidualType;
-    using Reassembler = PartialReassembler<Assembler>;
-
-    return isValid([](auto&& a) -> decltype(
-        a.assembleJacobianAndResidual(std::declval<Assembler>(),
-                                      std::declval<const SolutionVector&>(),
-                                      std::declval<const Reassembler*>())
-    ){})(assembler);
-}
+    template<class Assembler>
+    auto operator()(Assembler&& a)
+    -> decltype(a.assembleJacobianAndResidual(std::declval<const typename Assembler::ResidualType&>(),
+                                              std::declval<const PartialReassembler<Assembler>*>()))
+    {};
+};
 
 /*!
  * \ingroup Nonlinear
@@ -759,7 +755,7 @@ private:
     //! assembleLinearSystem_ for assemblers that support partial reassembly
     template<class A>
     auto assembleLinearSystem_(const A& assembler, const SolutionVector& uCurrentIter)
-    -> typename std::enable_if_t<decltype(supportsPartialReassembly(assembler))::value, void>
+    -> typename std::enable_if_t<decltype(isValid(supportsPartialReassembly())(assembler))::value, void>
     {
         assembler_->assembleJacobianAndResidual(uCurrentIter, partialReassembler_.get());
     }
@@ -767,7 +763,7 @@ private:
     //! assembleLinearSystem_ for assemblers that don't support partial reassembly
     template<class A>
     auto assembleLinearSystem_(const A& assembler, const SolutionVector& uCurrentIter)
-    -> typename std::enable_if_t<!decltype(supportsPartialReassembly(assembler))::value, void>
+    -> typename std::enable_if_t<!decltype(isValid(supportsPartialReassembly())(assembler))::value, void>
     {
         assembler_->assembleJacobianAndResidual(uCurrentIter);
     }