diff --git a/exercises/exercise-basic/injection2p2cproblem.hh b/exercises/exercise-basic/injection2p2cproblem.hh
index 790098527f172f945830c38383869b308cff43a1..f564bffe04205ab4d8a137a1fd7a255c22bf9886 100644
--- a/exercises/exercise-basic/injection2p2cproblem.hh
+++ b/exercises/exercise-basic/injection2p2cproblem.hh
@@ -43,7 +43,7 @@ namespace Properties {
 // Create new type tags
 namespace TTag {
 struct Injection2p2c { using InheritsFrom = std::tuple<TwoPTwoC>; };
-struct Injection2p2cCC { using InheritsFrom = std::tuple<CCTpfaModel, Injection2p2c>; };
+struct Injection2p2cCC { using InheritsFrom = std::tuple<Injection2p2c, CCTpfaModel>; };
 } // end namespace TTag
 
 // Set the grid type
@@ -55,9 +55,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2p2c> { using type = Injection2p2cProblem<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2p2c, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2p2c>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
 template<class TypeTag>
diff --git a/exercises/exercise-basic/injection2pniproblem.hh b/exercises/exercise-basic/injection2pniproblem.hh
index 8f0bd5d4ca245806d189621b91c59acef63af23f..7642c96a53db03c2eb80ba88f526f50fed8890ed 100644
--- a/exercises/exercise-basic/injection2pniproblem.hh
+++ b/exercises/exercise-basic/injection2pniproblem.hh
@@ -61,13 +61,23 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2pNITypeTag> { using type = InjectionProblem2PNI<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2pNITypeTag, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2pNITypeTag>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
 template<class TypeTag>
-struct FluidSystem<TypeTag, TTag::Injection2pNITypeTag> { using type = FluidSystems::H2ON2<GetPropType<TypeTag, Properties::Scalar>, FluidSystems::H2ON2DefaultPolicy</*fastButSimplifiedRelations=*/ true>>; };
+struct FluidSystem<TypeTag, TTag::Injection2pNITypeTag>
+{
+    using type = FluidSystems::H2ON2<GetPropType<TypeTag, Properties::Scalar>,
+                                     FluidSystems::H2ON2DefaultPolicy</*fastButSimplifiedRelations=*/true>>;
+};
 } // end namespace Properties
 
 /*!
diff --git a/exercises/exercise-basic/injection2pproblem.hh b/exercises/exercise-basic/injection2pproblem.hh
index 49257b1232682541981047ee238bb3a7a2a39cce..a4f762b51cb01f347ca5cb2dd2815dcbcc2cae78 100644
--- a/exercises/exercise-basic/injection2pproblem.hh
+++ b/exercises/exercise-basic/injection2pproblem.hh
@@ -57,9 +57,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2p> { using type = InjectionProblem2P<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2p, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2p>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
 template<class TypeTag>
diff --git a/exercises/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh b/exercises/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh
index 31fdc8a3383e7c52a5271291133b10d179751568..f25401bf6cb2125000950d50a1795e6e931468c4 100644
--- a/exercises/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh
+++ b/exercises/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh
@@ -70,9 +70,9 @@ template<class TypeTag>
 struct ReplaceCompEqIdx<TypeTag, TTag::DarcyOnePNC> { static constexpr int value = 3; };
 
 //! Use a model with constant tortuosity for the effective diffusivity
-SET_TYPE_PROP(DarcyOnePNC, EffectiveDiffusivityModel,
-              DiffusivityConstantTortuosity<GetPropType<TypeTag, Properties::Scalar>>);
-
+template<class TypeTag>
+struct EffectiveDiffusivityModel<TypeTag, TTag::DarcyOnePNC>
+{ using type = DiffusivityConstantTortuosity<GetPropType<TypeTag, Properties::Scalar>>; };
 // Set the grid type
 template<class TypeTag>
 struct Grid<TypeTag, TTag::DarcyOnePNC> { using type = Dune::YaspGrid<2>; };
diff --git a/exercises/exercise-fluidsystem/2p2cproblem.hh b/exercises/exercise-fluidsystem/2p2cproblem.hh
index d89d54e12dcab874d79bb8344ba45d9e7f093cb0..0c3082ca1650f529e3a8f3c796f7325208f36bd8 100644
--- a/exercises/exercise-fluidsystem/2p2cproblem.hh
+++ b/exercises/exercise-fluidsystem/2p2cproblem.hh
@@ -50,7 +50,7 @@ namespace Properties {
 // Create a new type tag for the problem
 // Create new type tags
 namespace TTag {
-struct ExerciseFluidsystemTwoPTwoC { using InheritsFrom = std::tuple<BoxModel, TwoPTwoC>; };
+struct ExerciseFluidsystemTwoPTwoC { using InheritsFrom = std::tuple<TwoPTwoC, BoxModel>; };
 } // end namespace TTag
 
 // Set the "Problem" property
@@ -58,9 +58,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::ExerciseFluidsystemTwoPTwoC> { using type = ExerciseFluidsystemProblemTwoPTwoC<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(ExerciseFluidsystemTwoPTwoC, SpatialParams,
-              ExerciseFluidsystemSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                         GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoPTwoC>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set grid and the grid creator to be used
 template<class TypeTag>
diff --git a/exercises/exercise-fluidsystem/2pproblem.hh b/exercises/exercise-fluidsystem/2pproblem.hh
index f0f257204a8f7d7527eb79e3ad23b79a5df0b654..1acfb0ff916b27b4089c92608c6676ebfed3d56a 100644
--- a/exercises/exercise-fluidsystem/2pproblem.hh
+++ b/exercises/exercise-fluidsystem/2pproblem.hh
@@ -64,7 +64,7 @@ namespace Properties {
 // Create a new type tag for the problem
 // Create new type tags
 namespace TTag {
-struct ExerciseFluidsystemTwoP { using InheritsFrom = std::tuple<BoxModel, TwoP>; };
+struct ExerciseFluidsystemTwoP { using InheritsFrom = std::tuple<TwoP, BoxModel>; };
 } // end namespace TTag
 
 // Set the "Problem" property
@@ -72,9 +72,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::ExerciseFluidsystemTwoP> { using type = ExerciseFluidsystemProblemTwoP<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(ExerciseFluidsystemTwoP, SpatialParams,
-              ExerciseFluidsystemSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                         GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoP>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set grid to be used
 template<class TypeTag>
diff --git a/exercises/exercise-fluidsystem/README.md b/exercises/exercise-fluidsystem/README.md
index 8ab0cb8e0e339e9c335bb83c9981d24dab86ca35..124002bb0337a047122c477cc096ae14791ad329 100644
--- a/exercises/exercise-fluidsystem/README.md
+++ b/exercises/exercise-fluidsystem/README.md
@@ -41,7 +41,7 @@ the `TwoP` _TypeTag_ (immiscible two-phase model properties) and the `BoxModel`
 ```c++
 // Create new type tags
 namespace TTag {
-struct ExerciseFluidsystemTwoP { using InheritsFrom = std::tuple<BoxModel, TwoP>; };
+struct ExerciseFluidsystemTwoP { using InheritsFrom = std::tuple<TwoP, BoxModel>; };
 } // end namespace TTag
 ```
 
@@ -185,7 +185,7 @@ two-component model properties:
 
 ```c++
 // Create a new type tag for the problem
-struct ExerciseFluidsystemTwoPTwoC { using InheritsFrom = std::tuple<BoxModel, TwoPTwoC>; };
+struct ExerciseFluidsystemTwoPTwoC { using InheritsFrom = std::tuple<TwoPTwoC, BoxModel>; };
 } // end namespace TTag
 ```
 
diff --git a/exercises/exercise-fractures/fractureproblem.hh b/exercises/exercise-fractures/fractureproblem.hh
index 38caa0cd591ac0786ddb84a21102dbd9428d0feb..5088241cc9f6c900899ce79e70db7c990f274892 100644
--- a/exercises/exercise-fractures/fractureproblem.hh
+++ b/exercises/exercise-fractures/fractureproblem.hh
@@ -51,7 +51,7 @@ namespace Properties {
 
 // Create new type tag node
 namespace TTag {
-struct FractureProblem { using InheritsFrom = std::tuple<CCTpfaModel, TwoP>; };
+struct FractureProblem { using InheritsFrom = std::tuple<TwoP, CCTpfaModel>; };
 } // end namespace TTag
 
 // Set the grid type
diff --git a/exercises/exercise-grids/injection2pproblem.hh b/exercises/exercise-grids/injection2pproblem.hh
index b99e7eb79b21a05c0c6f09cc1a6910bdef5d82bd..910b2ff8a5dfebe6ca14442bd7ae7ddc5f3190f6 100644
--- a/exercises/exercise-grids/injection2pproblem.hh
+++ b/exercises/exercise-grids/injection2pproblem.hh
@@ -60,9 +60,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2p> { using type = InjectionProblem2P<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2p, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2p>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
 template<class TypeTag>
diff --git a/exercises/exercise-properties/mylocalresidual.hh b/exercises/exercise-properties/mylocalresidual.hh
index 1a35cf0faa26b8f179d24719f8c5f6c155d04d8d..f47698e5e115969f72df11cd2458b1e2b178afe6 100644
--- a/exercises/exercise-properties/mylocalresidual.hh
+++ b/exercises/exercise-properties/mylocalresidual.hh
@@ -35,24 +35,24 @@ namespace Dumux
  *        using the n-phase immiscible fully implicit models.
  */
 template<class TypeTag>
-class MyLocalResidual : public GET_PROP_TYPE(TypeTag, BaseLocalResidual)
+class MyLocalResidual : public GetPropType<TypeTag, Properties::BaseLocalResidual>
 {
-    using ParentType = typename GET_PROP_TYPE(TypeTag, BaseLocalResidual);
-    using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
-    using Problem = typename GET_PROP_TYPE(TypeTag, Problem);
-    using NumEqVector = typename GET_PROP_TYPE(TypeTag, NumEqVector);
-    using VolumeVariables = typename GET_PROP_TYPE(TypeTag, VolumeVariables);
-    using ElementVolumeVariables = typename GET_PROP_TYPE(TypeTag, GridVolumeVariables)::LocalView;
-    using FluxVariables = typename GET_PROP_TYPE(TypeTag, FluxVariables);
-    using ElementFluxVariablesCache = typename GET_PROP_TYPE(TypeTag, GridFluxVariablesCache)::LocalView;
-    using FVElementGeometry = typename GET_PROP_TYPE(TypeTag, FVGridGeometry)::LocalView;
+    using ParentType = GetPropType<TypeTag, Properties::BaseLocalResidual>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+    using Problem = GetPropType<TypeTag, Properties::Problem>;
+    using NumEqVector = GetPropType<TypeTag, Properties::NumEqVector>;
+    using VolumeVariables = GetPropType<TypeTag, Properties::VolumeVariables>;
+    using ElementVolumeVariables = typename GetPropType<TypeTag, Properties::GridVolumeVariables>::LocalView;
+    using FluxVariables = GetPropType<TypeTag, Properties::FluxVariables>;
+    using ElementFluxVariablesCache = typename GetPropType<TypeTag, Properties::GridFluxVariablesCache>::LocalView;
+    using FVElementGeometry = typename GetPropType<TypeTag, Properties::FVGridGeometry>::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
     using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace;
-    using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
+    using GridView = GetPropType<TypeTag, Properties::GridView>;
     using Element = typename GridView::template Codim<0>::Entity;
-    using EnergyLocalResidual = typename GET_PROP_TYPE(TypeTag, EnergyLocalResidual);
+    using EnergyLocalResidual = GetPropType<TypeTag, Properties::EnergyLocalResidual>;
 
-    using ModelTraits = typename GET_PROP_TYPE(TypeTag, ModelTraits);
+    using ModelTraits = GetPropType<TypeTag, Properties::ModelTraits>;
     static constexpr int numPhases = ModelTraits::numPhases();
     static constexpr int conti0EqIdx = ModelTraits::Indices::conti0EqIdx; //!< first index for the mass balance
 
diff --git a/exercises/exercise-runtimeparams/injection2pproblem.hh b/exercises/exercise-runtimeparams/injection2pproblem.hh
index cdae77bfb6ea1f566a33dd4c2022423bfc9bf67b..ea353268dfbe27f1bdffed38d1b0d2985dd416d0 100644
--- a/exercises/exercise-runtimeparams/injection2pproblem.hh
+++ b/exercises/exercise-runtimeparams/injection2pproblem.hh
@@ -57,9 +57,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2p> { using type = InjectionProblem2P<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2p, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2p>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
 template<class TypeTag>
diff --git a/exercises/solution/exercise-basic/injection2pniproblem.hh b/exercises/solution/exercise-basic/injection2pniproblem.hh
index 6c9c835857a3bfc1445c5d1b7e46dd56dc4dc33e..8d971152777ecdd89e5b7d1b531bb6578e5e72c2 100644
--- a/exercises/solution/exercise-basic/injection2pniproblem.hh
+++ b/exercises/solution/exercise-basic/injection2pniproblem.hh
@@ -56,13 +56,23 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2pNITypeTag> { using type = InjectionProblem2PNI<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2pNITypeTag, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2pNITypeTag>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
-SET_TYPE_PROP(Injection2pNITypeTag, FluidSystem,
-    FluidSystems::H2ON2<GetPropType<TypeTag, Properties::Scalar>, FluidSystems::H2ON2DefaultPolicy</*fastButSimplifiedRelations=*/ true>>);
+template<class TypeTag>
+struct FluidSystem<TypeTag, TTag::Injection2pNITypeTag>
+{
+    using type = FluidSystems::H2ON2<GetPropType<TypeTag, Properties::Scalar>,
+                                     FluidSystems::H2ON2DefaultPolicy</*fastButSimplifiedRelations=*/true>>;
+};
 } // end namespace Properties
 
 /*!
diff --git a/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc b/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc
index 812cae47dad7fd9a031794ae6c01560586997d04..868ccc962c0e4119baa4546ebe9961f6c7884e61 100644
--- a/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc
+++ b/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc
@@ -53,15 +53,17 @@
 namespace Dumux {
 namespace Properties {
 
-SET_PROP(StokesOneP, CouplingManager)
+template<class TypeTag>
+struct CouplingManager<TypeTag, TTag::StokesOneP>
 {
-    using Traits = StaggeredMultiDomainTraits<TypeTag, TypeTag, TTAG(DarcyOneP)>;
+    using Traits = StaggeredMultiDomainTraits<TypeTag, TypeTag, Properties::TTag::DarcyOneP>;
     using type = Dumux::StokesDarcyCouplingManager<Traits>;
 };
 
-SET_PROP(DarcyOneP, CouplingManager)
+template<class TypeTag>
+struct CouplingManager<TypeTag, TTag::DarcyOneP>
 {
-    using Traits = StaggeredMultiDomainTraits<TTAG(StokesOneP), TTAG(StokesOneP), TypeTag>;
+    using Traits = StaggeredMultiDomainTraits<Properties::TTag::StokesOneP, Properties::TTag::StokesOneP, TypeTag>;
     using type = Dumux::StokesDarcyCouplingManager<Traits>;
 };
 
@@ -83,17 +85,17 @@ int main(int argc, char** argv) try
     Parameters::init(argc, argv);
 
     // Define the sub problem type tags
-    using StokesTypeTag = TTAG(StokesOneP);
-    using DarcyTypeTag = TTAG(DarcyOneP);
+    using StokesTypeTag = Properties::TTag::StokesOneP;
+    using DarcyTypeTag = Properties::TTag::DarcyOneP;
 
 #if EXNUMBER < 3
     // try to create a grid (from the given grid file or the input file)
     // for both sub-domains
-    using DarcyGridManager = Dumux::GridManager<typename GET_PROP_TYPE(DarcyTypeTag, Grid)>;
+    using DarcyGridManager = Dumux::GridManager<GetPropType<DarcyTypeTag, Properties::Grid>>;
     DarcyGridManager darcyGridManager;
     darcyGridManager.init("Darcy"); // pass parameter group
 
-    using StokesGridManager = Dumux::GridManager<typename GET_PROP_TYPE(StokesTypeTag, Grid)>;
+    using StokesGridManager = Dumux::GridManager<GetPropType<StokesTypeTag, Properties::Grid>>;
     StokesGridManager stokesGridManager;
     stokesGridManager.init("Stokes"); // pass parameter group
 
@@ -143,10 +145,10 @@ int main(int argc, char** argv) try
 
 
     // create the finite volume grid geometry
-    using StokesFVGridGeometry = typename GET_PROP_TYPE(StokesTypeTag, FVGridGeometry);
+    using StokesFVGridGeometry = GetPropType<StokesTypeTag, Properties::FVGridGeometry>;
     auto stokesFvGridGeometry = std::make_shared<StokesFVGridGeometry>(stokesGridView);
     stokesFvGridGeometry->update();
-    using DarcyFVGridGeometry = typename GET_PROP_TYPE(DarcyTypeTag, FVGridGeometry);
+    using DarcyFVGridGeometry = GetPropType<DarcyTypeTag, Properties::FVGridGeometry>;
     auto darcyFvGridGeometry = std::make_shared<DarcyFVGridGeometry>(darcyGridView);
     darcyFvGridGeometry->update();
 
@@ -162,9 +164,9 @@ int main(int argc, char** argv) try
     constexpr auto darcyIdx = CouplingManager::darcyIdx;
 
     // the problem (initial and boundary conditions)
-    using StokesProblem = typename GET_PROP_TYPE(StokesTypeTag, Problem);
+    using StokesProblem = GetPropType<StokesTypeTag, Properties::Problem>;
     auto stokesProblem = std::make_shared<StokesProblem>(stokesFvGridGeometry, couplingManager);
-    using DarcyProblem = typename GET_PROP_TYPE(DarcyTypeTag, Problem);
+    using DarcyProblem = GetPropType<DarcyTypeTag, Properties::Problem>;
     auto darcyProblem = std::make_shared<DarcyProblem>(darcyFvGridGeometry, couplingManager);
 
     // the solution vector
@@ -181,10 +183,10 @@ int main(int argc, char** argv) try
     couplingManager->init(stokesProblem, darcyProblem, sol);
 
     // the grid variables
-    using StokesGridVariables = typename GET_PROP_TYPE(StokesTypeTag, GridVariables);
+    using StokesGridVariables = GetPropType<StokesTypeTag, Properties::GridVariables>;
     auto stokesGridVariables = std::make_shared<StokesGridVariables>(stokesProblem, stokesFvGridGeometry);
     stokesGridVariables->init(stokesSol);
-    using DarcyGridVariables = typename GET_PROP_TYPE(DarcyTypeTag, GridVariables);
+    using DarcyGridVariables = GetPropType<DarcyTypeTag, Properties::GridVariables>;
     auto darcyGridVariables = std::make_shared<DarcyGridVariables>(darcyProblem, darcyFvGridGeometry);
     darcyGridVariables->init(sol[darcyIdx]);
 
diff --git a/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_ffproblem.hh b/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_ffproblem.hh
index 38ff20ac9b44d26adb7dca4148b38eb944c98194..79e7c8ea22269525a26f8706b52d5848c8b17014 100644
--- a/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_ffproblem.hh
+++ b/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_ffproblem.hh
@@ -43,20 +43,25 @@ class StokesSubProblem;
 
 namespace Properties
 {
-NEW_TYPE_TAG(StokesOneP, INHERITS_FROM(StaggeredFreeFlowModel, NavierStokes));
+// Create new type tags
+namespace TTag {
+struct StokesOneP { using InheritsFrom = std::tuple<NavierStokes, StaggeredFreeFlowModel>; };
+} // end namespace TTag
 
 // the fluid system
-SET_PROP(StokesOneP, FluidSystem)
+template<class TypeTag>
+struct FluidSystem<TypeTag, TTag::StokesOneP>
 {
-    using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using type = FluidSystems::OnePLiquid<Scalar, Dumux::Components::SimpleH2O<Scalar> > ;
 };
 
 // Set the grid type
-SET_PROP(StokesOneP, Grid)
+template<class TypeTag>
+struct Grid<TypeTag, TTag::StokesOneP>
 {
     static constexpr auto dim = 2;
-    using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
     using TensorGrid = Dune::YaspGrid<2, Dune::TensorProductCoordinates<Scalar, dim> >;
 
 #if EXNUMBER < 3 // use "normal" grid
@@ -68,12 +73,15 @@ SET_PROP(StokesOneP, Grid)
 };
 
 // Set the problem property
-SET_TYPE_PROP(StokesOneP, Problem, Dumux::StokesSubProblem<TypeTag> );
-
-SET_BOOL_PROP(StokesOneP, EnableFVGridGeometryCache, true);
-SET_BOOL_PROP(StokesOneP, EnableGridFluxVariablesCache, true);
-SET_BOOL_PROP(StokesOneP, EnableGridVolumeVariablesCache, true);
-
+template<class TypeTag>
+struct Problem<TypeTag, TTag::StokesOneP> { using type = Dumux::StokesSubProblem<TypeTag> ; };
+
+template<class TypeTag>
+struct EnableFVGridGeometryCache<TypeTag, TTag::StokesOneP> { static constexpr bool value = true; };
+template<class TypeTag>
+struct EnableGridFluxVariablesCache<TypeTag, TTag::StokesOneP> { static constexpr bool value = true; };
+template<class TypeTag>
+struct EnableGridVolumeVariablesCache<TypeTag, TTag::StokesOneP> { static constexpr bool value = true; };
 }
 
 /*!
@@ -84,25 +92,25 @@ class StokesSubProblem : public NavierStokesProblem<TypeTag>
 {
     using ParentType = NavierStokesProblem<TypeTag>;
 
-    using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
-    using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
+    using GridView = GetPropType<TypeTag, Properties::GridView>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
 
-    using Indices = typename GET_PROP_TYPE(TypeTag, ModelTraits)::Indices;
+    using Indices = typename GetPropType<TypeTag, Properties::ModelTraits>::Indices;
 
-    using BoundaryTypes = typename GET_PROP_TYPE(TypeTag, BoundaryTypes);
+    using BoundaryTypes = GetPropType<TypeTag, Properties::BoundaryTypes>;
 
-    using FVGridGeometry = typename GET_PROP_TYPE(TypeTag, FVGridGeometry);
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
     using FVElementGeometry = typename FVGridGeometry::LocalView;
     using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace;
     using Element = typename GridView::template Codim<0>::Entity;
 
     using GlobalPosition = typename Element::Geometry::GlobalCoordinate;
 
-    using PrimaryVariables = typename GET_PROP_TYPE(TypeTag, PrimaryVariables);
-    using NumEqVector = typename GET_PROP_TYPE(TypeTag, NumEqVector);
-    using FluidSystem = typename GET_PROP_TYPE(TypeTag, FluidSystem);
+    using PrimaryVariables = GetPropType<TypeTag, Properties::PrimaryVariables>;
+    using NumEqVector = GetPropType<TypeTag, Properties::NumEqVector>;
+    using FluidSystem = GetPropType<TypeTag, Properties::FluidSystem>;
 
-    using CouplingManager = typename GET_PROP_TYPE(TypeTag, CouplingManager);
+    using CouplingManager = GetPropType<TypeTag, Properties::CouplingManager>;
 
 public:
     StokesSubProblem(std::shared_ptr<const FVGridGeometry> fvGridGeometry, std::shared_ptr<CouplingManager> couplingManager)
diff --git a/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_pmproblem.hh b/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_pmproblem.hh
index 51e1663c8d66f1379545bb566e8c38336c4632e5..9649b0e90872a90d423c0c526399c025bf4d551b 100644
--- a/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_pmproblem.hh
+++ b/exercises/solution/exercise-coupling-ff-pm/interface/ex_interface_pmproblem.hh
@@ -84,7 +84,6 @@ template<class TypeTag>
 struct SpatialParams<TypeTag, TTag::DarcyOneP> {
     using type = OnePSpatialParams<GetPropType<TypeTag, FVGridGeometry>, GetPropType<TypeTag, Scalar>>;
 };
-
 } // end namespace Properties
 
 /*!
diff --git a/exercises/solution/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh b/exercises/solution/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh
index aec17c64c9cd62ea0800480ae8a3e4dee6015c00..73771923b2a2c838df5399b70508df4d0ad5ffb6 100644
--- a/exercises/solution/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh
+++ b/exercises/solution/exercise-coupling-ff-pm/models/ex_models_pmproblem.hh
@@ -83,9 +83,9 @@ template<class TypeTag>
 struct ReplaceCompEqIdx<TypeTag, TTag::DarcyOnePNC> { static constexpr int value = 3; };
 
 //! Use a model with constant tortuosity for the effective diffusivity
-SET_TYPE_PROP(DarcyOnePNC, EffectiveDiffusivityModel,
-              DiffusivityConstantTortuosity<GetPropType<TypeTag, Properties::Scalar>>);
-
+template<class TypeTag>
+struct EffectiveDiffusivityModel<TypeTag, TTag::DarcyOnePNC>
+{ using type = DiffusivityConstantTortuosity<GetPropType<TypeTag, Properties::Scalar>>; };
 // Set the grid type
 template<class TypeTag>
 struct Grid<TypeTag, TTag::DarcyOnePNC> { using type = Dune::YaspGrid<2>; };
diff --git a/exercises/solution/exercise-fluidsystem/2p2cproblem.hh b/exercises/solution/exercise-fluidsystem/2p2cproblem.hh
index 09221c49e68b0eeb5faac71b70db0cf4a95a04c1..25ae5d6c9939ea9e2509f2ecf07d7455944a8ce1 100644
--- a/exercises/solution/exercise-fluidsystem/2p2cproblem.hh
+++ b/exercises/solution/exercise-fluidsystem/2p2cproblem.hh
@@ -50,7 +50,7 @@ namespace Properties {
 // Create a new type tag for the problem
 // Create new type tags
 namespace TTag {
-struct ExerciseFluidsystemTwoPTwoC { using InheritsFrom = std::tuple<BoxModel, TwoPTwoC>; };
+struct ExerciseFluidsystemTwoPTwoC { using InheritsFrom = std::tuple<TwoPTwoC, BoxModel>; };
 } // end namespace TTag
 
 // Set the "Problem" property
@@ -58,9 +58,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::ExerciseFluidsystemTwoPTwoC> { using type = ExerciseFluidsystemProblemTwoPTwoC<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(ExerciseFluidsystemTwoPTwoC, SpatialParams,
-              ExerciseFluidsystemSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                         GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoPTwoC>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set grid and the grid creator to be used
 template<class TypeTag>
diff --git a/exercises/solution/exercise-fluidsystem/2pproblem.hh b/exercises/solution/exercise-fluidsystem/2pproblem.hh
index e289f9d8340d2284d2930f34a259907aa16b73eb..fa461792f0ae45a1262d4add2c6c52bcc287db20 100644
--- a/exercises/solution/exercise-fluidsystem/2pproblem.hh
+++ b/exercises/solution/exercise-fluidsystem/2pproblem.hh
@@ -64,7 +64,7 @@ namespace Properties {
 // Create a new type tag for the problem
 // Create new type tags
 namespace TTag {
-struct ExerciseFluidsystemTwoP { using InheritsFrom = std::tuple<BoxModel, TwoP>; };
+struct ExerciseFluidsystemTwoP { using InheritsFrom = std::tuple<TwoP, BoxModel>; };
 } // end namespace TTag
 
 // Set the "Problem" property
@@ -72,9 +72,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::ExerciseFluidsystemTwoP> { using type = ExerciseFluidsystemProblemTwoP<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(ExerciseFluidsystemTwoP, SpatialParams,
-              ExerciseFluidsystemSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                         GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::ExerciseFluidsystemTwoP>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = ExerciseFluidsystemSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set grid to be used
 template<class TypeTag>
diff --git a/exercises/solution/exercise-fractures/fractureproblem.hh b/exercises/solution/exercise-fractures/fractureproblem.hh
index 2fc8aaa92e269b3add24b5ff7beb81b445a55812..1f74f6c656009c41c7fc3d8f65f3d34dbc4f975e 100644
--- a/exercises/solution/exercise-fractures/fractureproblem.hh
+++ b/exercises/solution/exercise-fractures/fractureproblem.hh
@@ -51,7 +51,7 @@ namespace Properties {
 
 // Create new type tag node
 namespace TTag {
-struct FractureProblem { using InheritsFrom = std::tuple<CCTpfaModel, TwoP>; };
+struct FractureProblem { using InheritsFrom = std::tuple<TwoP, CCTpfaModel>; };
 } // end namespace TTag
 
 // Set the grid type
diff --git a/exercises/solution/exercise-grids/injection2pproblem.hh b/exercises/solution/exercise-grids/injection2pproblem.hh
index 91d8701572610dc726ab0888d26d0d3c99cdaa48..101c0379150b600d40dbe7404ec669f03e0b3da2 100644
--- a/exercises/solution/exercise-grids/injection2pproblem.hh
+++ b/exercises/solution/exercise-grids/injection2pproblem.hh
@@ -68,9 +68,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2p> { using type = InjectionProblem2P<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2p, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2p>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
 template<class TypeTag>
diff --git a/exercises/solution/exercise-properties/mylocalresidual.hh b/exercises/solution/exercise-properties/mylocalresidual.hh
index 2270f28e38c03e69c4bec6cdbffebfc7dc4598d5..5b80d2e3e5c9122ed0ff08ddb3c67d47b89c4783 100644
--- a/exercises/solution/exercise-properties/mylocalresidual.hh
+++ b/exercises/solution/exercise-properties/mylocalresidual.hh
@@ -35,24 +35,24 @@ namespace Dumux
  *        using the n-phase immiscible fully implicit models.
  */
 template<class TypeTag>
-class MyLocalResidual : public GET_PROP_TYPE(TypeTag, BaseLocalResidual)
+class MyLocalResidual : public GetPropType<TypeTag, Properties::BaseLocalResidual>
 {
-    using ParentType = typename GET_PROP_TYPE(TypeTag, BaseLocalResidual);
-    using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar);
-    using Problem = typename GET_PROP_TYPE(TypeTag, Problem);
-    using NumEqVector = typename GET_PROP_TYPE(TypeTag, NumEqVector);
-    using VolumeVariables = typename GET_PROP_TYPE(TypeTag, VolumeVariables);
-    using ElementVolumeVariables = typename GET_PROP_TYPE(TypeTag, GridVolumeVariables)::LocalView;
-    using FluxVariables = typename GET_PROP_TYPE(TypeTag, FluxVariables);
-    using ElementFluxVariablesCache = typename GET_PROP_TYPE(TypeTag, GridFluxVariablesCache)::LocalView;
-    using FVElementGeometry = typename GET_PROP_TYPE(TypeTag, FVGridGeometry)::LocalView;
+    using ParentType = GetPropType<TypeTag, Properties::BaseLocalResidual>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+    using Problem = GetPropType<TypeTag, Properties::Problem>;
+    using NumEqVector = GetPropType<TypeTag, Properties::NumEqVector>;
+    using VolumeVariables = GetPropType<TypeTag, Properties::VolumeVariables>;
+    using ElementVolumeVariables = typename GetPropType<TypeTag, Properties::GridVolumeVariables>::LocalView;
+    using FluxVariables = GetPropType<TypeTag, Properties::FluxVariables>;
+    using ElementFluxVariablesCache = typename GetPropType<TypeTag, Properties::GridFluxVariablesCache>::LocalView;
+    using FVElementGeometry = typename GetPropType<TypeTag, Properties::FVGridGeometry>::LocalView;
     using SubControlVolume = typename FVElementGeometry::SubControlVolume;
     using SubControlVolumeFace = typename FVElementGeometry::SubControlVolumeFace;
-    using GridView = typename GET_PROP_TYPE(TypeTag, GridView);
+    using GridView = GetPropType<TypeTag, Properties::GridView>;
     using Element = typename GridView::template Codim<0>::Entity;
-    using EnergyLocalResidual = typename GET_PROP_TYPE(TypeTag, EnergyLocalResidual);
+    using EnergyLocalResidual = GetPropType<TypeTag, Properties::EnergyLocalResidual>;
 
-    using ModelTraits = typename GET_PROP_TYPE(TypeTag, ModelTraits);
+    using ModelTraits = GetPropType<TypeTag, Properties::ModelTraits>;
     static constexpr int numPhases = ModelTraits::numFluidPhases();
     static constexpr int conti0EqIdx = ModelTraits::Indices::conti0EqIdx; //!< first index for the mass balance
 
diff --git a/exercises/solution/exercise-runtimeparams/injection2pproblem.hh b/exercises/solution/exercise-runtimeparams/injection2pproblem.hh
index d0ca6596626c23491b6b5b026222aec094b2b5c4..b2d79304a3f0a2778f1b075ad5b7b41241c7d30f 100644
--- a/exercises/solution/exercise-runtimeparams/injection2pproblem.hh
+++ b/exercises/solution/exercise-runtimeparams/injection2pproblem.hh
@@ -57,9 +57,15 @@ template<class TypeTag>
 struct Problem<TypeTag, TTag::Injection2p> { using type = InjectionProblem2P<TypeTag>; };
 
 // Set the spatial parameters
-SET_TYPE_PROP(Injection2p, SpatialParams,
-              InjectionSpatialParams<GetPropType<TypeTag, Properties::FVGridGeometry>,
-                                     GetPropType<TypeTag, Properties::Scalar>>);
+template<class TypeTag>
+struct SpatialParams<TypeTag, TTag::Injection2p>
+{
+private:
+    using FVGridGeometry = GetPropType<TypeTag, Properties::FVGridGeometry>;
+    using Scalar = GetPropType<TypeTag, Properties::Scalar>;
+public:
+    using type = InjectionSpatialParams<FVGridGeometry, Scalar>;
+};
 
 // Set fluid configuration
 template<class TypeTag>