diff --git a/exercises/exercise-basic/2p2cmain.cc b/exercises/exercise-basic/2p2cmain.cc
index 9bac025585fcd464f8ecfd2479890249bf2ba302..5467f9a78389f13e7f97ed63a8ce759064b047ea 100644
--- a/exercises/exercise-basic/2p2cmain.cc
+++ b/exercises/exercise-basic/2p2cmain.cc
@@ -81,13 +81,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -97,7 +96,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -120,11 +119,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
 //     using PrimaryVariableSwitch = GetPropType<TypeTag, Properties::PrimaryVariableSwitch>;
diff --git a/exercises/exercise-basic/2pmain.cc b/exercises/exercise-basic/2pmain.cc
index 16d628b5a3b8124915fb9cf7a4c21a3c54509cc7..fb0fb4846ac52983dff542eec068f5188d893f11 100644
--- a/exercises/exercise-basic/2pmain.cc
+++ b/exercises/exercise-basic/2pmain.cc
@@ -82,13 +82,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -98,7 +97,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -125,11 +124,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/exercise-basic/injection2p2cproblem.hh b/exercises/exercise-basic/injection2p2cproblem.hh
index 1a4a0ee96ffee56a7495493afd8032fb7ae6f244..745d6925705e4455db54b2ae42190a313f71b038 100644
--- a/exercises/exercise-basic/injection2p2cproblem.hh
+++ b/exercises/exercise-basic/injection2p2cproblem.hh
@@ -63,7 +63,7 @@ class Injection2p2cProblem : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -73,8 +73,8 @@ class Injection2p2cProblem : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    Injection2p2cProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    Injection2p2cProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
@@ -107,14 +107,6 @@ public:
     std::string name() const
     { return name_+"-2p2c"; }
 
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    {
-        return 273.15 + 30; // [K]
-    }
-
     // \}
 
     /*!
@@ -206,7 +198,7 @@ public:
         PrimaryVariables values(0.0);
         values.setState(Indices::firstPhaseOnly);
         // get the water density at atmospheric conditions
-        const Scalar densityW = FluidSystem::H2O::liquidDensity(temperature(), 1.0e5);
+        const Scalar densityW = FluidSystem::H2O::liquidDensity(this->spatialParams().temperatureAtPos(globalPos), 1.0e5);
 
         // assume an intially hydrostatic liquid pressure profile
         // note: we subtract rho_w*g*h because g is defined negative
@@ -215,7 +207,7 @@ public:
         // initially we have some nitrogen dissolved
         // saturation mole fraction would be
         // moleFracLiquidN2 = (pw + pc + p_vap^sat)/henry;
-        const Scalar moleFracLiquidN2 = pw*0.95/BinaryCoeff::H2O_N2::henry(temperature());
+        const Scalar moleFracLiquidN2 = pw*0.95/BinaryCoeff::H2O_N2::henry(this->spatialParams().temperatureAtPos(globalPos));
 
         // note that because we start with a single phase system the primary variables
         // are pl and x^w_N2. This will switch as soon after we start injecting to a two
diff --git a/exercises/exercise-basic/injection2pniproblem.hh b/exercises/exercise-basic/injection2pniproblem.hh
index 50508fcac9d7cb54eedd74dd0814d8b287505d31..b70ad5adfcfcdd63f9d98cdb5e91804bd47a249f 100644
--- a/exercises/exercise-basic/injection2pniproblem.hh
+++ b/exercises/exercise-basic/injection2pniproblem.hh
@@ -62,7 +62,7 @@ class Injection2PNIProblem : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -72,8 +72,8 @@ class Injection2PNIProblem : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    Injection2PNIProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    Injection2PNIProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
diff --git a/exercises/exercise-basic/injection2pproblem.hh b/exercises/exercise-basic/injection2pproblem.hh
index 154519bc8ad76ae4ba02901cb3395d50d1df8c8c..2d24777623bf9cabf2c4fa675deff40418fe3eba 100644
--- a/exercises/exercise-basic/injection2pproblem.hh
+++ b/exercises/exercise-basic/injection2pproblem.hh
@@ -62,7 +62,7 @@ class Injection2PProblem : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -72,8 +72,8 @@ class Injection2PProblem : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    Injection2PProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    Injection2PProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
@@ -106,14 +106,6 @@ public:
     std::string name() const
     { return name_+"-2p"; }
 
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    {
-        return 273.15 + 30; // [K]
-    }
-
     // \}
 
     /*!
@@ -206,7 +198,7 @@ public:
         PrimaryVariables values(0.0);
 
         // get the water density at atmospheric conditions
-        const Scalar densityW = FluidSystem::H2O::liquidDensity(temperature(), 1.0e5);
+        const Scalar densityW = FluidSystem::H2O::liquidDensity(this->spatialParams().temperatureAtPos(globalPos), 1.0e5);
 
         // assume an intially hydrostatic liquid pressure profile
         // note: we subtract rho_w*g*h because g is defined negative
diff --git a/exercises/exercise-basic/properties2p.hh b/exercises/exercise-basic/properties2p.hh
index 13164ccd25c955ca22094ab88f57e887fb35c867..7f6b15ebce2cbf2301a4b7e7483e26c70275f5e6 100644
--- a/exercises/exercise-basic/properties2p.hh
+++ b/exercises/exercise-basic/properties2p.hh
@@ -56,10 +56,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2p>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/exercise-basic/properties2p2c.hh b/exercises/exercise-basic/properties2p2c.hh
index 0db24a196f1ad3470a1da461ce87b7244a7c24a6..997a815841e1916cdd4cb0a8c04adecaed44991c 100644
--- a/exercises/exercise-basic/properties2p2c.hh
+++ b/exercises/exercise-basic/properties2p2c.hh
@@ -55,10 +55,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2p2c>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/exercise-basic/properties2pni.hh b/exercises/exercise-basic/properties2pni.hh
index 95af6a6ce7dd148c9128da122da9226088a06a05..a7ddf5c623ec69da241e925f605c2eec76a8a835 100644
--- a/exercises/exercise-basic/properties2pni.hh
+++ b/exercises/exercise-basic/properties2pni.hh
@@ -59,10 +59,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2pNITypeTag>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/exercise-basic/spatialparams.hh b/exercises/exercise-basic/spatialparams.hh
index e3dac53444681d65939cb466791437ae37d56013..df90c7e51f3fb5f3e360b418d8900645094b1bdb 100644
--- a/exercises/exercise-basic/spatialparams.hh
+++ b/exercises/exercise-basic/spatialparams.hh
@@ -27,7 +27,7 @@
 #ifndef DUMUX_EX_BASIC_SPATIAL_PARAMS_HH
 #define DUMUX_EX_BASIC_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 
 #include <dumux/io/gnuplotinterface.hh>
@@ -43,10 +43,10 @@ namespace Dumux {
  */
 template<class FVGridGeometry, class Scalar>
 class InjectionSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
 {
     using ThisType = InjectionSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<FVGridGeometry, Scalar, ThisType>;
     using GridView = typename FVGridGeometry::GridView;
 
     // get the dimensions of the simulation domain from GridView
@@ -112,10 +112,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_);
     }
 
     /*!
@@ -128,6 +128,15 @@ public:
     int wettingPhaseAtPos(const GlobalPosition& globalPos) const
     { return FluidSystem::H2OIdx; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 273.15 + 30; // [K]
+    }
+
 private:
 
     static constexpr Scalar eps_ = 1e-6;
diff --git a/exercises/exercise-biomineralization/biominproblem.hh b/exercises/exercise-biomineralization/biominproblem.hh
index 943a941e380dfc0452302547de0ce3d8d9f9a8fa..b0a0d0d4fd937dfa1c5436727f54c166bccb80d0 100644
--- a/exercises/exercise-biomineralization/biominproblem.hh
+++ b/exercises/exercise-biomineralization/biominproblem.hh
@@ -50,7 +50,7 @@ class BioMinProblem : public PorousMediumFlowProblem<TypeTag>
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
     using VolumeVariables = GetPropType<TypeTag, Properties::VolumeVariables>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
 
     // Grid dimension
@@ -95,11 +95,11 @@ class BioMinProblem : public PorousMediumFlowProblem<TypeTag>
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
 public:
-    BioMinProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    BioMinProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         name_           = getParam<std::string>("Problem.Name");
         //initial values
@@ -114,9 +114,9 @@ public:
         concCa_         = getParam<Scalar>("Injection.ConcCa");
         concUrea_       = getParam<Scalar>("Injection.ConcUrea");
 
-        unsigned int codim = GetPropType<TypeTag, Properties::GridGeometry>::discMethod == DiscretizationMethod::box ? dim : 0;
-        Kxx_.resize(fvGridGeometry->gridView().size(codim));
-        Kyy_.resize(fvGridGeometry->gridView().size(codim));
+        unsigned int codim = GetPropType<TypeTag, Properties::GridGeometry>::discMethod == DiscretizationMethods::box ? dim : 0;
+        Kxx_.resize(gridGeometry->gridView().size(codim));
+        Kyy_.resize(gridGeometry->gridView().size(codim));
 
         //initialize the fluidsystem
         FluidSystem::init(/*startTemp=*/288,
@@ -144,15 +144,6 @@ public:
     const std::string name() const
     { return name_; }
 
-    /*!
-     * \brief Returns the temperature within the domain.
-     *
-     * This problem assumes a temperature of 300 degrees Kelvin.
-     */
-    Scalar temperature() const
-    {
-        return 300; // [K]
-    }
 
     // \}
 
diff --git a/exercises/exercise-biomineralization/biominspatialparams.hh b/exercises/exercise-biomineralization/biominspatialparams.hh
index ab63115cf9b396a31ec79b31304654be98dce619..a2eb8e65b582120ae38adb182b6126d9910d07be 100644
--- a/exercises/exercise-biomineralization/biominspatialparams.hh
+++ b/exercises/exercise-biomineralization/biominspatialparams.hh
@@ -24,7 +24,7 @@
 #ifndef DUMUX_BIOMIN_SPATIAL_PARAMETERS_HH
 #define DUMUX_BIOMIN_SPATIAL_PARAMETERS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/linearmaterial.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 #include <dumux/material/fluidmatrixinteractions/porosityprecipitation.hh>
@@ -38,15 +38,15 @@ namespace Dumux {
  * \brief Definition of the spatial parameters for the biomineralisation problem
  * with geostatistically distributed initial permeability.
  */
-template<class FVGridGeometry, class Scalar, int numFluidComps, int numActiveSolidComps>
+template<class GridGeometry, class Scalar, int numFluidComps, int numActiveSolidComps>
 class BioMinSpatialparams
-: public FVSpatialParams<FVGridGeometry, Scalar, BioMinSpatialparams<FVGridGeometry, Scalar, numFluidComps, numActiveSolidComps>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, BioMinSpatialparams<GridGeometry, Scalar, numFluidComps, numActiveSolidComps>>
 {
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
+    using FVElementGeometry = typename GridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, BioMinSpatialparams<FVGridGeometry, Scalar, numFluidComps, numActiveSolidComps>>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, BioMinSpatialparams<GridGeometry, Scalar, numFluidComps, numActiveSolidComps>>;
 
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using CoordScalar = typename GridView::ctype;
     enum { dimWorld=GridView::dimensionworld };
     using Element = typename GridView::template Codim<0>::Entity;
@@ -66,8 +66,8 @@ public:
     *
     * \param gridView The grid view
     */
-    BioMinSpatialparams(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    BioMinSpatialparams(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     , pcKrSwCurve_("SpatialParams")
     , aquitardPcKrSwCurve_("SpatialParams.Aquitard")
     {
@@ -119,22 +119,22 @@ public:
      *
      *  \f[referencePorosity = 2 \cdot initialPorosity - evaluatePorosity() \f]
      *
-     * \param fvGridGeometry The fvGridGeometry
+     * \param gridGeometry The gridGeometry
      * \param sol The (initial) solution vector
      */
     template<class SolutionVector>
-    void computeReferencePorosity(const FVGridGeometry& fvGridGeometry,
+    void computeReferencePorosity(const GridGeometry& gridGeometry,
                                   const SolutionVector& sol)
     {
-        referencePorosity_.resize(fvGridGeometry.gridView().size(0));
-        for (const auto& element : elements(fvGridGeometry.gridView()))
+        referencePorosity_.resize(gridGeometry.gridView().size(0));
+        for (const auto& element : elements(gridGeometry.gridView()))
         {
-            auto fvGeometry = localView(fvGridGeometry);
+            auto fvGeometry = localView(gridGeometry);
             fvGeometry.bindElement(element);
 
             const auto eIdx = this->gridGeometry().elementMapper().index(element);
 
-            auto elemSol = elementSolution(element, sol, fvGridGeometry);
+            auto elemSol = elementSolution(element, sol, gridGeometry);
             referencePorosity_[eIdx].resize(fvGeometry.numScv());
             for (const auto& scv : scvs(fvGeometry))
             {
@@ -191,22 +191,22 @@ public:
      *
      *  \f[referencePermeability = initialPermeability^2 / evaluatePermeability() \f]
      *
-     * \param fvGridGeometry The fvGridGeometry
+     * \param gridGeometry The gridGeometry
      * \param sol The (initial) solution vector
      */
     template<class SolutionVector>
-    void computeReferencePermeability(const FVGridGeometry& fvGridGeometry,
+    void computeReferencePermeability(const GridGeometry& gridGeometry,
                                       const SolutionVector& sol)
     {
-        referencePermeability_.resize(fvGridGeometry.gridView().size(0));
-        for (const auto& element : elements(fvGridGeometry.gridView()))
+        referencePermeability_.resize(gridGeometry.gridView().size(0));
+        for (const auto& element : elements(gridGeometry.gridView()))
         {
-            auto fvGeometry = localView(fvGridGeometry);
+            auto fvGeometry = localView(gridGeometry);
             fvGeometry.bindElement(element);
 
             const auto eIdx = this->gridGeometry().elementMapper().index(element);
 
-            auto elemSol = elementSolution(element, sol, fvGridGeometry);
+            auto elemSol = elementSolution(element, sol, gridGeometry);
             referencePermeability_[eIdx].resize(fvGeometry.numScv());
             for (const auto& scv : scvs(fvGeometry))
             {
@@ -249,10 +249,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(pcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(pcKrSwCurve_);
     }
 
     // define which phase is to be considered as the wetting phase
@@ -260,6 +260,15 @@ public:
     int wettingPhaseAtPos(const GlobalPosition& globalPos) const
     { return FluidSystem::liquidPhaseIdx; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 300;
+    }
+
 private:
     static constexpr Scalar eps_ = 1e-6;
 
diff --git a/exercises/exercise-biomineralization/main.cc b/exercises/exercise-biomineralization/main.cc
index 9aa45302983a3f1de066a4905849e666b6df80e6..dcef5a0e28bac57d09204a232ce57d4cf1d10246 100644
--- a/exercises/exercise-biomineralization/main.cc
+++ b/exercises/exercise-biomineralization/main.cc
@@ -83,27 +83,26 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
     problem->applyInitialSolution(x);
     auto xOld = x;
 
     // initialize the spatialParams separately to compute the referencePorosity and referencePermeability
-    problem->spatialParams().computeReferencePorosity(*fvGridGeometry, x);
-    problem->spatialParams().computeReferencePermeability(*fvGridGeometry, x);
+    problem->spatialParams().computeReferencePorosity(*gridGeometry, x);
+    problem->spatialParams().computeReferencePermeability(*gridGeometry, x);
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -130,11 +129,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/exercise-fluidsystem/2p2cproblem.hh b/exercises/exercise-fluidsystem/2p2cproblem.hh
index 48d43b2dbb668741ff65a8283b412c8415bc12fb..e28394cb943987918a16622fe50ebfddf356dc16 100644
--- a/exercises/exercise-fluidsystem/2p2cproblem.hh
+++ b/exercises/exercise-fluidsystem/2p2cproblem.hh
@@ -55,14 +55,14 @@ class ExerciseFluidsystemProblemTwoPTwoC : public PorousMediumFlowProblem<TypeTa
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
 
 public:
-    ExerciseFluidsystemProblemTwoPTwoC(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    ExerciseFluidsystemProblemTwoPTwoC(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
         , eps_(3e-6)
     {
 
@@ -73,17 +73,6 @@ public:
         depthBOR_ = this->gridGeometry().bBoxMax()[dimWorld-1];
     }
 
-    /*!
-     * \name Problem parameters
-     */
-    // \{
-
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    { return 283.15; }
-
      /*!
      * \name Boundary conditions
      */
diff --git a/exercises/exercise-fluidsystem/2p2cproperties.hh b/exercises/exercise-fluidsystem/2p2cproperties.hh
index e39bf9b30a25bb54553a1613afe71a64ae404221..18e45d9cb50c27f86a66a3cdf805f858d7ef1d00 100644
--- a/exercises/exercise-fluidsystem/2p2cproperties.hh
+++ b/exercises/exercise-fluidsystem/2p2cproperties.hh
@@ -59,10 +59,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoPTwoC>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+    using type = ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set grid and the grid creator to be used
diff --git a/exercises/exercise-fluidsystem/2pproblem.hh b/exercises/exercise-fluidsystem/2pproblem.hh
index c80d471d2dad8c534ee25e71ec4159c09ee51ff7..2a59fc424f4b728edfe94741db9f7169177de29d 100644
--- a/exercises/exercise-fluidsystem/2pproblem.hh
+++ b/exercises/exercise-fluidsystem/2pproblem.hh
@@ -61,7 +61,7 @@ class ExerciseFluidsystemProblemTwoP : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using FluidState = GetPropType<TypeTag, Properties::FluidState>;
@@ -75,8 +75,8 @@ class ExerciseFluidsystemProblemTwoP : public PorousMediumFlowProblem<TypeTag>
     };
 
 public:
-    ExerciseFluidsystemProblemTwoP(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    ExerciseFluidsystemProblemTwoP(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     , eps_(3e-6)
     {
 
@@ -96,17 +96,6 @@ public:
             plotDensity_();
     }
 
-    /*!
-     * \name Problem parameters
-     */
-    // \{
-
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    { return 283.15; }
-
      /*!
      * \name Boundary conditions
      */
@@ -218,7 +207,7 @@ private:
     void plotDensity_()
     {
         FluidState fluidState;
-        fluidState.setTemperature(temperature());
+        fluidState.setTemperature(283.15);
         int numberOfPoints = 100;
         Scalar xMin = 1e4;
         Scalar xMax = 1e7;
diff --git a/exercises/exercise-fluidsystem/2pproperties.hh b/exercises/exercise-fluidsystem/2pproperties.hh
index b70da83bc3a12cc39f23bbffad2753cbb5ca63ba..f924b70e571416ef1994e43e6adb733f8424e51b 100644
--- a/exercises/exercise-fluidsystem/2pproperties.hh
+++ b/exercises/exercise-fluidsystem/2pproperties.hh
@@ -71,10 +71,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoP>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+    using type = ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set grid to be used
diff --git a/exercises/exercise-fluidsystem/main.cc b/exercises/exercise-fluidsystem/main.cc
index ddbb05f6e84c02f7fa71d450dab0849545d03278..c89c8182374f268fd14f0dd429d0aee8ef8984b8 100644
--- a/exercises/exercise-fluidsystem/main.cc
+++ b/exercises/exercise-fluidsystem/main.cc
@@ -89,23 +89,22 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
     problem->applyInitialSolution(x);
     auto xOld = x;
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
 
@@ -128,11 +127,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric, /*implicit?*/true>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
      // the non-linear solver
     using NewtonSolver = NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/exercise-fluidsystem/spatialparams.hh b/exercises/exercise-fluidsystem/spatialparams.hh
index e4f41812d993e8c6c10811b4fa177cecb57e347a..c85b76492d24ed7a7dfc089d1051db836773bb33 100644
--- a/exercises/exercise-fluidsystem/spatialparams.hh
+++ b/exercises/exercise-fluidsystem/spatialparams.hh
@@ -26,7 +26,7 @@
 #define DUMUX_EXERCISE_FLUIDSYSTEM_SPATIAL_PARAMS_HH
 
 // include parent spatialparameters
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 
 //inlclude fluid matrix interaction relationship
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
@@ -40,13 +40,13 @@ namespace Dumux {
  * \brief The spatial parameters for the exercise-fluidsystem problem
  *        which uses the two-phase and two-phase two-component box model.
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class ExerciseFluidsystemSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>>
 {
-    using ThisType = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
-    using GridView = typename FVGridGeometry::GridView;
+    using ThisType = ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
+    using GridView = typename GridGeometry::GridView;
 
     static constexpr int dim = GridView::dimension;
     static constexpr int dimWorld = GridView::dimensionworld;
@@ -62,10 +62,10 @@ public:
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
-    ExerciseFluidsystemSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    ExerciseFluidsystemSpatialParams(std::shared_ptr<const GridGeometry>& gridGeometry)
+    : ParentType(gridGeometry)
     , K_(0)
     , KLens_(0)
     , pcKrSwCurve_("SpatialParams")
@@ -145,6 +145,15 @@ public:
                (x < 50 + eps_ && x > 30 - eps_ && y < 30 + eps_ && y > 15 - eps_);
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
 private:
     static constexpr Scalar eps_ = 1e-6;
 
diff --git a/exercises/exercise-fractures/fractureproblem.hh b/exercises/exercise-fractures/fractureproblem.hh
index 141ee88f13acb3ce13fca9d9afc244c728790e67..df925bae6f945f09549ae457c36e5446208fdf89 100644
--- a/exercises/exercise-fractures/fractureproblem.hh
+++ b/exercises/exercise-fractures/fractureproblem.hh
@@ -53,10 +53,10 @@ class FractureSubProblem : public PorousMediumFlowProblem<TypeTag>
     using ElementVolumeVariables = typename GridVariables::GridVolumeVariables::LocalView;
     using Scalar = typename GridVariables::Scalar;
 
-    using FVGridGeometry = typename GridVariables::GridGeometry;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
-    using SubControlVolume = typename FVGridGeometry::SubControlVolume;
-    using GridView = typename FVGridGeometry::GridView;
+    using GridGeometry = typename GridVariables::GridGeometry;
+    using FVElementGeometry = typename GridGeometry::LocalView;
+    using SubControlVolume = typename GridGeometry::SubControlVolume;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
@@ -70,11 +70,10 @@ class FractureSubProblem : public PorousMediumFlowProblem<TypeTag>
 
 public:
     //! The constructor
-    FractureSubProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    FractureSubProblem(std::shared_ptr<const GridGeometry> gridGeometry,
                        std::shared_ptr<typename ParentType::SpatialParams> spatialParams,
                        const std::string& paramGroup)
-    : ParentType(fvGridGeometry, spatialParams, paramGroup)
-    , aperture_(getParamFromGroup<Scalar>(paramGroup, "SpatialParams.Aperture"))
+    : ParentType(gridGeometry, spatialParams, paramGroup)
     {
         // initialize the fluid system, i.e. the tabulation
         // of water properties. Use the default p/T ranges.
@@ -116,15 +115,6 @@ public:
         return source;
     }
 
-    //! Set the aperture as extrusion factor.
-    Scalar extrusionFactorAtPos(const GlobalPosition& globalPos) const
-    {
-        // We treat the fractures as lower-dimensional in the grid,
-        // but we have to give it the aperture as extrusion factor
-        // such that the dimensions are correct in the end.
-        return aperture_;
-    }
-
     //! evaluates the Dirichlet boundary condition for a given position
     PrimaryVariables dirichletAtPos(const GlobalPosition& globalPos) const
     { return initialAtPos(globalPos); }
@@ -145,10 +135,6 @@ public:
         return values;
     }
 
-    //! returns the temperature in \f$\mathrm{[K]}\f$ in the domain
-    Scalar temperature() const
-    { return 283.15; /*10°*/ }
-
     //! sets the pointer to the coupling manager.
     void setCouplingManager(std::shared_ptr<CouplingManager> cm)
     { couplingManagerPtr_ = cm; }
diff --git a/exercises/exercise-fractures/fracturespatialparams.hh b/exercises/exercise-fractures/fracturespatialparams.hh
index 61bdf4fc3d1e9573e2c2e5967732f1bedd6368e4..1874ce704110e27a5e076c89b009e8c26c191f62 100644
--- a/exercises/exercise-fractures/fracturespatialparams.hh
+++ b/exercises/exercise-fractures/fracturespatialparams.hh
@@ -29,7 +29,7 @@
 
 #include <dumux/io/grid/griddata.hh>
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/vangenuchten.hh>
 
 namespace Dumux {
@@ -40,15 +40,15 @@ namespace Dumux {
  * \ingroup TwoPTests
  * \brief The spatial params the two-phase facet coupling test
  */
-template< class FVGridGeometry, class Scalar >
+template< class GridGeometry, class Scalar >
 class FractureSpatialParams
-: public FVSpatialParams< FVGridGeometry, Scalar, FractureSpatialParams<FVGridGeometry, Scalar> >
+: public FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, FractureSpatialParams<GridGeometry, Scalar> >
 {
-    using ThisType = FractureSpatialParams< FVGridGeometry, Scalar >;
-    using ParentType = FVSpatialParams< FVGridGeometry, Scalar, ThisType >;
+    using ThisType = FractureSpatialParams< GridGeometry, Scalar >;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, ThisType >;
 
-    using SubControlVolume = typename FVGridGeometry::SubControlVolume;
-    using GridView = typename FVGridGeometry::GridView;
+    using SubControlVolume = typename GridGeometry::SubControlVolume;
+    using GridView = typename GridGeometry::GridView;
     using Grid = typename GridView::Grid;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
@@ -64,10 +64,10 @@ public:
     using PermeabilityType = Scalar;
 
     //! the constructor
-    FractureSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    FractureSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry,
                           std::shared_ptr<const Dumux::GridData<Grid>> gridData,
                           const std::string& paramGroup)
-    : ParentType(fvGridGeometry)
+    : ParentType(gridGeometry)
     , gridDataPtr_(gridData)
     , pcKrSwCurve_("Fracture.SpatialParams")
     , barrierPcKrSwCurve_("Fracture.SpatialParams.Barrier")
@@ -76,6 +76,7 @@ public:
         porosityBarrier_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.PorosityBarrier");
         permeability_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.Permeability");
         permeabilityBarrier_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.PermeabilityBarrier");
+        aperture_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.Aperture");
     }
 
     //! Function for defining the (intrinsic) permeability \f$[m^2]\f$.
@@ -111,10 +112,10 @@ public:
     auto fluidMatrixInteraction(const Element& element,
                                 const SubControlVolume& scv,
                                 const ElementSolution& elemSol) const
-    {  
+    {
         // TODO dumux-course-task B
         // Change fracture properties
-        return makeFluidMatrixInteraction(pcKrSwCurve_); 
+        return makeFluidMatrixInteraction(pcKrSwCurve_);
     }
 
     //! Water is the wetting phase
@@ -126,6 +127,24 @@ public:
         return FluidSystem::phase0Idx;
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
+    //! Set the aperture as extrusion factor.
+    Scalar extrusionFactorAtPos(const GlobalPosition& globalPos) const
+    {
+        // We treat the fractures as lower-dimensional in the grid,
+        // but we have to give it the aperture as extrusion factor
+        // such that the dimensions are correct in the end.
+        return aperture_;
+    }
+
     //! returns the domain marker for an element
     int getElementDomainMarker(const Element& element) const
     { return gridDataPtr_->getElementDomainMarker(element); }
@@ -136,6 +155,7 @@ private:
 
     Scalar porosity_;
     Scalar porosityBarrier_;
+    Scalar aperture_;
     PermeabilityType permeability_;
     PermeabilityType permeabilityBarrier_;
     const PcKrSwCurve pcKrSwCurve_;
diff --git a/exercises/exercise-fractures/main.cc b/exercises/exercise-fractures/main.cc
index 12485ac9bb90cebfac354beb7bd8cd3492112e25..2b4bba69db7c3a59cfc9f1cea286a729efc5bd67 100644
--- a/exercises/exercise-fractures/main.cc
+++ b/exercises/exercise-fractures/main.cc
@@ -50,10 +50,10 @@
 // reuse them again in the main function with only one single definition of them here
 using MatrixTypeTag = Dumux::Properties::TTag::MatrixProblem;
 using FractureTypeTag = Dumux::Properties::TTag::FractureProblem;
-using MatrixFVGridGeometry = Dumux::GetPropType<MatrixTypeTag, Dumux::Properties::GridGeometry>;
-using FractureFVGridGeometry = Dumux::GetPropType<FractureTypeTag, Dumux::Properties::GridGeometry>;
+using MatrixGridGeometry = Dumux::GetPropType<MatrixTypeTag, Dumux::Properties::GridGeometry>;
+using FractureGridGeometry = Dumux::GetPropType<FractureTypeTag, Dumux::Properties::GridGeometry>;
 using TheMultiDomainTraits = Dumux::MultiDomainTraits<MatrixTypeTag, FractureTypeTag>;
-using TheCouplingMapper = Dumux::FacetCouplingMapper<MatrixFVGridGeometry, FractureFVGridGeometry>;
+using TheCouplingMapper = Dumux::FacetCouplingMapper<MatrixGridGeometry, FractureGridGeometry>;
 using TheCouplingManager = Dumux::FacetCouplingManager<TheMultiDomainTraits, TheCouplingMapper>;
 
 // set the coupling manager property in the sub-problems
@@ -111,10 +111,8 @@ int main(int argc, char** argv)
     const auto& fractureGridView = gridManager.template grid<fractureGridId>().leafGridView();
 
     // create the finite volume grid geometries
-    auto matrixFvGridGeometry = std::make_shared<MatrixFVGridGeometry>(matrixGridView);
-    auto fractureFvGridGeometry = std::make_shared<FractureFVGridGeometry>(fractureGridView);
-    matrixFvGridGeometry->update();
-    fractureFvGridGeometry->update();
+    auto matrixFvGridGeometry = std::make_shared<MatrixGridGeometry>(matrixGridView);
+    auto fractureFvGridGeometry = std::make_shared<FractureGridGeometry>(fractureGridView);
 
     // the problems (boundary/initial conditions etc)
     using MatrixProblem = GetPropType<MatrixTypeTag, Properties::Problem>;
diff --git a/exercises/exercise-fractures/matrixproblem.hh b/exercises/exercise-fractures/matrixproblem.hh
index 1da40a746283ccaed583365dfe42027254cf4acb..4a9ca805fa5e1b05beb7dddb7c7115f5c2b14ca8 100644
--- a/exercises/exercise-fractures/matrixproblem.hh
+++ b/exercises/exercise-fractures/matrixproblem.hh
@@ -56,11 +56,11 @@ class MatrixSubProblem : public PorousMediumFlowProblem<TypeTag>
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
     using Scalar = typename GridVariables::Scalar;
 
-    using FVGridGeometry = typename GridVariables::GridGeometry;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
-    using SubControlVolume = typename FVGridGeometry::SubControlVolume;
-    using SubControlVolumeFace = typename FVGridGeometry::SubControlVolumeFace;
-    using GridView = typename FVGridGeometry::GridView;
+    using GridGeometry = typename GridVariables::GridGeometry;
+    using FVElementGeometry = typename GridGeometry::LocalView;
+    using SubControlVolume = typename GridGeometry::SubControlVolume;
+    using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
@@ -74,10 +74,10 @@ class MatrixSubProblem : public PorousMediumFlowProblem<TypeTag>
 
 public:
     //! The constructor
-    MatrixSubProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    MatrixSubProblem(std::shared_ptr<const GridGeometry> gridGeometry,
                      std::shared_ptr<typename ParentType::SpatialParams> spatialParams,
                      const std::string& paramGroup = "")
-    : ParentType(fvGridGeometry, spatialParams, paramGroup)
+    : ParentType(gridGeometry, spatialParams, paramGroup)
     , boundaryOverPressure_(getParamFromGroup<Scalar>(paramGroup, "Problem.BoundaryOverPressure"))
     , boundarySaturation_(getParamFromGroup<Scalar>(paramGroup, "Problem.BoundarySaturation"))
     {
@@ -160,10 +160,6 @@ public:
         return values;
     }
 
-    //! returns the temperature in \f$\mathrm{[K]}\f$ in the domain
-    Scalar temperature() const
-    { return 283.15; /*10°*/ }
-
     //! sets the pointer to the coupling manager.
     void setCouplingManager(std::shared_ptr<CouplingManager> cm)
     { couplingManagerPtr_ = cm; }
diff --git a/exercises/exercise-fractures/matrixspatialparams.hh b/exercises/exercise-fractures/matrixspatialparams.hh
index 939e488d829780825b1ce80d382b85f532c7e9a3..219bf8bfd56dad60cfb7e6c273e09884355da82e 100644
--- a/exercises/exercise-fractures/matrixspatialparams.hh
+++ b/exercises/exercise-fractures/matrixspatialparams.hh
@@ -29,7 +29,7 @@
 
 #include <dumux/io/grid/griddata.hh>
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/vangenuchten.hh>
 
 namespace Dumux {
@@ -40,14 +40,14 @@ namespace Dumux {
  * \ingroup TwoPTests
  * \brief The spatial params the two-phase facet coupling test
  */
-template< class FVGridGeometry, class Scalar >
+template< class GridGeometry, class Scalar >
 class MatrixSpatialParams
-: public FVSpatialParams< FVGridGeometry, Scalar, MatrixSpatialParams<FVGridGeometry, Scalar> >
+: public FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, MatrixSpatialParams<GridGeometry, Scalar> >
 {
-    using ThisType = MatrixSpatialParams< FVGridGeometry, Scalar >;
-    using ParentType = FVSpatialParams< FVGridGeometry, Scalar, ThisType >;
+    using ThisType = MatrixSpatialParams< GridGeometry, Scalar >;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, ThisType >;
 
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using Grid = typename GridView::Grid;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
@@ -59,10 +59,10 @@ public:
     using PermeabilityType = Scalar;
 
     //! the constructor
-    MatrixSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    MatrixSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry,
                         std::shared_ptr<const Dumux::GridData<Grid>> gridData,
                         const std::string& paramGroup)
-    : ParentType(fvGridGeometry)
+    : ParentType(gridGeometry)
     , gridDataPtr_(gridData)
     , pcKrSwCurve_("Matrix.SpatialParams")
     {
@@ -83,8 +83,8 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
-        return makeFluidMatrixInteraction(pcKrSwCurve_); 
+    {
+        return makeFluidMatrixInteraction(pcKrSwCurve_);
     }
 
     //! Water is the wetting phase
@@ -96,6 +96,15 @@ public:
         return FluidSystem::phase0Idx;
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
     //! returns the domain marker for an element
     int getElementDomainMarker(const Element& element) const
     { return gridDataPtr_->getElementDomainMarker(element); }
diff --git a/exercises/exercise-grids/main.cc b/exercises/exercise-grids/main.cc
index ab18bc538e9b9bbcca6f4b57da2b1eca37d0ba20..cd12fcd8ba836a95e80510232bb4eb1b85ad225d 100644
--- a/exercises/exercise-grids/main.cc
+++ b/exercises/exercise-grids/main.cc
@@ -82,13 +82,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -98,7 +97,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -123,11 +122,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/exercise-grids/problem.hh b/exercises/exercise-grids/problem.hh
index 6b03c509bfa456b3f246596320a21653f49f98d1..fe9b6bdee3f26a669524719206b45474e1d5582a 100644
--- a/exercises/exercise-grids/problem.hh
+++ b/exercises/exercise-grids/problem.hh
@@ -62,7 +62,7 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -72,8 +72,8 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    InjectionProblem2P(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionProblem2P(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
@@ -106,14 +106,6 @@ public:
     std::string name() const
     { return name_+"-2p"; }
 
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    {
-        return 273.15 + 30; // [K]
-    }
-
     // \}
 
     /*!
@@ -195,7 +187,7 @@ public:
         PrimaryVariables values(0.0);
 
         // get the water density at atmospheric conditions
-        const Scalar densityW = FluidSystem::H2O::liquidDensity(temperature(), 1.0e5);
+        const Scalar densityW = FluidSystem::H2O::liquidDensity(this->spatialParams().temperatureAtPos(globalPos), 1.0e5);
 
         // assume an intially hydrostatic liquid pressure profile
         // note: we subtract rho_w*g*h because g is defined negative
diff --git a/exercises/exercise-grids/properties.hh b/exercises/exercise-grids/properties.hh
index 81227d89e2c6c84eb2903033244ac2e2a88cf170..4e2e0e7b939a9b38437c14010cfa32e821631ec3 100644
--- a/exercises/exercise-grids/properties.hh
+++ b/exercises/exercise-grids/properties.hh
@@ -65,10 +65,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2p>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/exercise-grids/spatialparams.hh b/exercises/exercise-grids/spatialparams.hh
index 433e3f6baa61ff2763c6ba31f543b72fd11f5136..0160b1a628d53c4a2deb28ea993229289f8b4cd8 100644
--- a/exercises/exercise-grids/spatialparams.hh
+++ b/exercises/exercise-grids/spatialparams.hh
@@ -27,7 +27,7 @@
 #ifndef DUMUX_EXGRIDS_INJECTION_SPATIAL_PARAMS_HH
 #define DUMUX_EXGRIDS_INJECTION_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 
 #include <dumux/io/gnuplotinterface.hh>
@@ -41,13 +41,13 @@ namespace Dumux {
  *        which uses the isothermal two-phase two-component
  *        fully implicit model.
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class InjectionSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, InjectionSpatialParams<GridGeometry, Scalar>>
 {
-    using ThisType = InjectionSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
-    using GridView = typename FVGridGeometry::GridView;
+    using ThisType = InjectionSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
+    using GridView = typename GridGeometry::GridView;
 
     // get the dimensions of the simulation domain from GridView
     static const int dimWorld = GridView::dimensionworld;
@@ -63,10 +63,10 @@ public:
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
-    InjectionSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionSpatialParams(std::shared_ptr<const GridGeometry>& gridGeometry)
+    : ParentType(gridGeometry)
     , aquitardPcKrSwCurve_("SpatialParams.Aquitard")
     , aquiferPcKrSwCurve_("SpatialParams.Aquifer")
     {
@@ -113,10 +113,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_);
     }
 
     /*!
@@ -129,6 +129,15 @@ public:
     int wettingPhaseAtPos(const GlobalPosition& globalPos) const
     { return FluidSystem::H2OIdx; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 273.15 + 30;
+    }
+
 private:
 
     static constexpr Scalar eps_ = 1e-6;
diff --git a/exercises/exercise-mainfile/1pproblem.hh b/exercises/exercise-mainfile/1pproblem.hh
index 81c18c9dced15c21730a35863711e5915b717446..3e03c831b1547e600756e415188d7192949f4814 100644
--- a/exercises/exercise-mainfile/1pproblem.hh
+++ b/exercises/exercise-mainfile/1pproblem.hh
@@ -45,15 +45,15 @@ class OnePTestProblem : public PorousMediumFlowProblem<TypeTag>
     using Element = typename GridView::template Codim<0>::Entity;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
     static constexpr int dimWorld = GridView::dimensionworld;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
 
 public:
-    OnePTestProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    OnePTestProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         FluidSystem::Component::init(/*tempMin=*/272.15,
                                      /*tempMax=*/294.15,
@@ -105,17 +105,6 @@ public:
         return PrimaryVariables(1.0e5);
     }
 
-    /*!
-     * \brief Returns the temperature \f$\mathrm{[K]}\f$ for an isothermal problem.
-     *
-     * This is not specific to the discretization. By default it just
-     * throws an exception so it must be overloaded by the problem if
-     * no energy equation is used.
-     */
-    Scalar temperature() const
-    {
-        return 283.15; // 10°C
-    }
 };
 
 } // end namespace Dumux
diff --git a/exercises/exercise-mainfile/1pspatialparams.hh b/exercises/exercise-mainfile/1pspatialparams.hh
index a7df1fd516c48b61e2c8c3a6c57325e0be49a3b6..09d19d2a050df89e5d7f33b96572cde697a3d626 100644
--- a/exercises/exercise-mainfile/1pspatialparams.hh
+++ b/exercises/exercise-mainfile/1pspatialparams.hh
@@ -24,7 +24,7 @@
 #ifndef DUMUX_EX_MAINFILE_ONEP_TEST_SPATIAL_PARAMS_HH
 #define DUMUX_EX_MAINFILE_ONEP_TEST_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv1p.hh>
+#include <dumux/porousmediumflow/fvspatialparams1p.hh>
 
 namespace Dumux {
 
@@ -33,23 +33,23 @@ namespace Dumux {
  * \brief The spatial parameters class for the test problem using the
  *        compressible 1p model
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class OnePTestSpatialParams
-: public FVSpatialParamsOneP<FVGridGeometry, Scalar, OnePTestSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsOneP<GridGeometry, Scalar, OnePTestSpatialParams<GridGeometry, Scalar>>
 {
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
+    using FVElementGeometry = typename GridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
-    using ParentType = FVSpatialParamsOneP<FVGridGeometry, Scalar, OnePTestSpatialParams<FVGridGeometry, Scalar>>;
+    using ParentType = FVPorousMediumFlowSpatialParamsOneP<GridGeometry, Scalar, OnePTestSpatialParams<GridGeometry, Scalar>>;
 
     static constexpr int dimWorld = GridView::dimensionworld;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
     using PermeabilityType = Scalar;
-    OnePTestSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    OnePTestSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         permeability_ = getParam<Scalar>("SpatialParams.Permeability");
         permeabilityLens_ = getParam<Scalar>("SpatialParams.PermeabilityLens");
@@ -85,6 +85,15 @@ public:
     Scalar porosityAtPos(const GlobalPosition& globalPos) const
     { return 0.4; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
 private:
     bool isInLens_(const GlobalPosition &globalPos) const
     {
diff --git a/exercises/exercise-mainfile/exercise1pamain.cc b/exercises/exercise-mainfile/exercise1pamain.cc
index d3b3b5d50fe1dd160b2f5b18af2467fea30342a4..0d749a9143d3f18d865380fa8e1416cb4aa94d71 100644
--- a/exercises/exercise-mainfile/exercise1pamain.cc
+++ b/exercises/exercise-mainfile/exercise1pamain.cc
@@ -81,21 +81,20 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // intialize the vtk output module
@@ -113,7 +112,7 @@ int main(int argc, char** argv)
 
     // the assembler for stationary problems
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables);
 
     // the linear solver
     using LinearSolver = ILU0BiCGSTABBackend;
diff --git a/exercises/exercise-mainfile/exercise1pbmain.cc b/exercises/exercise-mainfile/exercise1pbmain.cc
index eadf97acfef966d1ece656d823f72afb8664674d..47db200f08d61cbdbaaea658373561697ace6a18 100644
--- a/exercises/exercise-mainfile/exercise1pbmain.cc
+++ b/exercises/exercise-mainfile/exercise1pbmain.cc
@@ -82,21 +82,20 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // intialize the vtk output module
@@ -110,7 +109,7 @@ int main(int argc, char** argv)
     Dune::Timer timer;
     // the assembler for stationary problems
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables);
 
     // the linear solver
     using LinearSolver = ILU0BiCGSTABBackend;
diff --git a/exercises/exercise-mainfile/exercise1pcmain.cc b/exercises/exercise-mainfile/exercise1pcmain.cc
index 003677cb2816118f62c33f98d674a142be530455..44203d74143d0aa3785f6bf748488dccfaca9810 100644
--- a/exercises/exercise-mainfile/exercise1pcmain.cc
+++ b/exercises/exercise-mainfile/exercise1pcmain.cc
@@ -82,23 +82,22 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
     problem->applyInitialSolution(x);
     auto xOld = x;
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // intialize the vtk output module
@@ -121,7 +120,7 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
     using LinearSolver = ILU0BiCGSTABBackend;
diff --git a/exercises/exercise-properties/main.cc b/exercises/exercise-properties/main.cc
index 2f4b3774e3f611b9c0c017fc0942c3c5695c3ede..4195142f2d7ff936583a0d324117b9b2446e6de1 100644
--- a/exercises/exercise-properties/main.cc
+++ b/exercises/exercise-properties/main.cc
@@ -112,13 +112,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -128,7 +127,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -151,11 +150,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/exercise-properties/problem.hh b/exercises/exercise-properties/problem.hh
index 655789eb497f36e2c5f5e93327a2505487e756a8..e0c15fd867f2bb0e0d8005361d4e51e6c9f8c560 100644
--- a/exercises/exercise-properties/problem.hh
+++ b/exercises/exercise-properties/problem.hh
@@ -43,7 +43,7 @@ class TwoPTestProblem : public PorousMediumFlowProblem<TypeTag>
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -57,8 +57,8 @@ class TwoPTestProblem : public PorousMediumFlowProblem<TypeTag>
     };
 
 public:
-    TwoPTestProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry) {}
+    TwoPTestProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry) {}
 
     /*!
      * \brief Specifies which kind of boundary condition should be
@@ -89,7 +89,7 @@ public:
     {
         PrimaryVariables values;
         GetPropType<TypeTag, Properties::FluidState> fluidState;
-        fluidState.setTemperature(temperature());
+        fluidState.setTemperature(this->spatialParams().temperatureAtPos(globalPos));
         fluidState.setPressure(waterPhaseIdx, /*pressure=*/1e5);
         fluidState.setPressure(dnaplPhaseIdx, /*pressure=*/1e5);
 
@@ -140,7 +140,7 @@ public:
     {
         PrimaryVariables values;
         GetPropType<TypeTag, Properties::FluidState> fluidState;
-        fluidState.setTemperature(temperature());
+        fluidState.setTemperature(this->spatialParams().temperatureAtPos(globalPos));
         fluidState.setPressure(waterPhaseIdx, /*pressure=*/1e5);
         fluidState.setPressure(dnaplPhaseIdx, /*pressure=*/1e5);
 
@@ -154,18 +154,6 @@ public:
         return values;
     }
 
-    /*!
-     * \brief Returns the temperature \f$\mathrm{[K]}\f$ for an isothermal problem.
-     *
-     * This is not specific to the discretization. By default it just
-     * throws an exception so it must be overloaded by the problem if
-     * no energy equation is used.
-     */
-    Scalar temperature() const
-    {
-        return 293.15; // 10°C
-    }
-
 private:
     bool onLeftBoundary_(const GlobalPosition &globalPos) const
     {
diff --git a/exercises/exercise-properties/properties.hh b/exercises/exercise-properties/properties.hh
index d8beb946a296ca88bd7b1b69fb9b877cd09f6fd7..7b818f39420a24bfd28b4283cc08ae3acd70c49e 100644
--- a/exercises/exercise-properties/properties.hh
+++ b/exercises/exercise-properties/properties.hh
@@ -78,10 +78,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::TwoPIncompressible>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = TwoPTestSpatialParams<FVGridGeometry, Scalar>;
+    using type = TwoPTestSpatialParams<GridGeometry, Scalar>;
 };
 
 } // end namespace Dumux::Properties
diff --git a/exercises/exercise-properties/spatialparams.hh b/exercises/exercise-properties/spatialparams.hh
index 90af3c6f2efe86b6ff26b548a11f6922f7f27db5..045c4f9824f741da18b5c24713ab6f3640472c31 100644
--- a/exercises/exercise-properties/spatialparams.hh
+++ b/exercises/exercise-properties/spatialparams.hh
@@ -23,7 +23,7 @@
 #ifndef DUMUX_INCOMPRESSIBLE_TWOP_TEST_SPATIAL_PARAMS_HH
 #define DUMUX_INCOMPRESSIBLE_TWOP_TEST_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/vangenuchten.hh>
 
 namespace Dumux {
@@ -32,16 +32,16 @@ namespace Dumux {
  * \ingroup TwoPTests
  * \brief The spatial params for the incompressible 2p test
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class TwoPTestSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, TwoPTestSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, TwoPTestSpatialParams<GridGeometry, Scalar>>
 {
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
+    using FVElementGeometry = typename GridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
-    using ThisType = TwoPTestSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
+    using ThisType = TwoPTestSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
 
     static constexpr int dimWorld = GridView::dimensionworld;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
@@ -51,8 +51,8 @@ class TwoPTestSpatialParams
 public:
     using PermeabilityType = Scalar;
 
-    TwoPTestSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    TwoPTestSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     , lensPcKrSwCurve_("SpatialParams.Lens")
     , outerPcKrSwCurve_("SpatialParams.OuterDomain")
     {
@@ -114,6 +114,15 @@ public:
         return FluidSystem::phase0Idx;
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 293.15;
+    }
+
 private:
     bool isInLens_(const GlobalPosition &globalPos) const
     {
diff --git a/exercises/exercise-runtimeparams/main.cc b/exercises/exercise-runtimeparams/main.cc
index c16c2bd6409b531ac91d766400795730808933fb..b80387709c3d76673cacd4eecf4f40c0397c65c2 100644
--- a/exercises/exercise-runtimeparams/main.cc
+++ b/exercises/exercise-runtimeparams/main.cc
@@ -82,13 +82,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -98,7 +97,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -123,11 +122,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/exercise-runtimeparams/problem.hh b/exercises/exercise-runtimeparams/problem.hh
index f5ebbea1128d1fda598f50ffb396541063c206d8..54a1ddf22e4177493494fac92d55841cc7de914d 100644
--- a/exercises/exercise-runtimeparams/problem.hh
+++ b/exercises/exercise-runtimeparams/problem.hh
@@ -62,7 +62,7 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -72,8 +72,8 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    InjectionProblem2P(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionProblem2P(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
@@ -114,14 +114,6 @@ public:
     std::string name() const
     { return name_+"-2p"; }
 
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    {
-        return 273.15 + 30; // [K]
-    }
-
     // \}
 
     /*!
@@ -204,7 +196,7 @@ public:
         PrimaryVariables values(0.0);
 
         // get the water density at atmospheric conditions
-        const Scalar densityW = FluidSystem::H2O::liquidDensity(temperature(), 1.0e5);
+        const Scalar densityW = FluidSystem::H2O::liquidDensity(this->spatialParams().temperatureAtPos(globalPos), 1.0e5);
 
         // assume an intially hydrostatic liquid pressure profile
         // note: we subtract rho_w*g*h because g is defined negative
diff --git a/exercises/exercise-runtimeparams/properties.hh b/exercises/exercise-runtimeparams/properties.hh
index 6b3f3110124242fdf6af128515f0bb059efe7404..5cb1c0bc0fc95f90e37f0bf6dd7fa70014d3f618 100644
--- a/exercises/exercise-runtimeparams/properties.hh
+++ b/exercises/exercise-runtimeparams/properties.hh
@@ -56,10 +56,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2p>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/exercise-runtimeparams/spatialparams.hh b/exercises/exercise-runtimeparams/spatialparams.hh
index a6b67613a8f2596e5c2593b6e1af71781687df0c..e92f90b7ea2dbb9e3c2743b51dc10cd848773e58 100644
--- a/exercises/exercise-runtimeparams/spatialparams.hh
+++ b/exercises/exercise-runtimeparams/spatialparams.hh
@@ -27,7 +27,7 @@
 #ifndef DUMUX_EXRUNTIMEPARAMS_INJECTION_SPATIAL_PARAMS_HH
 #define DUMUX_EXRUNTIMEPARAMS_INJECTION_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 
 #include <dumux/io/gnuplotinterface.hh>
@@ -41,13 +41,13 @@ namespace Dumux {
  *        which uses the isothermal two-phase two-component
  *        fully implicit model.
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class InjectionSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, InjectionSpatialParams<GridGeometry, Scalar>>
 {
-    using ThisType = InjectionSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
-    using GridView = typename FVGridGeometry::GridView;
+    using ThisType = InjectionSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
+    using GridView = typename GridGeometry::GridView;
 
     // get the dimensions of the simulation domain from GridView
     static const int dimWorld = GridView::dimensionworld;
@@ -63,10 +63,10 @@ public:
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
-    InjectionSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionSpatialParams(std::shared_ptr<const GridGeometry>& gridGeometry)
+    : ParentType(gridGeometry)
     , aquitardPcKrSwCurve_("SpatialParams.Aquitard")
     , aquiferPcKrSwCurve_("SpatialParams.Aquifer")
     {
@@ -113,10 +113,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_);
     }
 
     /*!
@@ -129,6 +129,15 @@ public:
     int wettingPhaseAtPos(const GlobalPosition& globalPos) const
     { return FluidSystem::H2OIdx; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 273.15 + 30;
+    }
+
 private:
 
     static constexpr Scalar eps_ = 1e-6;
diff --git a/exercises/solution/exercise-basic/2pnimain.cc b/exercises/solution/exercise-basic/2pnimain.cc
index df321e505e1177134baea5e013b959ed0f5476c0..671dc6a20a6cf5369fce826a5e6a1b87a77862e4 100644
--- a/exercises/solution/exercise-basic/2pnimain.cc
+++ b/exercises/solution/exercise-basic/2pnimain.cc
@@ -82,13 +82,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -98,7 +97,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -121,11 +120,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/solution/exercise-basic/injection2pniproblem.hh b/exercises/solution/exercise-basic/injection2pniproblem.hh
index 79d398d66c5fff7086995858c6c3525f76b21c71..4d387896880caf5fb534718f1fbeb70e249e35a6 100644
--- a/exercises/solution/exercise-basic/injection2pniproblem.hh
+++ b/exercises/solution/exercise-basic/injection2pniproblem.hh
@@ -61,7 +61,7 @@ class Injection2PNIProblem : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -71,8 +71,8 @@ class Injection2PNIProblem : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    Injection2PNIProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    Injection2PNIProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
diff --git a/exercises/solution/exercise-basic/properties2pni.hh b/exercises/solution/exercise-basic/properties2pni.hh
index dd6f0375a193f7778b58e3a509427d70a8af71ed..4f367702544d1f19eb154937a460eae78deabf10 100644
--- a/exercises/solution/exercise-basic/properties2pni.hh
+++ b/exercises/solution/exercise-basic/properties2pni.hh
@@ -55,10 +55,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2pNITypeTag>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/solution/exercise-basic/spatialparams.hh b/exercises/solution/exercise-basic/spatialparams.hh
index b6c1e80de2505e2df071370f7a7a1efe80ff8131..a03c6ccbbc01fda3519c8a5ff0a9063e68d0d5d9 100644
--- a/exercises/solution/exercise-basic/spatialparams.hh
+++ b/exercises/solution/exercise-basic/spatialparams.hh
@@ -27,7 +27,7 @@
 #ifndef DUMUX_EX_BASIC_SPATIAL_PARAMS_HH
 #define DUMUX_EX_BASIC_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 
 #include <dumux/io/gnuplotinterface.hh>
@@ -41,13 +41,13 @@ namespace Dumux {
  *        which uses the isothermal two-phase two-component
  *        fully implicit model.
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class InjectionSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, InjectionSpatialParams<GridGeometry, Scalar>>
 {
-    using ThisType = InjectionSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
-    using GridView = typename FVGridGeometry::GridView;
+    using ThisType = InjectionSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
+    using GridView = typename GridGeometry::GridView;
 
     // get the dimensions of the simulation domain from GridView
     static const int dimWorld = GridView::dimensionworld;
@@ -63,10 +63,10 @@ public:
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
-    InjectionSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionSpatialParams(std::shared_ptr<const GridGeometry>& gridGeometry)
+    : ParentType(gridGeometry)
     , aquitardPcKrSwCurve_("SpatialParams.Aquitard")
     , aquiferPcKrSwCurve_("SpatialParams.Aquifer")
     {
@@ -112,10 +112,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_);
     }
 
     /*!
diff --git a/exercises/solution/exercise-biomineralization/biominproblem.hh b/exercises/solution/exercise-biomineralization/biominproblem.hh
index 9eddf020dfe11dc38536b4b80459735334d62b07..a51759cea16f5ed5ea74a94ff8497443c56f9f89 100644
--- a/exercises/solution/exercise-biomineralization/biominproblem.hh
+++ b/exercises/solution/exercise-biomineralization/biominproblem.hh
@@ -52,7 +52,7 @@ class BioMinProblem : public PorousMediumFlowProblem<TypeTag>
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
     using VolumeVariables = GetPropType<TypeTag, Properties::VolumeVariables>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
 
     // Grid dimension
@@ -98,11 +98,11 @@ class BioMinProblem : public PorousMediumFlowProblem<TypeTag>
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
 public:
-    BioMinProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    BioMinProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         name_           = getParam<std::string>("Problem.Name");
         //initial values
@@ -117,9 +117,9 @@ public:
         concCa_         = getParam<Scalar>("Injection.ConcCa");
         concUrea_       = getParam<Scalar>("Injection.ConcUrea");
 
-        unsigned int codim = GetPropType<TypeTag, Properties::GridGeometry>::discMethod == DiscretizationMethod::box ? dim : 0;
-        Kxx_.resize(fvGridGeometry->gridView().size(codim));
-        Kyy_.resize(fvGridGeometry->gridView().size(codim));
+        unsigned int codim = GetPropType<TypeTag, Properties::GridGeometry>::discMethod == DiscretizationMethods::box ? dim : 0;
+        Kxx_.resize(gridGeometry->gridView().size(codim));
+        Kyy_.resize(gridGeometry->gridView().size(codim));
 
         //initialize the fluidsystem
         FluidSystem::init(/*startTemp=*/288,
@@ -147,16 +147,6 @@ public:
     const std::string name() const
     { return name_; }
 
-    /*!
-     * \brief Returns the temperature within the domain.
-     *
-     * This problem assumes a temperature of 300 degrees Kelvin.
-     */
-    Scalar temperature() const
-    {
-        return 300; // [K]
-    }
-
     // \}
 
     /*!
diff --git a/exercises/solution/exercise-biomineralization/biominspatialparams.hh b/exercises/solution/exercise-biomineralization/biominspatialparams.hh
index fed4a8d6799fc347e7a8025c2e3b6d7ecb13f8ea..a2eb8e65b582120ae38adb182b6126d9910d07be 100644
--- a/exercises/solution/exercise-biomineralization/biominspatialparams.hh
+++ b/exercises/solution/exercise-biomineralization/biominspatialparams.hh
@@ -24,7 +24,7 @@
 #ifndef DUMUX_BIOMIN_SPATIAL_PARAMETERS_HH
 #define DUMUX_BIOMIN_SPATIAL_PARAMETERS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/linearmaterial.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 #include <dumux/material/fluidmatrixinteractions/porosityprecipitation.hh>
@@ -38,15 +38,15 @@ namespace Dumux {
  * \brief Definition of the spatial parameters for the biomineralisation problem
  * with geostatistically distributed initial permeability.
  */
-template<class FVGridGeometry, class Scalar, int numFluidComps, int numActiveSolidComps>
+template<class GridGeometry, class Scalar, int numFluidComps, int numActiveSolidComps>
 class BioMinSpatialparams
-: public FVSpatialParams<FVGridGeometry, Scalar, BioMinSpatialparams<FVGridGeometry, Scalar, numFluidComps, numActiveSolidComps>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, BioMinSpatialparams<GridGeometry, Scalar, numFluidComps, numActiveSolidComps>>
 {
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
+    using FVElementGeometry = typename GridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, BioMinSpatialparams<FVGridGeometry, Scalar, numFluidComps, numActiveSolidComps>>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, BioMinSpatialparams<GridGeometry, Scalar, numFluidComps, numActiveSolidComps>>;
 
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using CoordScalar = typename GridView::ctype;
     enum { dimWorld=GridView::dimensionworld };
     using Element = typename GridView::template Codim<0>::Entity;
@@ -66,8 +66,8 @@ public:
     *
     * \param gridView The grid view
     */
-    BioMinSpatialparams(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    BioMinSpatialparams(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     , pcKrSwCurve_("SpatialParams")
     , aquitardPcKrSwCurve_("SpatialParams.Aquitard")
     {
@@ -77,7 +77,7 @@ public:
 
         // set main diagonal entries of the permeability tensor to a value
         // setting to one value means: isotropic, homogeneous
-        
+
         //! hard code specific params for aquitard layer
         aquitardPorosity_ = 0.1;
         aquitardPermeability_ = 1e-15;
@@ -119,22 +119,22 @@ public:
      *
      *  \f[referencePorosity = 2 \cdot initialPorosity - evaluatePorosity() \f]
      *
-     * \param fvGridGeometry The fvGridGeometry
+     * \param gridGeometry The gridGeometry
      * \param sol The (initial) solution vector
      */
     template<class SolutionVector>
-    void computeReferencePorosity(const FVGridGeometry& fvGridGeometry,
+    void computeReferencePorosity(const GridGeometry& gridGeometry,
                                   const SolutionVector& sol)
     {
-        referencePorosity_.resize(fvGridGeometry.gridView().size(0));
-        for (const auto& element : elements(fvGridGeometry.gridView()))
+        referencePorosity_.resize(gridGeometry.gridView().size(0));
+        for (const auto& element : elements(gridGeometry.gridView()))
         {
-            auto fvGeometry = localView(fvGridGeometry);
+            auto fvGeometry = localView(gridGeometry);
             fvGeometry.bindElement(element);
 
             const auto eIdx = this->gridGeometry().elementMapper().index(element);
 
-            auto elemSol = elementSolution(element, sol, fvGridGeometry);
+            auto elemSol = elementSolution(element, sol, gridGeometry);
             referencePorosity_[eIdx].resize(fvGeometry.numScv());
             for (const auto& scv : scvs(fvGeometry))
             {
@@ -191,22 +191,22 @@ public:
      *
      *  \f[referencePermeability = initialPermeability^2 / evaluatePermeability() \f]
      *
-     * \param fvGridGeometry The fvGridGeometry
+     * \param gridGeometry The gridGeometry
      * \param sol The (initial) solution vector
      */
     template<class SolutionVector>
-    void computeReferencePermeability(const FVGridGeometry& fvGridGeometry,
+    void computeReferencePermeability(const GridGeometry& gridGeometry,
                                       const SolutionVector& sol)
     {
-        referencePermeability_.resize(fvGridGeometry.gridView().size(0));
-        for (const auto& element : elements(fvGridGeometry.gridView()))
+        referencePermeability_.resize(gridGeometry.gridView().size(0));
+        for (const auto& element : elements(gridGeometry.gridView()))
         {
-            auto fvGeometry = localView(fvGridGeometry);
+            auto fvGeometry = localView(gridGeometry);
             fvGeometry.bindElement(element);
 
             const auto eIdx = this->gridGeometry().elementMapper().index(element);
 
-            auto elemSol = elementSolution(element, sol, fvGridGeometry);
+            auto elemSol = elementSolution(element, sol, gridGeometry);
             referencePermeability_[eIdx].resize(fvGeometry.numScv());
             for (const auto& scv : scvs(fvGeometry))
             {
@@ -249,10 +249,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(pcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(pcKrSwCurve_);
     }
 
     // define which phase is to be considered as the wetting phase
@@ -260,6 +260,15 @@ public:
     int wettingPhaseAtPos(const GlobalPosition& globalPos) const
     { return FluidSystem::liquidPhaseIdx; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 300;
+    }
+
 private:
     static constexpr Scalar eps_ = 1e-6;
 
diff --git a/exercises/solution/exercise-biomineralization/main.cc b/exercises/solution/exercise-biomineralization/main.cc
index 9aa45302983a3f1de066a4905849e666b6df80e6..dcef5a0e28bac57d09204a232ce57d4cf1d10246 100644
--- a/exercises/solution/exercise-biomineralization/main.cc
+++ b/exercises/solution/exercise-biomineralization/main.cc
@@ -83,27 +83,26 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
     problem->applyInitialSolution(x);
     auto xOld = x;
 
     // initialize the spatialParams separately to compute the referencePorosity and referencePermeability
-    problem->spatialParams().computeReferencePorosity(*fvGridGeometry, x);
-    problem->spatialParams().computeReferencePermeability(*fvGridGeometry, x);
+    problem->spatialParams().computeReferencePorosity(*gridGeometry, x);
+    problem->spatialParams().computeReferencePermeability(*gridGeometry, x);
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -130,11 +129,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/solution/exercise-fluidsystem/2p2cproblem.hh b/exercises/solution/exercise-fluidsystem/2p2cproblem.hh
index ec47a18ad8d8313de2edd51604f15c24d6fe87a8..4b552abd068f3b8a81eb9e897d624e9e38a02247 100644
--- a/exercises/solution/exercise-fluidsystem/2p2cproblem.hh
+++ b/exercises/solution/exercise-fluidsystem/2p2cproblem.hh
@@ -55,14 +55,14 @@ class ExerciseFluidsystemProblemTwoPTwoC : public PorousMediumFlowProblem<TypeTa
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
 
 public:
-    ExerciseFluidsystemProblemTwoPTwoC(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    ExerciseFluidsystemProblemTwoPTwoC(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
         , eps_(3e-6)
     {
         // initialize the fluid system
@@ -72,17 +72,6 @@ public:
         depthBOR_ = this->gridGeometry().bBoxMax()[dimWorld-1];
     }
 
-    /*!
-     * \name Problem parameters
-     */
-    // \{
-
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    { return 283.15; }
-
      /*!
      * \name Boundary conditions
      */
diff --git a/exercises/solution/exercise-fluidsystem/2p2cproperties.hh b/exercises/solution/exercise-fluidsystem/2p2cproperties.hh
index e39bf9b30a25bb54553a1613afe71a64ae404221..18e45d9cb50c27f86a66a3cdf805f858d7ef1d00 100644
--- a/exercises/solution/exercise-fluidsystem/2p2cproperties.hh
+++ b/exercises/solution/exercise-fluidsystem/2p2cproperties.hh
@@ -59,10 +59,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoPTwoC>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+    using type = ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set grid and the grid creator to be used
diff --git a/exercises/solution/exercise-fluidsystem/2pproblem.hh b/exercises/solution/exercise-fluidsystem/2pproblem.hh
index 5afaf6f22b0de5ea3196b0fac648a0ffa0c1f5e8..3242e7b203f51d247f151ea77971f7fe42c760a0 100644
--- a/exercises/solution/exercise-fluidsystem/2pproblem.hh
+++ b/exercises/solution/exercise-fluidsystem/2pproblem.hh
@@ -61,7 +61,7 @@ class ExerciseFluidsystemProblemTwoP : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using FluidState = GetPropType<TypeTag, Properties::FluidState>;
@@ -75,8 +75,8 @@ class ExerciseFluidsystemProblemTwoP : public PorousMediumFlowProblem<TypeTag>
     };
 
 public:
-    ExerciseFluidsystemProblemTwoP(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    ExerciseFluidsystemProblemTwoP(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     , eps_(3e-6)
     {
         // initialize the tables for the water properties
@@ -96,17 +96,6 @@ public:
             plotDensity_();
     }
 
-    /*!
-     * \name Problem parameters
-     */
-    // \{
-
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    { return 283.15; }
-
      /*!
      * \name Boundary conditions
      */
@@ -223,7 +212,7 @@ private:
     void plotDensity_()
     {
         FluidState fluidState;
-        fluidState.setTemperature(temperature());
+        fluidState.setTemperature(283.15);
         int numberOfPoints = 100;
         Scalar xMin = 1e4;
         Scalar xMax = 1e7;
diff --git a/exercises/solution/exercise-fluidsystem/2pproperties.hh b/exercises/solution/exercise-fluidsystem/2pproperties.hh
index 66aaf11b80fdad067c0941de090360a0ba97c0aa..026263009593554b9ca2b7346cc54596f3ab9f7b 100644
--- a/exercises/solution/exercise-fluidsystem/2pproperties.hh
+++ b/exercises/solution/exercise-fluidsystem/2pproperties.hh
@@ -66,10 +66,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoP>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+    using type = ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set grid to be used
diff --git a/exercises/solution/exercise-fluidsystem/main.cc b/exercises/solution/exercise-fluidsystem/main.cc
index 60058a58bfd2986cf8298089a433249d6276499c..4fc271921ad20a5c5fd54f02d8007db3241adf68 100644
--- a/exercises/solution/exercise-fluidsystem/main.cc
+++ b/exercises/solution/exercise-fluidsystem/main.cc
@@ -88,23 +88,22 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
     problem->applyInitialSolution(x);
     auto xOld = x;
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -125,11 +124,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric, /*implicit?*/true>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
      // the non-linear solver
     using NewtonSolver = NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/solution/exercise-fluidsystem/spatialparams.hh b/exercises/solution/exercise-fluidsystem/spatialparams.hh
index 48f87a507e6392e3eae62c5d4e91768d75aac65c..5949547bd23578e79b9ddd80af1e60a8e5d6f160 100644
--- a/exercises/solution/exercise-fluidsystem/spatialparams.hh
+++ b/exercises/solution/exercise-fluidsystem/spatialparams.hh
@@ -26,7 +26,7 @@
 #define DUMUX_EXERCISE_FLUIDSYSTEM_SPATIAL_PARAMS_HH
 
 // include parent spatialparameters
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 
 //inlclude fluid matrix interaction relationship
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
@@ -40,13 +40,13 @@ namespace Dumux {
  * \brief The spatial parameters for the exercise-fluidsystem problem
  *        which uses the two-phase and two-phase two-component box model.
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class ExerciseFluidsystemSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>>
 {
-    using ThisType = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
-    using GridView = typename FVGridGeometry::GridView;
+    using ThisType = ExerciseFluidsystemSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
+    using GridView = typename GridGeometry::GridView;
 
     static constexpr int dim = GridView::dimension;
     static constexpr int dimWorld = GridView::dimensionworld;
@@ -62,10 +62,10 @@ public:
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
-    ExerciseFluidsystemSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    ExerciseFluidsystemSpatialParams(std::shared_ptr<const GridGeometry>& gridGeometry)
+    : ParentType(gridGeometry)
     , K_(0)
     , KLens_(0)
     , pcKrSwCurve_("SpatialParams")
@@ -110,10 +110,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInLens(globalPos))
-            return makeFluidMatrixInteraction(pcKrSwCurve_); 
-        return makeFluidMatrixInteraction(lensPcKrSwCurve_); 
+            return makeFluidMatrixInteraction(pcKrSwCurve_);
+        return makeFluidMatrixInteraction(lensPcKrSwCurve_);
     }
 
     /*!
@@ -147,6 +147,15 @@ public:
                (x < 50 + eps_ && x > 30 - eps_ && y < 30 + eps_ && y > 15 - eps_);
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
 private:
     static constexpr Scalar eps_ = 1e-6;
 
diff --git a/exercises/solution/exercise-fractures/fractureproblem.hh b/exercises/solution/exercise-fractures/fractureproblem.hh
index 4422aa689026805819710b9de05268bbd8a0a128..ba3dbd70d70ffab0059307f3f0f8998d854a4a64 100644
--- a/exercises/solution/exercise-fractures/fractureproblem.hh
+++ b/exercises/solution/exercise-fractures/fractureproblem.hh
@@ -53,10 +53,10 @@ class FractureSubProblem : public PorousMediumFlowProblem<TypeTag>
     using ElementVolumeVariables = typename GridVariables::GridVolumeVariables::LocalView;
     using Scalar = typename GridVariables::Scalar;
 
-    using FVGridGeometry = typename GridVariables::GridGeometry;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
-    using SubControlVolume = typename FVGridGeometry::SubControlVolume;
-    using GridView = typename FVGridGeometry::GridView;
+    using GridGeometry = typename GridVariables::GridGeometry;
+    using FVElementGeometry = typename GridGeometry::LocalView;
+    using SubControlVolume = typename GridGeometry::SubControlVolume;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
@@ -70,10 +70,10 @@ class FractureSubProblem : public PorousMediumFlowProblem<TypeTag>
 
 public:
     //! The constructor
-    FractureSubProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    FractureSubProblem(std::shared_ptr<const GridGeometry> gridGeometry,
                        std::shared_ptr<typename ParentType::SpatialParams> spatialParams,
                        const std::string& paramGroup)
-    : ParentType(fvGridGeometry, spatialParams, paramGroup)
+    : ParentType(gridGeometry, spatialParams, paramGroup)
     , aperture_(getParamFromGroup<Scalar>(paramGroup, "SpatialParams.Aperture"))
     , isExercisePartA_(getParamFromGroup<bool>(paramGroup, "Problem.IsExercisePartA"))
     , isExercisePartB_(getParamFromGroup<bool>(paramGroup, "Problem.IsExercisePartB"))
@@ -119,15 +119,6 @@ public:
         return source;
     }
 
-    //! Set the aperture as extrusion factor.
-    Scalar extrusionFactorAtPos(const GlobalPosition& globalPos) const
-    {
-        // We treat the fractures as lower-dimensional in the grid,
-        // but we have to give it the aperture as extrusion factor
-        // such that the dimensions are correct in the end.
-        return aperture_;
-    }
-
     //! evaluates the Dirichlet boundary condition for a given position
     PrimaryVariables dirichletAtPos(const GlobalPosition& globalPos) const
     { return initialAtPos(globalPos); }
@@ -148,10 +139,6 @@ public:
         return values;
     }
 
-    //! returns the temperature in \f$\mathrm{[K]}\f$ in the domain
-    Scalar temperature() const
-    { return 283.15; /*10°*/ }
-
     //! sets the pointer to the coupling manager.
     void setCouplingManager(std::shared_ptr<CouplingManager> cm)
     { couplingManagerPtr_ = cm; }
diff --git a/exercises/solution/exercise-fractures/fracturespatialparams.hh b/exercises/solution/exercise-fractures/fracturespatialparams.hh
index 713c16823bdbe42a09bf5ff6dfc6424fd1efb356..93c87d3edd21dd6e8797363d7cbe6f293194ee87 100644
--- a/exercises/solution/exercise-fractures/fracturespatialparams.hh
+++ b/exercises/solution/exercise-fractures/fracturespatialparams.hh
@@ -29,7 +29,7 @@
 
 #include <dumux/io/grid/griddata.hh>
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/vangenuchten.hh>
 
 namespace Dumux {
@@ -40,15 +40,15 @@ namespace Dumux {
  * \ingroup TwoPTests
  * \brief The spatial params the two-phase facet coupling test
  */
-template< class FVGridGeometry, class Scalar >
+template< class GridGeometry, class Scalar >
 class FractureSpatialParams
-: public FVSpatialParams< FVGridGeometry, Scalar, FractureSpatialParams<FVGridGeometry, Scalar> >
+: public FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, FractureSpatialParams<GridGeometry, Scalar> >
 {
-    using ThisType = FractureSpatialParams< FVGridGeometry, Scalar >;
-    using ParentType = FVSpatialParams< FVGridGeometry, Scalar, ThisType >;
+    using ThisType = FractureSpatialParams< GridGeometry, Scalar >;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, ThisType >;
 
-    using SubControlVolume = typename FVGridGeometry::SubControlVolume;
-    using GridView = typename FVGridGeometry::GridView;
+    using SubControlVolume = typename GridGeometry::SubControlVolume;
+    using GridView = typename GridGeometry::GridView;
     using Grid = typename GridView::Grid;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
@@ -65,10 +65,10 @@ public:
     using PermeabilityType = Scalar;
 
     //! the constructor
-    FractureSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    FractureSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry,
                           std::shared_ptr<const Dumux::GridData<Grid>> gridData,
                           const std::string& paramGroup)
-    : ParentType(fvGridGeometry)
+    : ParentType(gridGeometry)
     , gridDataPtr_(gridData)
     , isExercisePartA_(getParamFromGroup<bool>(paramGroup, "Problem.IsExercisePartA"))
     , isExercisePartB_(getParamFromGroup<bool>(paramGroup, "Problem.IsExercisePartB"))
@@ -80,6 +80,7 @@ public:
         porosityBarrier_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.PorosityBarrier");
         permeability_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.Permeability");
         permeabilityBarrier_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.PermeabilityBarrier");
+        aperture_ = getParamFromGroup<Scalar>(paramGroup, "SpatialParams.Aperture");
     }
 
     //! Function for defining the (intrinsic) permeability \f$[m^2]\f$.
@@ -169,6 +170,24 @@ public:
         return FluidSystem::phase0Idx;
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
+    //! Set the aperture as extrusion factor.
+    Scalar extrusionFactorAtPos(const GlobalPosition& globalPos) const
+    {
+        // We treat the fractures as lower-dimensional in the grid,
+        // but we have to give it the aperture as extrusion factor
+        // such that the dimensions are correct in the end.
+        return aperture_;
+    }
+
     //! returns the domain marker for an element
     int getElementDomainMarker(const Element& element) const
     { return gridDataPtr_->getElementDomainMarker(element); }
@@ -186,6 +205,7 @@ private:
 
     Scalar porosity_;
     Scalar porosityBarrier_;
+    Scalar aperture_;
     PermeabilityType permeability_;
     PermeabilityType permeabilityBarrier_;
 };
diff --git a/exercises/solution/exercise-fractures/main.cc b/exercises/solution/exercise-fractures/main.cc
index f3d7e80aaca029edffc919dbd8f2ff723518688b..c3e74540fe2127b9f71159ad2dd92bc082f79109 100644
--- a/exercises/solution/exercise-fractures/main.cc
+++ b/exercises/solution/exercise-fractures/main.cc
@@ -50,10 +50,10 @@
 // reuse them again in the main function with only one single definition of them here
 using MatrixTypeTag = Dumux::Properties::TTag::MatrixProblem;
 using FractureTypeTag = Dumux::Properties::TTag::FractureProblem;
-using MatrixFVGridGeometry = Dumux::GetPropType<MatrixTypeTag, Dumux::Properties::GridGeometry>;
-using FractureFVGridGeometry = Dumux::GetPropType<FractureTypeTag, Dumux::Properties::GridGeometry>;
+using MatrixGridGeometry = Dumux::GetPropType<MatrixTypeTag, Dumux::Properties::GridGeometry>;
+using FractureGridGeometry = Dumux::GetPropType<FractureTypeTag, Dumux::Properties::GridGeometry>;
 using TheMultiDomainTraits = Dumux::MultiDomainTraits<MatrixTypeTag, FractureTypeTag>;
-using TheCouplingMapper = Dumux::FacetCouplingMapper<MatrixFVGridGeometry, FractureFVGridGeometry>;
+using TheCouplingMapper = Dumux::FacetCouplingMapper<MatrixGridGeometry, FractureGridGeometry>;
 using TheCouplingManager = Dumux::FacetCouplingManager<TheMultiDomainTraits, TheCouplingMapper>;
 
 // set the coupling manager property in the sub-problems
@@ -111,10 +111,8 @@ int main(int argc, char** argv)
     const auto& fractureGridView = gridManager.template grid<fractureGridId>().leafGridView();
 
     // create the finite volume grid geometries
-    auto matrixFvGridGeometry = std::make_shared<MatrixFVGridGeometry>(matrixGridView);
-    auto fractureFvGridGeometry = std::make_shared<FractureFVGridGeometry>(fractureGridView);
-    matrixFvGridGeometry->update();
-    fractureFvGridGeometry->update();
+    auto matrixFvGridGeometry = std::make_shared<MatrixGridGeometry>(matrixGridView);
+    auto fractureFvGridGeometry = std::make_shared<FractureGridGeometry>(fractureGridView);
 
     // the problems (boundary/initial conditions etc)
     using MatrixProblem = GetPropType<MatrixTypeTag, Properties::Problem>;
diff --git a/exercises/solution/exercise-fractures/matrixproblem.hh b/exercises/solution/exercise-fractures/matrixproblem.hh
index 58f8e6f8a706dfaa3f0666ffb3042074db953d19..a4c5eda86612bbf5e8da255079bd37e0b246fb30 100644
--- a/exercises/solution/exercise-fractures/matrixproblem.hh
+++ b/exercises/solution/exercise-fractures/matrixproblem.hh
@@ -56,11 +56,11 @@ class MatrixSubProblem : public PorousMediumFlowProblem<TypeTag>
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
     using Scalar = typename GridVariables::Scalar;
 
-    using FVGridGeometry = typename GridVariables::GridGeometry;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
-    using SubControlVolume = typename FVGridGeometry::SubControlVolume;
-    using SubControlVolumeFace = typename FVGridGeometry::SubControlVolumeFace;
-    using GridView = typename FVGridGeometry::GridView;
+    using GridGeometry = typename GridVariables::GridGeometry;
+    using FVElementGeometry = typename GridGeometry::LocalView;
+    using SubControlVolume = typename GridGeometry::SubControlVolume;
+    using SubControlVolumeFace = typename GridGeometry::SubControlVolumeFace;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
@@ -74,10 +74,10 @@ class MatrixSubProblem : public PorousMediumFlowProblem<TypeTag>
 
 public:
     //! The constructor
-    MatrixSubProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    MatrixSubProblem(std::shared_ptr<const GridGeometry> gridGeometry,
                      std::shared_ptr<typename ParentType::SpatialParams> spatialParams,
                      const std::string& paramGroup = "")
-    : ParentType(fvGridGeometry, spatialParams, paramGroup)
+    : ParentType(gridGeometry, spatialParams, paramGroup)
     , boundaryOverPressure_(getParamFromGroup<Scalar>(paramGroup, "Problem.BoundaryOverPressure"))
     , boundarySaturation_(getParamFromGroup<Scalar>(paramGroup, "Problem.BoundarySaturation"))
     , isExercisePartA_(getParamFromGroup<bool>(paramGroup, "Problem.IsExercisePartA"))
@@ -209,10 +209,6 @@ public:
         return values;
     }
 
-    //! returns the temperature in \f$\mathrm{[K]}\f$ in the domain
-    Scalar temperature() const
-    { return 283.15; /*10°*/ }
-
     //! sets the pointer to the coupling manager.
     void setCouplingManager(std::shared_ptr<CouplingManager> cm)
     { couplingManagerPtr_ = cm; }
diff --git a/exercises/solution/exercise-fractures/matrixspatialparams.hh b/exercises/solution/exercise-fractures/matrixspatialparams.hh
index 1f049007743f4a83543c35ce9e405e421c5ce0ed..49a689ee3eb8e0084562ea914b89ce0d48a39c70 100644
--- a/exercises/solution/exercise-fractures/matrixspatialparams.hh
+++ b/exercises/solution/exercise-fractures/matrixspatialparams.hh
@@ -29,7 +29,7 @@
 
 #include <dumux/io/grid/griddata.hh>
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/vangenuchten.hh>
 
 namespace Dumux {
@@ -40,14 +40,14 @@ namespace Dumux {
  * \ingroup TwoPTests
  * \brief The spatial params the two-phase facet coupling test
  */
-template< class FVGridGeometry, class Scalar >
+template< class GridGeometry, class Scalar >
 class MatrixSpatialParams
-: public FVSpatialParams< FVGridGeometry, Scalar, MatrixSpatialParams<FVGridGeometry, Scalar> >
+: public FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, MatrixSpatialParams<GridGeometry, Scalar> >
 {
-    using ThisType = MatrixSpatialParams< FVGridGeometry, Scalar >;
-    using ParentType = FVSpatialParams< FVGridGeometry, Scalar, ThisType >;
+    using ThisType = MatrixSpatialParams< GridGeometry, Scalar >;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP< GridGeometry, Scalar, ThisType >;
 
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using Grid = typename GridView::Grid;
     using Element = typename GridView::template Codim<0>::Entity;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
@@ -60,10 +60,10 @@ public:
     using PermeabilityType = Scalar;
 
     //! the constructor
-    MatrixSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry,
+    MatrixSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry,
                         std::shared_ptr<const Dumux::GridData<Grid>> gridData,
                         const std::string& paramGroup)
-    : ParentType(fvGridGeometry)
+    : ParentType(gridGeometry)
     , gridDataPtr_(gridData)
     , pcKrSwCurve_("Matrix.SpatialParams")
     {
@@ -84,8 +84,8 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
-        return makeFluidMatrixInteraction(pcKrSwCurve_); 
+    {
+        return makeFluidMatrixInteraction(pcKrSwCurve_);
     }
 
     //! Water is the wetting phase
@@ -97,6 +97,15 @@ public:
         return FluidSystem::phase0Idx;
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
     //! returns the domain marker for an element
     int getElementDomainMarker(const Element& element) const
     { return gridDataPtr_->getElementDomainMarker(element); }
diff --git a/exercises/solution/exercise-grids/main.cc b/exercises/solution/exercise-grids/main.cc
index 916d1e79b6b92ea7795c261774e410736a118bfe..9d3e4d29bce3bcb3ef5690256ca47203e4667fd4 100644
--- a/exercises/solution/exercise-grids/main.cc
+++ b/exercises/solution/exercise-grids/main.cc
@@ -82,13 +82,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -98,7 +97,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -123,11 +122,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/solution/exercise-grids/problem.hh b/exercises/solution/exercise-grids/problem.hh
index 368d246f0dd51addcf1082e61017dcbc96e289e3..168ddc8ab0959959c1229e5800bba95f2b7d08c6 100644
--- a/exercises/solution/exercise-grids/problem.hh
+++ b/exercises/solution/exercise-grids/problem.hh
@@ -62,7 +62,7 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -72,8 +72,8 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    InjectionProblem2P(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionProblem2P(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
@@ -106,14 +106,6 @@ public:
     std::string name() const
     { return name_+"-2p"; }
 
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    {
-        return 273.15 + 30; // [K]
-    }
-
     // \}
 
     /*!
@@ -195,7 +187,7 @@ public:
         PrimaryVariables values(0.0);
 
         // get the water density at atmospheric conditions
-        const Scalar densityW = FluidSystem::H2O::liquidDensity(temperature(), 1.0e5);
+        const Scalar densityW = FluidSystem::H2O::liquidDensity(this->spatialParams().temperatureAtPos(globalPos), 1.0e5);
 
         // assume an intially hydrostatic liquid pressure profile
         // note: we subtract rho_w*g*h because g is defined negative
diff --git a/exercises/solution/exercise-grids/properties.hh b/exercises/solution/exercise-grids/properties.hh
index 17872d5ca6752d8b4ff83a5092d2c1581e8845af..dc883b1763fcf0a9517d78879438acc4df64c106 100644
--- a/exercises/solution/exercise-grids/properties.hh
+++ b/exercises/solution/exercise-grids/properties.hh
@@ -67,10 +67,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2p>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/solution/exercise-grids/spatialparams.hh b/exercises/solution/exercise-grids/spatialparams.hh
index 433e3f6baa61ff2763c6ba31f543b72fd11f5136..0160b1a628d53c4a2deb28ea993229289f8b4cd8 100644
--- a/exercises/solution/exercise-grids/spatialparams.hh
+++ b/exercises/solution/exercise-grids/spatialparams.hh
@@ -27,7 +27,7 @@
 #ifndef DUMUX_EXGRIDS_INJECTION_SPATIAL_PARAMS_HH
 #define DUMUX_EXGRIDS_INJECTION_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 
 #include <dumux/io/gnuplotinterface.hh>
@@ -41,13 +41,13 @@ namespace Dumux {
  *        which uses the isothermal two-phase two-component
  *        fully implicit model.
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class InjectionSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, InjectionSpatialParams<GridGeometry, Scalar>>
 {
-    using ThisType = InjectionSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
-    using GridView = typename FVGridGeometry::GridView;
+    using ThisType = InjectionSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
+    using GridView = typename GridGeometry::GridView;
 
     // get the dimensions of the simulation domain from GridView
     static const int dimWorld = GridView::dimensionworld;
@@ -63,10 +63,10 @@ public:
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
-    InjectionSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionSpatialParams(std::shared_ptr<const GridGeometry>& gridGeometry)
+    : ParentType(gridGeometry)
     , aquitardPcKrSwCurve_("SpatialParams.Aquitard")
     , aquiferPcKrSwCurve_("SpatialParams.Aquifer")
     {
@@ -113,10 +113,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_);
     }
 
     /*!
@@ -129,6 +129,15 @@ public:
     int wettingPhaseAtPos(const GlobalPosition& globalPos) const
     { return FluidSystem::H2OIdx; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 273.15 + 30;
+    }
+
 private:
 
     static constexpr Scalar eps_ = 1e-6;
diff --git a/exercises/solution/exercise-mainfile/1pproblem.hh b/exercises/solution/exercise-mainfile/1pproblem.hh
index f5a5bdbb5685766eafd01bae421f26f6931a117b..4532e978a9bfe9ac4889d48176f892e1f7a85f11 100644
--- a/exercises/solution/exercise-mainfile/1pproblem.hh
+++ b/exercises/solution/exercise-mainfile/1pproblem.hh
@@ -45,15 +45,15 @@ class OnePTestProblem : public PorousMediumFlowProblem<TypeTag>
     using Element = typename GridView::template Codim<0>::Entity;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
     static constexpr int dimWorld = GridView::dimensionworld;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
 
 public:
-    OnePTestProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    OnePTestProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         FluidSystem::Component::init(/*tempMin=*/272.15,
                                      /*tempMax=*/294.15,
@@ -104,18 +104,6 @@ public:
     {
         return PrimaryVariables(1.0e5);
     }
-
-    /*!
-     * \brief Returns the temperature \f$\mathrm{[K]}\f$ for an isothermal problem.
-     *
-     * This is not specific to the discretization. By default it just
-     * throws an exception so it must be overloaded by the problem if
-     * no energy equation is used.
-     */
-    Scalar temperature() const
-    {
-        return 283.15; // 10°C
-    }
 };
 
 } // end namespace Dumux
diff --git a/exercises/solution/exercise-mainfile/1pspatialparams.hh b/exercises/solution/exercise-mainfile/1pspatialparams.hh
index a7df1fd516c48b61e2c8c3a6c57325e0be49a3b6..09d19d2a050df89e5d7f33b96572cde697a3d626 100644
--- a/exercises/solution/exercise-mainfile/1pspatialparams.hh
+++ b/exercises/solution/exercise-mainfile/1pspatialparams.hh
@@ -24,7 +24,7 @@
 #ifndef DUMUX_EX_MAINFILE_ONEP_TEST_SPATIAL_PARAMS_HH
 #define DUMUX_EX_MAINFILE_ONEP_TEST_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv1p.hh>
+#include <dumux/porousmediumflow/fvspatialparams1p.hh>
 
 namespace Dumux {
 
@@ -33,23 +33,23 @@ namespace Dumux {
  * \brief The spatial parameters class for the test problem using the
  *        compressible 1p model
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class OnePTestSpatialParams
-: public FVSpatialParamsOneP<FVGridGeometry, Scalar, OnePTestSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsOneP<GridGeometry, Scalar, OnePTestSpatialParams<GridGeometry, Scalar>>
 {
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
+    using FVElementGeometry = typename GridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
-    using ParentType = FVSpatialParamsOneP<FVGridGeometry, Scalar, OnePTestSpatialParams<FVGridGeometry, Scalar>>;
+    using ParentType = FVPorousMediumFlowSpatialParamsOneP<GridGeometry, Scalar, OnePTestSpatialParams<GridGeometry, Scalar>>;
 
     static constexpr int dimWorld = GridView::dimensionworld;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
     using PermeabilityType = Scalar;
-    OnePTestSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    OnePTestSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         permeability_ = getParam<Scalar>("SpatialParams.Permeability");
         permeabilityLens_ = getParam<Scalar>("SpatialParams.PermeabilityLens");
@@ -85,6 +85,15 @@ public:
     Scalar porosityAtPos(const GlobalPosition& globalPos) const
     { return 0.4; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 283.15;
+    }
+
 private:
     bool isInLens_(const GlobalPosition &globalPos) const
     {
diff --git a/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc b/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc
index fb8cb7280f7dbd82d4ade2d9e5d1ca893ed6c9e4..f320ccba3a38a8e4598aa2a9cc646f9204d8162e 100644
--- a/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc
+++ b/exercises/solution/exercise-mainfile/exercise1pa_solution_main.cc
@@ -83,21 +83,20 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
-    SolutionVector x(fvGridGeometry->numDofs());
+    SolutionVector x(gridGeometry->numDofs());
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // intialize the vtk output module
@@ -115,7 +114,7 @@ int main(int argc, char** argv)
 
     // the assembler for stationary problems
     using Assembler = FVAssembler<TypeTag, DiffMethod::analytic>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables);
 
     // the linear solver
     using LinearSolver = ILU0BiCGSTABBackend;
diff --git a/exercises/solution/exercise-properties/main.cc b/exercises/solution/exercise-properties/main.cc
index b5616e68b53b26743fe8419c69cd6187a2bdbe6d..ef218fe5cd826a96317404f07e6e372f8824afd3 100644
--- a/exercises/solution/exercise-properties/main.cc
+++ b/exercises/solution/exercise-properties/main.cc
@@ -113,13 +113,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -129,7 +128,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -152,11 +151,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/solution/exercise-properties/problem.hh b/exercises/solution/exercise-properties/problem.hh
index 62ba692af99d059e03953020eee946ba5da919ae..c00acd02b47ed1ed4038db7b3933e1c74f60411d 100644
--- a/exercises/solution/exercise-properties/problem.hh
+++ b/exercises/solution/exercise-properties/problem.hh
@@ -44,7 +44,7 @@ class TwoPTestProblem : public PorousMediumFlowProblem<TypeTag>
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -58,8 +58,8 @@ class TwoPTestProblem : public PorousMediumFlowProblem<TypeTag>
     };
 
 public:
-    TwoPTestProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry) {}
+    TwoPTestProblem(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry) {}
 
     /*!
      * \brief Specifies which kind of boundary condition should be
@@ -90,7 +90,7 @@ public:
     {
         PrimaryVariables values;
         GetPropType<TypeTag, Properties::FluidState> fluidState;
-        fluidState.setTemperature(temperature());
+        fluidState.setTemperature(this->spatialParams().temperatureAtPos(globalPos));
         fluidState.setPressure(waterPhaseIdx, /*pressure=*/1e5);
         fluidState.setPressure(dnaplPhaseIdx, /*pressure=*/1e5);
 
@@ -126,7 +126,7 @@ public:
         if (onInlet_(globalPos))
         {
             using TCE = Components::Trichloroethene<Scalar>;
-            values[contiDNAPLEqIdx] = -0.04/TCE::liquidDensity(temperature(), /*pressure=*/1e5);// m/s
+            values[contiDNAPLEqIdx] = -0.04/TCE::liquidDensity(this->spatialParams().temperatureAtPos(globalPos), /*pressure=*/1e5);// m/s
         }
 
         return values;
@@ -143,7 +143,7 @@ public:
     {
         PrimaryVariables values;
         GetPropType<TypeTag, Properties::FluidState> fluidState;
-        fluidState.setTemperature(temperature());
+        fluidState.setTemperature(this->spatialParams().temperatureAtPos(globalPos));
         fluidState.setPressure(waterPhaseIdx, /*pressure=*/1e5);
         fluidState.setPressure(dnaplPhaseIdx, /*pressure=*/1e5);
 
@@ -157,18 +157,6 @@ public:
         return values;
     }
 
-    /*!
-     * \brief Returns the temperature \f$\mathrm{[K]}\f$ for an isothermal problem.
-     *
-     * This is not specific to the discretization. By default it just
-     * throws an exception so it must be overloaded by the problem if
-     * no energy equation is used.
-     */
-    Scalar temperature() const
-    {
-        return 293.15; // 10°C
-    }
-
 private:
     bool onLeftBoundary_(const GlobalPosition &globalPos) const
     {
diff --git a/exercises/solution/exercise-properties/properties.hh b/exercises/solution/exercise-properties/properties.hh
index eed1a9fbbef038506a50db7ead16eb03a7a6e987..f4ea3272001f183ad65c65de675fd5caf3ee69db 100644
--- a/exercises/solution/exercise-properties/properties.hh
+++ b/exercises/solution/exercise-properties/properties.hh
@@ -75,10 +75,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::TwoPIncompressible>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = TwoPTestSpatialParams<FVGridGeometry, Scalar>;
+    using type = TwoPTestSpatialParams<GridGeometry, Scalar>;
 };
 
 } // end namespace Dumux::Properties
diff --git a/exercises/solution/exercise-properties/spatialparams.hh b/exercises/solution/exercise-properties/spatialparams.hh
index 90af3c6f2efe86b6ff26b548a11f6922f7f27db5..045c4f9824f741da18b5c24713ab6f3640472c31 100644
--- a/exercises/solution/exercise-properties/spatialparams.hh
+++ b/exercises/solution/exercise-properties/spatialparams.hh
@@ -23,7 +23,7 @@
 #ifndef DUMUX_INCOMPRESSIBLE_TWOP_TEST_SPATIAL_PARAMS_HH
 #define DUMUX_INCOMPRESSIBLE_TWOP_TEST_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/vangenuchten.hh>
 
 namespace Dumux {
@@ -32,16 +32,16 @@ namespace Dumux {
  * \ingroup TwoPTests
  * \brief The spatial params for the incompressible 2p test
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class TwoPTestSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, TwoPTestSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, TwoPTestSpatialParams<GridGeometry, Scalar>>
 {
-    using GridView = typename FVGridGeometry::GridView;
+    using GridView = typename GridGeometry::GridView;
     using Element = typename GridView::template Codim<0>::Entity;
-    using FVElementGeometry = typename FVGridGeometry::LocalView;
+    using FVElementGeometry = typename GridGeometry::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
-    using ThisType = TwoPTestSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
+    using ThisType = TwoPTestSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
 
     static constexpr int dimWorld = GridView::dimensionworld;
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
@@ -51,8 +51,8 @@ class TwoPTestSpatialParams
 public:
     using PermeabilityType = Scalar;
 
-    TwoPTestSpatialParams(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    TwoPTestSpatialParams(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     , lensPcKrSwCurve_("SpatialParams.Lens")
     , outerPcKrSwCurve_("SpatialParams.OuterDomain")
     {
@@ -114,6 +114,15 @@ public:
         return FluidSystem::phase0Idx;
     }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 293.15;
+    }
+
 private:
     bool isInLens_(const GlobalPosition &globalPos) const
     {
diff --git a/exercises/solution/exercise-runtimeparams/main.cc b/exercises/solution/exercise-runtimeparams/main.cc
index c16c2bd6409b531ac91d766400795730808933fb..b80387709c3d76673cacd4eecf4f40c0397c65c2 100644
--- a/exercises/solution/exercise-runtimeparams/main.cc
+++ b/exercises/solution/exercise-runtimeparams/main.cc
@@ -82,13 +82,12 @@ int main(int argc, char** argv)
     const auto& leafGridView = gridManager.grid().leafGridView();
 
     // create the finite volume grid geometry
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
-    auto fvGridGeometry = std::make_shared<FVGridGeometry>(leafGridView);
-    fvGridGeometry->update();
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    auto gridGeometry = std::make_shared<GridGeometry>(leafGridView);
 
     // the problem (initial and boundary conditions)
     using Problem = GetPropType<TypeTag, Properties::Problem>;
-    auto problem = std::make_shared<Problem>(fvGridGeometry);
+    auto problem = std::make_shared<Problem>(gridGeometry);
 
     // the solution vector
     using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>;
@@ -98,7 +97,7 @@ int main(int argc, char** argv)
 
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
-    auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
+    auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry);
     gridVariables->init(x);
 
     // get some time loop parameters
@@ -123,11 +122,11 @@ int main(int argc, char** argv)
 
     // the assembler with time loop for instationary problem
     using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>;
-    auto assembler = std::make_shared<Assembler>(problem, fvGridGeometry, gridVariables, timeLoop, xOld);
+    auto assembler = std::make_shared<Assembler>(problem, gridGeometry, gridVariables, timeLoop, xOld);
 
     // the linear solver
-    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<FVGridGeometry>>;
-    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, fvGridGeometry->dofMapper());
+    using LinearSolver = AMGBiCGSTABBackend<LinearSolverTraits<GridGeometry>>;
+    auto linearSolver = std::make_shared<LinearSolver>(leafGridView, gridGeometry->dofMapper());
 
     // the non-linear solver
     using NewtonSolver = Dumux::NewtonSolver<Assembler, LinearSolver>;
diff --git a/exercises/solution/exercise-runtimeparams/problem.hh b/exercises/solution/exercise-runtimeparams/problem.hh
index 78fae4c3b29189ca895a02a4418c024b31747404..f5454f6443627615645054679d728dab57fc6142 100644
--- a/exercises/solution/exercise-runtimeparams/problem.hh
+++ b/exercises/solution/exercise-runtimeparams/problem.hh
@@ -62,7 +62,7 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
     using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
     using BoundaryTypes = Dumux::BoundaryTypes<GetPropType<TypeTag, Properties::ModelTraits>::numEq()>;
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using FVElementGeometry = typename GetPropType<TypeTag, Properties::GridGeometry>::LocalView;
     using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
     using NumEqVector = Dumux::NumEqVector<PrimaryVariables>;
@@ -72,8 +72,8 @@ class InjectionProblem2P : public PorousMediumFlowProblem<TypeTag>
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
 public:
-    InjectionProblem2P(std::shared_ptr<const FVGridGeometry> fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionProblem2P(std::shared_ptr<const GridGeometry> gridGeometry)
+    : ParentType(gridGeometry)
     {
         // initialize the tables of the fluid system
         FluidSystem::init(/*tempMin=*/273.15,
@@ -115,14 +115,6 @@ public:
     std::string name() const
     { return name_+"-2p"; }
 
-    /*!
-     * \brief Returns the temperature \f$ K \f$
-     */
-    Scalar temperature() const
-    {
-        return 273.15 + 30; // [K]
-    }
-
     // \}
 
     /*!
@@ -204,7 +196,7 @@ public:
         PrimaryVariables values(0.0);
 
         // get the water density at atmospheric conditions
-        const Scalar densityW = FluidSystem::H2O::liquidDensity(temperature(), 1.0e5);
+        const Scalar densityW = FluidSystem::H2O::liquidDensity(this->spatialParams().temperatureAtPos(globalPos), 1.0e5);
 
         // assume an intially hydrostatic liquid pressure profile
         // note: we subtract rho_w*g*h because g is defined negative
diff --git a/exercises/solution/exercise-runtimeparams/properties.hh b/exercises/solution/exercise-runtimeparams/properties.hh
index 4c4524d85263c23fac311051e9ddd0ecac2e1e13..3f7a2ae43f565bc223d6dff83ef60e4499249496 100644
--- a/exercises/solution/exercise-runtimeparams/properties.hh
+++ b/exercises/solution/exercise-runtimeparams/properties.hh
@@ -56,10 +56,10 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::Injection2p>
 {
 private:
-    using FVGridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
+    using GridGeometry = GetPropType<TypeTag, Properties::GridGeometry>;
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 public:
-    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+    using type = InjectionSpatialParams<GridGeometry, Scalar>;
 };
 
 // Set fluid configuration
diff --git a/exercises/solution/exercise-runtimeparams/spatialparams.hh b/exercises/solution/exercise-runtimeparams/spatialparams.hh
index 869a826bdfb4678509884ea269ce63df4d411431..ab72c284ec40ba0d924625c23a6707cb96a70f69 100644
--- a/exercises/solution/exercise-runtimeparams/spatialparams.hh
+++ b/exercises/solution/exercise-runtimeparams/spatialparams.hh
@@ -27,7 +27,7 @@
 #ifndef DUMUX_RUNTIMEPARAMS_INJECTION_SPATIAL_PARAMS_HH
 #define DUMUX_RUNTIMEPARAMS_INJECTION_SPATIAL_PARAMS_HH
 
-#include <dumux/material/spatialparams/fv.hh>
+#include <dumux/porousmediumflow/fvspatialparamsmp.hh>
 #include <dumux/material/fluidmatrixinteractions/2p/brookscorey.hh>
 
 #include <dumux/io/gnuplotinterface.hh>
@@ -41,13 +41,13 @@ namespace Dumux {
  *        which uses the isothermal two-phase two-component
  *        fully implicit model.
  */
-template<class FVGridGeometry, class Scalar>
+template<class GridGeometry, class Scalar>
 class InjectionSpatialParams
-: public FVSpatialParams<FVGridGeometry, Scalar, InjectionSpatialParams<FVGridGeometry, Scalar>>
+: public FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, InjectionSpatialParams<GridGeometry, Scalar>>
 {
-    using ThisType = InjectionSpatialParams<FVGridGeometry, Scalar>;
-    using ParentType = FVSpatialParams<FVGridGeometry, Scalar, ThisType>;
-    using GridView = typename FVGridGeometry::GridView;
+    using ThisType = InjectionSpatialParams<GridGeometry, Scalar>;
+    using ParentType = FVPorousMediumFlowSpatialParamsMP<GridGeometry, Scalar, ThisType>;
+    using GridView = typename GridGeometry::GridView;
 
     // get the dimensions of the simulation domain from GridView
     static const int dimWorld = GridView::dimensionworld;
@@ -63,10 +63,10 @@ public:
     /*!
      * \brief The constructor
      *
-     * \param fvGridGeometry The finite volume grid geometry
+     * \param gridGeometry The finite volume grid geometry
      */
-    InjectionSpatialParams(std::shared_ptr<const FVGridGeometry>& fvGridGeometry)
-    : ParentType(fvGridGeometry)
+    InjectionSpatialParams(std::shared_ptr<const GridGeometry>& gridGeometry)
+    : ParentType(gridGeometry)
     , aquitardPcKrSwCurve_("SpatialParams.Aquitard")
     , aquiferPcKrSwCurve_("SpatialParams.Aquifer")
     {
@@ -113,10 +113,10 @@ public:
      * \param globalPos The global coordinates for the given location
      */
     auto fluidMatrixInteractionAtPos(const GlobalPosition& globalPos) const
-    {   
+    {
         if (isInAquitard_(globalPos))
-            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_); 
-        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_); 
+            return makeFluidMatrixInteraction(aquitardPcKrSwCurve_);
+        return makeFluidMatrixInteraction(aquiferPcKrSwCurve_);
     }
 
     /*!
@@ -129,6 +129,15 @@ public:
     int wettingPhaseAtPos(const GlobalPosition& globalPos) const
     { return FluidSystem::H2OIdx; }
 
+    /*!
+     * \brief Returns the temperature at the domain at the given position
+     * \param globalPos The position in global coordinates where the temperature should be specified
+     */
+    Scalar temperatureAtPos(const GlobalPosition& globalPos) const
+    {
+        return 273.15 + 30;
+    }
+
 private:
 
     static constexpr Scalar eps_ = 1e-6;
diff --git a/scripts/install.sh b/scripts/install.sh
index 2ff22ae55831b50dabc470e5140151e24c9567e4..ca539cbd74c9febb2834696888a438a481510bd0 100644
--- a/scripts/install.sh
+++ b/scripts/install.sh
@@ -98,7 +98,7 @@ done
 
 # dune-subgrid
 if [ ! -d "dune-subgrid" ]; then
-    git clone -b releases/$DUNE_VERSION  https://git.imp.fu-berlin.de/agnumpde/dune-subgrid.git
+    git clone -b releases/$DUNE_VERSION  https://gitlab.dune-project.org/extensions/dune-subgrid
 else
     echo "Skip cloning dune-subgrid because the folder already exists."
     git checkout releases/$DUNE_VERSION