diff --git a/exercises/exercise-basic/exercise_basic_2p2c.cc b/exercises/exercise-basic/exercise_basic_2p2c.cc
index 68c91ea1cf64954a1185f76fcf2a5a0979ccc2bb..3232900d53c192578da9b4c550919b3db82b5ac7 100644
--- a/exercises/exercise-basic/exercise_basic_2p2c.cc
+++ b/exercises/exercise-basic/exercise_basic_2p2c.cc
@@ -124,16 +124,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-//     using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
-//     VtkOutputModule<TypeTag> vtkWriter(*problem, *fvGridGeometry, *gridVariables, x, problem->name());
-//     VtkOutputFields::init(vtkWriter); //! Add model specific output fields
-
-    // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop
diff --git a/exercises/exercise-biomineralization/exercisebiomin.cc b/exercises/exercise-biomineralization/exercisebiomin.cc
index a4cbddfd057b5462be42c54695b44f8f6cfa3ac5..0ac7f193b04829a529f0d00725ebf41c391f1df7 100644
--- a/exercises/exercise-biomineralization/exercisebiomin.cc
+++ b/exercises/exercise-biomineralization/exercisebiomin.cc
@@ -104,7 +104,7 @@ int main(int argc, char** argv) try
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
     auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
-    gridVariables->init(x, xOld);
+    gridVariables->init(x);
 
     // get some time loop parameters
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
@@ -113,9 +113,9 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // initialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
-    VtkOutputFields::init(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     //add specific output
     vtkWriter.addField(problem->getKxx(), "Kxx");
     vtkWriter.addField(problem->getKyy(), "Kyy");
diff --git a/exercises/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc b/exercises/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc
index 62673d5a81469edb1b67376c506b54a2dd840507..53c927f67e80d2408004db3e748fbb3e1dc6ad85 100644
--- a/exercises/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc
+++ b/exercises/exercise-coupling-ff-pm/interface/ex_interface_coupling_ff-pm.cc
@@ -202,7 +202,7 @@ int main(int argc, char** argv) try
     const auto darcyName = getParam<std::string>("Problem.Name") + "_" + darcyProblem->name();
 
     StaggeredVtkOutputModule<StokesGridVariables, decltype(stokesSol)> stokesVtkWriter(*stokesGridVariables, stokesSol, stokesName);
-    GetPropType<StokesTypeTag, Properties::VtkOutputFields>::initOutputModule(stokesVtkWriter);
+    GetPropType<StokesTypeTag, Properties::IOFields>::initOutputModule(stokesVtkWriter);
 
     //****** uncomment the add analytical solution of v_x *****//
     // stokesVtkWriter.addField(stokesProblem->getAnalyticalVelocityX(), "analyticalV_x");
diff --git a/exercises/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc b/exercises/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc
index 8dc210c527a0f39bc03a19b311e228b4c272a70d..48d89fe4f579aca4aad2350bbb33db7054ffba97 100644
--- a/exercises/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc
+++ b/exercises/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc
@@ -172,7 +172,7 @@ int main(int argc, char** argv) try
     const auto darcyName = getParam<std::string>("Problem.Name") + "_" + darcyProblem->name();
 
     StaggeredVtkOutputModule<StokesGridVariables, decltype(stokesSol)> stokesVtkWriter(*stokesGridVariables, stokesSol, stokesName);
-    GetPropType<StokesTypeTag, Properties::VtkOutputFields>::initOutputModule(stokesVtkWriter);
+    GetPropType<StokesTypeTag, Properties::IOFields>::initOutputModule(stokesVtkWriter);
     stokesVtkWriter.write(0.0);
 
     VtkOutputModule<DarcyGridVariables, GetPropType<DarcyTypeTag, Properties::SolutionVector>> darcyVtkWriter(*darcyGridVariables, sol[darcyIdx], darcyName);
diff --git a/exercises/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc b/exercises/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc
index 523a33706876711eb7bce77fd58758ad54b8c239..3d756d624d227265bcd9a63c27871acde570e425 100644
--- a/exercises/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc
+++ b/exercises/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc
@@ -177,7 +177,7 @@ int main(int argc, char** argv) try
     const auto darcyName = getParam<std::string>("Problem.Name") + "_" + darcyProblem->name();
 
     StaggeredVtkOutputModule<StokesGridVariables, decltype(stokesSol)> stokesVtkWriter(*stokesGridVariables, stokesSol, stokesName);
-    GetPropType<StokesTypeTag, Properties::VtkOutputFields>::initOutputModule(stokesVtkWriter);
+    GetPropType<StokesTypeTag, Properties::IOFields>::initOutputModule(stokesVtkWriter);
     stokesVtkWriter.write(0.0);
 
     VtkOutputModule<DarcyGridVariables, GetPropType<DarcyTypeTag, Properties::SolutionVector>> darcyVtkWriter(*darcyGridVariables, sol[darcyIdx], darcyName);
diff --git a/exercises/exercise-fluidsystem/exercise-fluidsystem.cc b/exercises/exercise-fluidsystem/exercise-fluidsystem.cc
index 61f3df14af8b43ee26ecdb9403d32906a7a8ccf8..184814d6ef3cc3f5112ec20d85228405b7d4b7f9 100644
--- a/exercises/exercise-fluidsystem/exercise-fluidsystem.cc
+++ b/exercises/exercise-fluidsystem/exercise-fluidsystem.cc
@@ -116,11 +116,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
 
     // instantiate time loop
     auto timeLoop = std::make_shared<TimeLoop<Scalar>>(/*start time*/0.0, dt, tEnd);
diff --git a/exercises/exercise-fractures/exercise_fractures.cc b/exercises/exercise-fractures/exercise_fractures.cc
index 7a61562d8c06a710d93cc4f1d61eeec01ef7d0e5..55ebc0d96369e9647767bda8ea8e6a53f27b7752 100644
--- a/exercises/exercise-fractures/exercise_fractures.cc
+++ b/exercises/exercise-fractures/exercise_fractures.cc
@@ -187,10 +187,10 @@ int main(int argc, char** argv) try
     FractureVtkOutputModule fractureVtkWriter(*fractureGridVariables, x[fractureDomainId], fractureProblem->name());
 
     // Add model specific output fields
-    using MatrixVtkOutputFields = GetPropType<MatrixTypeTag, Properties::VtkOutputFields>;
-    using FractureVtkOutputFields = GetPropType<FractureTypeTag, Properties::VtkOutputFields>;
-    MatrixVtkOutputFields::initOutputModule(matrixVtkWriter);
-    FractureVtkOutputFields::initOutputModule(fractureVtkWriter);
+    using MatrixIOFields = GetPropType<MatrixTypeTag, Properties::IOFields>;
+    using FractureIOFields = GetPropType<FractureTypeTag, Properties::IOFields>;
+    MatrixIOFields::initOutputModule(matrixVtkWriter);
+    FractureIOFields::initOutputModule(fractureVtkWriter);
 
     // add domain markers to output
     std::vector<int> matrixDomainMarkers(matrixFvGridGeometry->gridView().size(0));
diff --git a/exercises/exercise-grids/exercise_grids.cc b/exercises/exercise-grids/exercise_grids.cc
index 4c5a065c85d57c064c42a8780d25cc5b9761f776..5f57026c15a0284cef6834d618cb1e84a513c623 100644
--- a/exercises/exercise-grids/exercise_grids.cc
+++ b/exercises/exercise-grids/exercise_grids.cc
@@ -125,11 +125,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop
diff --git a/exercises/exercise-mainfile/exercise_1p_c.cc b/exercises/exercise-mainfile/exercise_1p_c.cc
index 11f31b102fec8d7627c3c6e1bbc464ac77dc303f..94636e1af9c6c49ac11750dad520a35b405afee8 100644
--- a/exercises/exercise-mainfile/exercise_1p_c.cc
+++ b/exercises/exercise-mainfile/exercise_1p_c.cc
@@ -99,7 +99,7 @@ int main(int argc, char** argv) try
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
     auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
-    gridVariables->init(x, xOld);
+    gridVariables->init(x);
 
     // intialize the vtk output module
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
diff --git a/exercises/exercise-properties/exercise_properties.cc b/exercises/exercise-properties/exercise_properties.cc
index 558a13af5b329ac0d9b4a49e3ebb55c57215fa27..edcb4c519e9a111b5732623af07a528c3d23d859 100644
--- a/exercises/exercise-properties/exercise_properties.cc
+++ b/exercises/exercise-properties/exercise_properties.cc
@@ -155,14 +155,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
-
-    // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop
diff --git a/exercises/exercise-runtimeparams/exercise_runtimeparams.cc b/exercises/exercise-runtimeparams/exercise_runtimeparams.cc
index 315fb6fd78431e54b0227b60f6bd7bb60a57de0d..e1f59795af2dae7d00be6db859aab85e2969adec 100644
--- a/exercises/exercise-runtimeparams/exercise_runtimeparams.cc
+++ b/exercises/exercise-runtimeparams/exercise_runtimeparams.cc
@@ -125,11 +125,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop
diff --git a/exercises/solution/exercise-basic/exercise_basic_2pni.cc b/exercises/solution/exercise-basic/exercise_basic_2pni.cc
index 3a9037d996109d266a39c12c8659e9511252a26b..e8e234af521c072dcee617232787820f4bc23ece 100644
--- a/exercises/solution/exercise-basic/exercise_basic_2pni.cc
+++ b/exercises/solution/exercise-basic/exercise_basic_2pni.cc
@@ -123,11 +123,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop
diff --git a/exercises/solution/exercise-biomineralization/exercisebiomin.cc b/exercises/solution/exercise-biomineralization/exercisebiomin.cc
index a4cbddfd057b5462be42c54695b44f8f6cfa3ac5..0ac7f193b04829a529f0d00725ebf41c391f1df7 100644
--- a/exercises/solution/exercise-biomineralization/exercisebiomin.cc
+++ b/exercises/solution/exercise-biomineralization/exercisebiomin.cc
@@ -104,7 +104,7 @@ int main(int argc, char** argv) try
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
     auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
-    gridVariables->init(x, xOld);
+    gridVariables->init(x);
 
     // get some time loop parameters
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
@@ -113,9 +113,9 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // initialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
-    VtkOutputFields::init(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     //add specific output
     vtkWriter.addField(problem->getKxx(), "Kxx");
     vtkWriter.addField(problem->getKyy(), "Kyy");
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 84434750b1961a57b3d6a06be27df697eb06e601..4f3bc841f1402a4bfb27302854baa9bc6e64cbaf 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
@@ -192,7 +192,7 @@ int main(int argc, char** argv) try
     const auto darcyName = getParam<std::string>("Problem.Name") + "_" + darcyProblem->name();
 
     StaggeredVtkOutputModule<StokesGridVariables, decltype(stokesSol)> stokesVtkWriter(*stokesGridVariables, stokesSol, stokesName);
-    GetPropType<StokesTypeTag, Properties::VtkOutputFields>::initOutputModule(stokesVtkWriter);
+    GetPropType<StokesTypeTag, Properties::IOFields>::initOutputModule(stokesVtkWriter);
 
 #if EXNUMBER >= 2
     stokesVtkWriter.addField(stokesProblem->getAnalyticalVelocityX(), "analyticalV_x");
diff --git a/exercises/solution/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc b/exercises/solution/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc
index 8528aeba78ac6a54a16aec617d21ba99395b431d..da400646bb372dc2f387565ba66347f2b0f00fbf 100644
--- a/exercises/solution/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc
+++ b/exercises/solution/exercise-coupling-ff-pm/models/ex_models_coupling_ff-pm.cc
@@ -178,7 +178,7 @@ int main(int argc, char** argv) try
 #endif
 
     StaggeredVtkOutputModule<StokesGridVariables, decltype(stokesSol)> stokesVtkWriter(*stokesGridVariables, stokesSol, stokesName);
-    GetPropType<StokesTypeTag, Properties::VtkOutputFields>::initOutputModule(stokesVtkWriter);
+    GetPropType<StokesTypeTag, Properties::IOFields>::initOutputModule(stokesVtkWriter);
     stokesVtkWriter.write(0);
 
     VtkOutputModule<DarcyGridVariables, GetPropType<DarcyTypeTag, Properties::SolutionVector>> darcyVtkWriter(*darcyGridVariables, sol[darcyIdx], darcyName);
diff --git a/exercises/solution/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc b/exercises/solution/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc
index ac7f7584f622064966d4eefc47487889de0180d9..a50ebcea412c54c256df918817b560d16efeb1c0 100644
--- a/exercises/solution/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc
+++ b/exercises/solution/exercise-coupling-ff-pm/turbulence/ex_turbulence_coupling_ff-pm.cc
@@ -180,7 +180,7 @@ int main(int argc, char** argv) try
     const auto darcyName = getParam<std::string>("Problem.Name") + "_" + darcyProblem->name();
 
     StaggeredVtkOutputModule<StokesGridVariables, decltype(stokesSol)> stokesVtkWriter(*stokesGridVariables, stokesSol, stokesName);
-    GetPropType<StokesTypeTag, Properties::VtkOutputFields>::initOutputModule(stokesVtkWriter);
+    GetPropType<StokesTypeTag, Properties::IOFields>::initOutputModule(stokesVtkWriter);
     stokesVtkWriter.write(0.0);
 
     VtkOutputModule<DarcyGridVariables, GetPropType<DarcyTypeTag, Properties::SolutionVector>> darcyVtkWriter(*darcyGridVariables, sol[darcyIdx], darcyName);
diff --git a/exercises/solution/exercise-fluidsystem/exercise-fluidsystem.cc b/exercises/solution/exercise-fluidsystem/exercise-fluidsystem.cc
index ce136ff9df9e47daab2e84a6b77a784b8ee3f146..723a640bc5756c99cb03a500358bf9af3f712d18 100644
--- a/exercises/solution/exercise-fluidsystem/exercise-fluidsystem.cc
+++ b/exercises/solution/exercise-fluidsystem/exercise-fluidsystem.cc
@@ -105,7 +105,7 @@ int main(int argc, char** argv) try
     // the grid variables
     using GridVariables = GetPropType<TypeTag, Properties::GridVariables>;
     auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry);
-    gridVariables->init(x, xOld);
+    gridVariables->init(x);
 
     // get some time loop parameters
     using Scalar = GetPropType<TypeTag, Properties::Scalar>;
@@ -113,11 +113,11 @@ int main(int argc, char** argv) try
     const auto maxDt = getParam<Scalar>("TimeLoop.MaxTimeStepSize");
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
 
     // instantiate time loop
     auto timeLoop = std::make_shared<TimeLoop<Scalar>>(/*start time*/0.0, dt, tEnd);
diff --git a/exercises/solution/exercise-fluidsystem/fluidsystems/h2omycompressiblecomponent.hh b/exercises/solution/exercise-fluidsystem/fluidsystems/h2omycompressiblecomponent.hh
index 6f4d9be42fc2a7eeea40f7b922639d630931c2a9..4ff5595721564d460fcf466d04f618adf255de0f 100644
--- a/exercises/solution/exercise-fluidsystem/fluidsystems/h2omycompressiblecomponent.hh
+++ b/exercises/solution/exercise-fluidsystem/fluidsystems/h2omycompressiblecomponent.hh
@@ -122,6 +122,12 @@ public:
         return true;
     }
 
+        static constexpr bool isGas(int phaseIdx)
+    {
+        assert(0 <= phaseIdx && phaseIdx < numPhases);
+        return phaseIdx == phase1Idx;
+    }
+
     static constexpr bool isIdealGas(int phaseIdx)
     { return H2O::gasIsIdeal() && MyCompressibleComponent::gasIsIdeal(); }
 
diff --git a/exercises/solution/exercise-fractures/exercise_fractures.cc b/exercises/solution/exercise-fractures/exercise_fractures.cc
index ac6a9f1b3223a6bc4c189cd1e340e616e9b13296..c545a6e9782bdf5ee3146a977b77c8bf78838c50 100644
--- a/exercises/solution/exercise-fractures/exercise_fractures.cc
+++ b/exercises/solution/exercise-fractures/exercise_fractures.cc
@@ -180,10 +180,10 @@ int main(int argc, char** argv) try
     VtkOutputModule<FractureTypeTag> fractureVtkWriter(*fractureProblem, *fractureFvGridGeometry, *fractureGridVariables, x[fractureDomainId], fractureProblem->name());
 
     // Add model specific output fields
-    using MatrixVtkOutputFields = typename GET_PROP_TYPE(MatrixTypeTag, VtkOutputFields);
-    using FractureVtkOutputFields = typename GET_PROP_TYPE(FractureTypeTag, VtkOutputFields);
-    MatrixVtkOutputFields::init(matrixVtkWriter);
-    FractureVtkOutputFields::init(fractureVtkWriter);
+    using MatrixIOFields = typename GET_PROP_TYPE(MatrixTypeTag, IOFields);
+    using FractureIOFields = typename GET_PROP_TYPE(FractureTypeTag, IOFields);
+    MatrixIOFields::initOutputModule(matrixVtkWriter);
+    FractureIOFields::initOutputModule(fractureVtkWriter);
 
     // add domain markers to output
     std::vector<int> matrixDomainMarkers(matrixFvGridGeometry->gridView().size(0));
diff --git a/exercises/solution/exercise-grids/exercise_grids_solution.cc b/exercises/solution/exercise-grids/exercise_grids_solution.cc
index 6a9075383a74a5d551073efa17620cec6adfb56a..0f5ba9852fdad06cca4524bc93a6eff681db6008 100644
--- a/exercises/solution/exercise-grids/exercise_grids_solution.cc
+++ b/exercises/solution/exercise-grids/exercise_grids_solution.cc
@@ -125,11 +125,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop
diff --git a/exercises/solution/exercise-grids/injection2pproblem.hh b/exercises/solution/exercise-grids/injection2pproblem.hh
index 325d555dd6466f9c83371cabf8c373c81640ebc0..a18e2f4892fe371cf8824f7cd13a5f32a6f87efb 100644
--- a/exercises/solution/exercise-grids/injection2pproblem.hh
+++ b/exercises/solution/exercise-grids/injection2pproblem.hh
@@ -47,19 +47,19 @@ struct Injection2pCCTypeTag { using InheritsFrom = std::tuple<Injection2pTypeTag
 } // end namespace TTag
 
 //Set the grid type
-template<class TypeTag>
-struct Grid<TypeTag, TTag::Injection2pTypeTag> { using type = Dune::YaspGrid<2>; };
+// template<class TypeTag>
+// struct Grid<TypeTag, TTag::Injection2pTypeTag> { using type = Dune::YaspGrid<2>; };
 // TODO: Task 2: Replace the above Grid Property definition with a more flexible grid (Use Dune::TensorProductCoordinates)
 template<class TypeTag>
 struct Grid<TypeTag, TTag::Injection2pTypeTag> { using type = Dune::YaspGrid<2, Dune::TensorProductCoordinates<double, 2> >; };
 
 // TODO: Task 4: Replace the above Grid Property definition to read in a external structured grid via a .msh file (Use Dune::ALUGrid and Dune:cube)
-template<class TypeTag>
-struct Grid<TypeTag, TTag::Injection2pTypeTag> { using type = Dune::ALUGrid<2, 2, Dune::cube, Dune::nonconforming>; };
+// template<class TypeTag>
+// struct Grid<TypeTag, TTag::Injection2pTypeTag> { using type = Dune::ALUGrid<2, 2, Dune::cube, Dune::nonconforming>; };
 
 // TODO: Task 5: Replace the above Grid Property definition to read in a external unstructured grid via a .msh file (Use Dune::ALUGrid and Dune::simplex)
-template<class TypeTag>
-struct Grid<TypeTag, TTag::Injection2pTypeTag> { using type = Dune::ALUGrid<2, 2, Dune::simplex, Dune::nonconforming>; };
+// template<class TypeTag>
+// struct Grid<TypeTag, TTag::Injection2pTypeTag> { using type = Dune::ALUGrid<2, 2, Dune::simplex, Dune::nonconforming>; };
 
 // Set the problem property
 template<class TypeTag>
diff --git a/exercises/solution/exercise-properties/exercise_properties_solution.cc b/exercises/solution/exercise-properties/exercise_properties_solution.cc
index 2b4e03abf43e32db993de998ccab37cb3a679c71..f532f0dad45de620de89be1a7c73e3e4c7a1eb9a 100644
--- a/exercises/solution/exercise-properties/exercise_properties_solution.cc
+++ b/exercises/solution/exercise-properties/exercise_properties_solution.cc
@@ -154,14 +154,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
-
-    // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop
diff --git a/exercises/solution/exercise-properties/mylocalresidual.hh b/exercises/solution/exercise-properties/mylocalresidual.hh
index 485f33a8eacb2e145382e0beded58fbf11cba68c..2270f28e38c03e69c4bec6cdbffebfc7dc4598d5 100644
--- a/exercises/solution/exercise-properties/mylocalresidual.hh
+++ b/exercises/solution/exercise-properties/mylocalresidual.hh
@@ -53,7 +53,7 @@ class MyLocalResidual : public GET_PROP_TYPE(TypeTag, BaseLocalResidual)
     using EnergyLocalResidual = typename GET_PROP_TYPE(TypeTag, EnergyLocalResidual);
 
     using ModelTraits = typename GET_PROP_TYPE(TypeTag, ModelTraits);
-    static constexpr int numPhases = ModelTraits::numPhases();
+    static constexpr int numPhases = ModelTraits::numFluidPhases();
     static constexpr int conti0EqIdx = ModelTraits::Indices::conti0EqIdx; //!< first index for the mass balance
 
 public:
diff --git a/exercises/solution/exercise-runtimeparams/exercise_runtimeparams_solution.cc b/exercises/solution/exercise-runtimeparams/exercise_runtimeparams_solution.cc
index 315fb6fd78431e54b0227b60f6bd7bb60a57de0d..e1f59795af2dae7d00be6db859aab85e2969adec 100644
--- a/exercises/solution/exercise-runtimeparams/exercise_runtimeparams_solution.cc
+++ b/exercises/solution/exercise-runtimeparams/exercise_runtimeparams_solution.cc
@@ -125,11 +125,11 @@ int main(int argc, char** argv) try
     auto dt = getParam<Scalar>("TimeLoop.DtInitial");
 
     // intialize the vtk output module
-    using VtkOutputFields = GetPropType<TypeTag, Properties::VtkOutputFields>;
+    using IOFields = GetPropType<TypeTag, Properties::IOFields>;
     VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name());
     using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>;
     vtkWriter.addVelocityOutput(std::make_shared<VelocityOutput>(*gridVariables));
-    VtkOutputFields::initOutputModule(vtkWriter); //!< Add model specific output fields
+    IOFields::initOutputModule(vtkWriter); //!< Add model specific output fields
     vtkWriter.write(restartTime);
 
     // instantiate time loop