diff --git a/exercises/exercise-biomineralization/biominproblem.hh b/exercises/exercise-biomineralization/biominproblem.hh
index c72dff46d07ba52592034ce45ce1ae7090f2222f..20d0790b88d77a7958e45cbc185edcb8ba6230e7 100644
--- a/exercises/exercise-biomineralization/biominproblem.hh
+++ b/exercises/exercise-biomineralization/biominproblem.hh
@@ -95,11 +95,11 @@ struct SpatialParams<TypeTag, TTag::ExerciseFourBioMin> {
 };
 
 template<class TypeTag>
-struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 
 } // end namespace properties
 /*!
@@ -169,9 +169,6 @@ public:
     ExerciseFourBioMinProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
     : ParentType(fvGridGeometry)
     {
-#if !DUNE_VERSION_NEWER(DUNE_COMMON,2,7)
-        Dune::FMatrixPrecision<Scalar>::set_singular_limit(1e-35);
-#endif
         name_           = getParam<std::string>("Problem.Name");
         //initial values
         densityW_       = getParam<Scalar>("Initial.InitDensityW");
diff --git a/exercises/exercise-biomineralization/biominspatialparams.hh b/exercises/exercise-biomineralization/biominspatialparams.hh
index 393bd57d708f468f5bd3e62d0978184bdbb112d8..3815f373ea76d1647d6d836ec1c2b225c4ef8178 100644
--- a/exercises/exercise-biomineralization/biominspatialparams.hh
+++ b/exercises/exercise-biomineralization/biominspatialparams.hh
@@ -229,10 +229,14 @@ public:
                 const auto& dofPosition = scv.dofPosition();
                 const bool isInAquitardNotFaultZone = isInAquitard_(dofPosition) && !isFaultZone_(dofPosition);
                 auto kInit = isInAquitardNotFaultZone ? aquitardPermeability_ : initialPermeability_;
+                PermeabilityType K (0.0);
+                for (int i = 0; i < dimWorld; ++i)
+                    K[i][i] = kInit;
                 const auto refPoro = referencePorosity(element, scv);
                 const auto poro = porosity(element, scv, elemSol);
-                auto kEvaluated = permLaw_.evaluatePermeability(kInit, refPoro, poro);
-                referencePermeability_[eIdx][scv.indexInElement()] = calculateKRef(kInit, kEvaluated);
+                auto kEvaluated = permLaw_.evaluatePermeability(K, refPoro, poro);
+                K *= K[0][0]/kEvaluated[0][0];
+                referencePermeability_[eIdx][scv.indexInElement()] = K;
             }
         }
     }
@@ -275,39 +279,8 @@ public:
     { return FluidSystem::liquidPhaseIdx; }
 
 private:
-
     static constexpr Scalar eps_ = 1e-6;
 
-    //! calculateKRef for tensorial permeabilities
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        //TODO this assumes the change in permeability is homogeneous as currently also assumed in PermeabilityKozenyCarman.
-        // there also might be nicer/safer ways to calculate this.
-        Scalar factor = 0.0;
-        int counter = 0;
-        for (int i = 0; i < dimWorld; ++i)
-            for (int j = 0; i < dimWorld; ++i)
-                if(kEvaluated[i][j]!=0)
-                {
-                factor += K[i][j] / kEvaluated[i][j];
-                    ++counter;
-                }
-        factor /= counter;
-        K *= factor;
-
-        return K;
-    }
-
-    //! calculateKRef for scalar permeabilities
-    template<class PT = PermeabilityType,
-             std::enable_if_t<Dune::IsNumber< PT >::value, int> = 0>
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        Scalar factor = K / kEvaluated;
-        K *= factor;
-        return K;
-    }
-
     Scalar calculatephiRef(Scalar phiInit, Scalar phiEvaluated)
     { return 2*phiInit - phiEvaluated;}
 
diff --git a/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh b/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh
index 8a18560dfdde8739bd4475d21599d1acd6528f05..f7a0f62ab5f0c8ca8baa2e368c9671cacb8560cc 100644
--- a/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh
+++ b/exercises/exercise-biomineralization/chemistry/simplebiominreactions.hh
@@ -95,28 +95,23 @@ public:
         Scalar molalityUrea = moleFracToMolality(volVars.moleFraction(liquidPhaseIdx,UreaIdx),
                                                  xwCa,
                                                  volVars.moleFraction(liquidPhaseIdx,CO2Idx));  // [mol_urea/kg_H2O]
-        if (molalityUrea < 0)
-            molalityUrea = 0;
 
         // TODO: dumux-course-task
         // compute rate of ureolysis by implementing Z_urease,biofilm and r_urea
 
         // compute/set dissolution and precipitation rate of calcite
-        Scalar rprec = 0;
-
-        // regularize so that we do not get precipitation where there is no calcium
-        if (xwCa > 1e-8)
-            rprec = rurea;
+        Scalar rprec = 0.0;
+        rprec = rurea;
 
         // set source terms
         // TODO: dumux-course-task
         // update terms according to stochiometry
-        q[H2OIdx]     += 0;
-        q[CO2Idx]     += 0;
-        q[CaIdx]      += 0;
-        q[UreaIdx]    += 0;
-        q[BiofilmIdx] += 0;
-        q[CalciteIdx] += 0;
+        q[H2OIdx]     += 0.0;
+        q[CO2Idx]     += 0.0;
+        q[CaIdx]      += 0.0;
+        q[UreaIdx]    += 0.0;
+        q[BiofilmIdx] += 0.0;
+        q[CalciteIdx] += 0.0;
     }
 
 private:
diff --git a/exercises/exercise-biomineralization/exercisebiomin.input b/exercises/exercise-biomineralization/exercisebiomin.input
index 0f3d3e413948411a6b4fd939d9c88f1e7b5bead7..fb2df91900c3c33d51d66f30c2a12adea2b571e1 100644
--- a/exercises/exercise-biomineralization/exercisebiomin.input
+++ b/exercises/exercise-biomineralization/exercisebiomin.input
@@ -11,9 +11,6 @@ Name = biomin
 UpperRight = 20 15 # x-/y-coordinates of the upper-right corner of the grid [m]
 Cells = 20 15 # x-/y-resolution of the grid
 
-[Newton]
-MaxRelativeShift = 1e-6 #
-
 [Initial]
 InitDensityW = 997 # [kg/m³] initial wetting density
 InitPressure = 1e5 # [Pa] initial pressure
diff --git a/exercises/solution/exercise-biomineralization/biominproblem.hh b/exercises/solution/exercise-biomineralization/biominproblem.hh
index 2c41e437d1bcbffcb7acd4aa6770ab7b1b5b09a7..756b7537a8113f4ea2b741ce50d3c901234f5290 100644
--- a/exercises/solution/exercise-biomineralization/biominproblem.hh
+++ b/exercises/solution/exercise-biomineralization/biominproblem.hh
@@ -96,11 +96,11 @@ struct SpatialParams<TypeTag, TTag::ExerciseFourBioMin> {
 };
 
 template<class TypeTag>
-struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableFVGridGeometryCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridVolumeVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 template<class TypeTag>
-struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = false; };
+struct EnableGridFluxVariablesCache<TypeTag, TTag::ExerciseFourBioMin> { static constexpr bool value = true; };
 
 } // end namespace properties
 /*!
@@ -172,9 +172,6 @@ public:
     ExerciseFourBioMinProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
     : ParentType(fvGridGeometry)
     {
-#if !DUNE_VERSION_NEWER(DUNE_COMMON,2,7)
-        Dune::FMatrixPrecision<Scalar>::set_singular_limit(1e-35);
-#endif
         name_           = getParam<std::string>("Problem.Name");
         //initial values
         densityW_       = getParam<Scalar>("Initial.InitDensityW");
diff --git a/exercises/solution/exercise-biomineralization/biominspatialparams.hh b/exercises/solution/exercise-biomineralization/biominspatialparams.hh
index 393bd57d708f468f5bd3e62d0978184bdbb112d8..3815f373ea76d1647d6d836ec1c2b225c4ef8178 100644
--- a/exercises/solution/exercise-biomineralization/biominspatialparams.hh
+++ b/exercises/solution/exercise-biomineralization/biominspatialparams.hh
@@ -229,10 +229,14 @@ public:
                 const auto& dofPosition = scv.dofPosition();
                 const bool isInAquitardNotFaultZone = isInAquitard_(dofPosition) && !isFaultZone_(dofPosition);
                 auto kInit = isInAquitardNotFaultZone ? aquitardPermeability_ : initialPermeability_;
+                PermeabilityType K (0.0);
+                for (int i = 0; i < dimWorld; ++i)
+                    K[i][i] = kInit;
                 const auto refPoro = referencePorosity(element, scv);
                 const auto poro = porosity(element, scv, elemSol);
-                auto kEvaluated = permLaw_.evaluatePermeability(kInit, refPoro, poro);
-                referencePermeability_[eIdx][scv.indexInElement()] = calculateKRef(kInit, kEvaluated);
+                auto kEvaluated = permLaw_.evaluatePermeability(K, refPoro, poro);
+                K *= K[0][0]/kEvaluated[0][0];
+                referencePermeability_[eIdx][scv.indexInElement()] = K;
             }
         }
     }
@@ -275,39 +279,8 @@ public:
     { return FluidSystem::liquidPhaseIdx; }
 
 private:
-
     static constexpr Scalar eps_ = 1e-6;
 
-    //! calculateKRef for tensorial permeabilities
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        //TODO this assumes the change in permeability is homogeneous as currently also assumed in PermeabilityKozenyCarman.
-        // there also might be nicer/safer ways to calculate this.
-        Scalar factor = 0.0;
-        int counter = 0;
-        for (int i = 0; i < dimWorld; ++i)
-            for (int j = 0; i < dimWorld; ++i)
-                if(kEvaluated[i][j]!=0)
-                {
-                factor += K[i][j] / kEvaluated[i][j];
-                    ++counter;
-                }
-        factor /= counter;
-        K *= factor;
-
-        return K;
-    }
-
-    //! calculateKRef for scalar permeabilities
-    template<class PT = PermeabilityType,
-             std::enable_if_t<Dune::IsNumber< PT >::value, int> = 0>
-    PermeabilityType calculateKRef(PermeabilityType K, PermeabilityType kEvaluated)
-    {
-        Scalar factor = K / kEvaluated;
-        K *= factor;
-        return K;
-    }
-
     Scalar calculatephiRef(Scalar phiInit, Scalar phiEvaluated)
     { return 2*phiInit - phiEvaluated;}
 
diff --git a/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh b/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh
index 66331ec460cc2bdd61ddd63afae2994b8c6d80d7..250333faedcafa721dbf9cbcf879e6b7c71a7083 100644
--- a/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh
+++ b/exercises/solution/exercise-biomineralization/chemistry/simplebiominreactions.hh
@@ -96,8 +96,6 @@ public:
         Scalar molalityUrea = moleFracToMolality(volVars.moleFraction(liquidPhaseIdx,UreaIdx),
                                                  xwCa,
                                                  volVars.moleFraction(liquidPhaseIdx,CO2Idx));  // [mol_urea/kg_H2O]
-        if (molalityUrea < 0)
-            molalityUrea = 0;
 
         // TODO: dumux-course-task
         // compute rate of ureolysis by implementing Z_urease,biofilm and r_urea
@@ -105,20 +103,17 @@ public:
         Scalar rurea = kurease_ * Zub * molalityUrea / (ku_ + molalityUrea); // [mol/m³s]
 
         // compute/set dissolution and precipitation rate of calcite
-        Scalar rprec = 0;
-
-        // regularize so that we do not get precipitation where there is no calcium
-        if (xwCa > 1e-8)
-            rprec = rurea;
+        Scalar rprec = 0.0;
+        rprec = rurea;
 
         // set source terms
         // TODO: dumux-course-task
         // update terms according to stochiometry
-        q[H2OIdx]     += 0;
+        q[H2OIdx]     += 0.0;
         q[CO2Idx]     += rurea - rprec ;
         q[CaIdx]      += - rprec;
         q[UreaIdx]    += - rurea;
-        q[BiofilmIdx] += 0;
+        q[BiofilmIdx] += 0.0;
         q[CalciteIdx] += rprec;
     }
 
diff --git a/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input b/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input
index 0f3d3e413948411a6b4fd939d9c88f1e7b5bead7..fb2df91900c3c33d51d66f30c2a12adea2b571e1 100644
--- a/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input
+++ b/exercises/solution/exercise-biomineralization/exercisebiomin_solution.input
@@ -11,9 +11,6 @@ Name = biomin
 UpperRight = 20 15 # x-/y-coordinates of the upper-right corner of the grid [m]
 Cells = 20 15 # x-/y-resolution of the grid
 
-[Newton]
-MaxRelativeShift = 1e-6 #
-
 [Initial]
 InitDensityW = 997 # [kg/m³] initial wetting density
 InitPressure = 1e5 # [Pa] initial pressure