diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp
index 83dca05b08f843daf6386e205b49140b9c753189..32935f927bdf02f77f280fbf8d82385b81b0ff1d 100644
--- a/Applications/ApplicationsLib/ProjectData.cpp
+++ b/Applications/ApplicationsLib/ProjectData.cpp
@@ -55,14 +55,14 @@ ProjectData::ProjectData(BaseLib::ConfigTree const& project_config,
     std::string const& project_directory,
     std::string const& output_directory)
 {
-    // geometry
     std::string const geometry_file = BaseLib::copyPathToFileName(
+            //! \ogs_file_param{prj__geometry}
             project_config.getConfParam<std::string>("geometry"), project_directory
         );
     detail::readGeometry(geometry_file, *_geoObjects);
 
-    // mesh
     std::string const mesh_file = BaseLib::copyPathToFileName(
+            //! \ogs_file_param{prj__mesh}
             project_config.getConfParam<std::string>("mesh"), project_directory
         );
 
@@ -74,26 +74,28 @@ ProjectData::ProjectData(BaseLib::ConfigTree const& project_config,
     }
     _mesh_vec.push_back(mesh);
 
-    // curves
+    //! \ogs_file_param{prj__curves}
     parseCurves(project_config.getConfSubtreeOptional("curves"));
 
-    // process variables
+    //! \ogs_file_param{prj__process_variables}
     parseProcessVariables(project_config.getConfSubtree("process_variables"));
 
-    // parameters
+    //! \ogs_file_param{prj__parameters}
     parseParameters(project_config.getConfSubtree("parameters"));
 
-    // processes
+    //! \ogs_file_param{prj__processes}
     parseProcesses(project_config.getConfSubtree("processes"));
 
-    // output
+    //! \ogs_file_param{prj__output}
     parseOutput(project_config.getConfSubtree("output"), output_directory);
 
-    // timestepping
+    //! \ogs_file_param{prj__time_stepping}
     parseTimeStepping(project_config.getConfSubtree("time_stepping"));
 
+    //! \ogs_file_param{prj__linear_solvers}
     parseLinearSolvers(project_config.getConfSubtree("linear_solvers"));
 
+    //! \ogs_file_param{prj__nonlinear_solvers}
     parseNonlinearSolvers(project_config.getConfSubtree("nonlinear_solvers"));
 }
 
@@ -156,13 +158,16 @@ void ProjectData::buildProcesses()
 {
     for (auto const& pc : _process_configs)
     {
+        //! \ogs_file_param{process__type}
         auto const type = pc.peekConfParam<std::string>("type");
 
+        //! \ogs_file_param{process__nonlinear_solver}
         auto const nl_slv_name = pc.getConfParam<std::string>("nonlinear_solver");
         auto& nl_slv = BaseLib::getOrError(_nonlinear_solvers, nl_slv_name,
             "A nonlinear solver with the given name has not been defined.");
 
         auto time_disc = NumLib::createTimeDiscretization<GlobalVector>(
+                //! \ogs_file_param{process__time_discretization}
                 pc.getConfSubtree("time_discretization")
             );
 
@@ -258,6 +263,7 @@ void ProjectData::parseProcessVariables(
     // _process_variables.reserve(process_variables_config.size());
 
     for (auto var_config
+         //! \ogs_file_param{prj__process_variables__process_variable}
          : process_variables_config.getConfSubtreeList("process_variable")) {
         // TODO Extend to referenced meshes.
         _process_variables.emplace_back(var_config, *_mesh_vec[0], *_geoObjects);
@@ -269,9 +275,12 @@ void ProjectData::parseParameters(BaseLib::ConfigTree const& parameters_config)
     using namespace ProcessLib;
 
     DBUG("Reading parameters:");
+    //! \ogs_file_param{prj__parameters__parameter}
     for (auto parameter_config : parameters_config.getConfSubtreeList("parameter"))
     {
+        //! \ogs_file_param{parameter__name}
         auto name = parameter_config.getConfParam<std::string>("name");
+        //! \ogs_file_param{parameter__type}
         auto type = parameter_config.peekConfParam<std::string>("type");
 
         // Create parameter based on the provided type.
@@ -300,8 +309,10 @@ void ProjectData::parseParameters(BaseLib::ConfigTree const& parameters_config)
 void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config)
 {
     DBUG("Reading processes:");
+    //! \ogs_file_param{prj__processes__process}
     for (auto process_config : processes_config.getConfSubtreeList("process")) {
         // process type must be specified.
+        //! \ogs_file_param{process__type}
         process_config.peekConfParam<std::string>("type");
         process_config.ignoreConfParam("name");
         _process_configs.push_back(std::move(process_config));
@@ -311,6 +322,7 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config)
 void ProjectData::parseOutput(BaseLib::ConfigTree const& output_config,
     std::string const& output_directory)
 {
+    //! \ogs_file_param{prj__output__type}
     output_config.checkConfParam("type", "VTK");
     DBUG("Parse output configuration:");
 
@@ -335,8 +347,10 @@ void ProjectData::parseLinearSolvers(BaseLib::ConfigTree const& config)
 {
     DBUG("Reading linear solver configuration.");
 
+    //! \ogs_file_param{prj__linear_solvers__linear_solver}
     for (auto conf : config.getConfSubtreeList("linear_solver"))
     {
+        //! \ogs_file_param{prj__linear_solvers__linear_solver__name}
         auto const name = conf.getConfParam<std::string>("name");
         BaseLib::insertIfKeyUniqueElseError(_linear_solvers,
             name,
@@ -350,12 +364,15 @@ void ProjectData::parseNonlinearSolvers(BaseLib::ConfigTree const& config)
 {
     DBUG("Reading linear solver configuration.");
 
+    //! \ogs_file_param{prj__nonlinear_solvers__nonlinear_solver}
     for (auto conf : config.getConfSubtreeList("nonlinear_solver"))
     {
+        //! \ogs_file_param{prj__nonlinear_solvers__nonlinear_solver__linear_solver}
         auto const ls_name = conf.getConfParam<std::string>("linear_solver");
         auto& linear_solver = BaseLib::getOrError(_linear_solvers,
             ls_name, "A linear solver with the given name does not exist.");
 
+        //! \ogs_file_param{prj__nonlinear_solvers__nonlinear_solver__name}
         auto const name = conf.getConfParam<std::string>("name");
         BaseLib::insertIfKeyUniqueElseError(_nonlinear_solvers,
             name,
@@ -368,7 +385,9 @@ void ProjectData::parseNonlinearSolvers(BaseLib::ConfigTree const& config)
 static std::unique_ptr<MathLib::PiecewiseLinearInterpolation>
 createPiecewiseLinearInterpolation(BaseLib::ConfigTree const& config)
 {
+    //! \ogs_file_param{prj__curves__curve__coords}
     auto coords = config.getConfParam<std::vector<double>>("coords");
+    //! \ogs_file_param{prj__curves__curve__values}
     auto values = config.getConfParam<std::vector<double>>("values");
     if (coords.empty() || values.empty())
     {
@@ -393,8 +412,10 @@ void ProjectData::parseCurves(
 
     DBUG("Reading curves configuration.");
 
+    //! \ogs_file_param{prj__curves__curve}
     for (auto conf : config->getConfSubtreeList("curve"))
     {
+        //! \ogs_file_param{prj__curves__curve__name}
         auto const name = conf.getConfParam<std::string>("name");
         BaseLib::insertIfKeyUniqueElseError(
             _curves,
diff --git a/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h b/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h
index 0fd8e68dd137a407e194e2da9e9d2a4e7c52ccda..0a14ed9db546ac161537f3779cfb789be0386256 100644
--- a/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h
+++ b/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h
@@ -231,6 +231,7 @@ template<typename Matrix, typename Vector>
 std::unique_ptr<UncoupledProcessesTimeLoop<Matrix, Vector> >
 createUncoupledProcessesTimeLoop(BaseLib::ConfigTree const& conf)
 {
+    //! \ogs_file_param{prj__time_stepping__type}
     auto const type = conf.peekConfParam<std::string>("type");
 
     std::unique_ptr<NumLib::ITimeStepAlgorithm> timestepper;
diff --git a/Documentation/AllKnownProjectParameters.dox b/Documentation/AllKnownProjectParameters.dox
new file mode 100644
index 0000000000000000000000000000000000000000..e00a2bbd7b70eab571bf7c33aad1407582598cbb
--- /dev/null
+++ b/Documentation/AllKnownProjectParameters.dox
@@ -0,0 +1,7 @@
+/*! \page ogs_file_param List of all known OGS input file parameters
+ *
+ * Some additional information...
+ *
+ * This list is automatically generated by Doxygen.
+ *
+ */
diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
index 8cc617d58bdac18b7c5e5519983ece878b94f395..c81185b4f896bd8d54aa7e2d8ce68d4c9fc32cf1 100644
--- a/Documentation/Doxyfile.in
+++ b/Documentation/Doxyfile.in
@@ -239,6 +239,11 @@ TAB_SIZE               = 4
 # newlines.
 
 ALIASES                = "per{1} = \1<sup>-1</sup>"
+ALIASES                += "ogs_file_param{1} = \xrefitem ogs_file_param \"Input File Parameter\" \"List of all Input File Parameters\" \ref ogs_file_param__\1 \"\1\""
+ALIASES                += "ogs_file_attr{1} = \xrefitem ogs_file_param \"Input File Parameter\" \"List of all Input File Parameters\" \ref ogs_file_attr__\1 \"\1\""
+ALIASES                += "ogs_file_special = \xrefitem ogs_file_param \"Input File Parameter\" \"List of all Input File Parameters\" special OGS input file parameter"
+ALIASES                += "ogs_file_param_special{1} = \xrefitem ogs_file_param \"Input File Parameter\" \"List of all Input File Parameters\" \ref ogs_file_param__\1 \"\1\""
+ALIASES                += "ogs_file_attr_special{1} = \xrefitem ogs_file_param \"Input File Parameter\" \"List of all Input File Parameters\" \ref ogs_file_attr__\1 \"\1\""
 
 # This tag can be used to specify a number of word-keyword mappings (TCL only).
 # A mapping has the form "name=value". For example adding "class=itcl::class"
@@ -775,7 +780,8 @@ WARN_LOGFILE           =
 # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = ${CMAKE_SOURCE_DIR}/
+INPUT                  = ${CMAKE_SOURCE_DIR}/ \
+                         ${CMAKE_BINARY_DIR}/DocAux/dox
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -820,7 +826,8 @@ RECURSIVE              = YES
 
 EXCLUDE                = ${CMAKE_SOURCE_DIR}/ThirdParty \
                          ${CMAKE_SOURCE_DIR}/scripts \
-                         ${CMAKE_SOURCE_DIR}/Tests
+                         ${CMAKE_SOURCE_DIR}/Tests \
+                         ${CMAKE_SOURCE_DIR}/Documentation/ProjectFile
 
 # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
 # directories that are symbolic links (a Unix file system feature) are excluded
diff --git a/Documentation/ProjectFile/boundary_condition/UniformDirichlet/c_UniformDirichlet.md b/Documentation/ProjectFile/boundary_condition/UniformDirichlet/c_UniformDirichlet.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/boundary_condition/UniformDirichlet/t_value.md b/Documentation/ProjectFile/boundary_condition/UniformDirichlet/t_value.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/boundary_condition/UniformDirichlet/t_value.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/boundary_condition/UniformNeumann/c_UniformNeumann.md b/Documentation/ProjectFile/boundary_condition/UniformNeumann/c_UniformNeumann.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/boundary_condition/UniformNeumann/t_value.md b/Documentation/ProjectFile/boundary_condition/UniformNeumann/t_value.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/boundary_condition/UniformNeumann/t_value.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/boundary_condition/c_boundary_condition.md b/Documentation/ProjectFile/boundary_condition/c_boundary_condition.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/boundary_condition/t_geometrical_set.md b/Documentation/ProjectFile/boundary_condition/t_geometrical_set.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/boundary_condition/t_geometrical_set.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/boundary_condition/t_geometry.md b/Documentation/ProjectFile/boundary_condition/t_geometry.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/boundary_condition/t_geometry.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/boundary_condition/t_type.md b/Documentation/ProjectFile/boundary_condition/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/boundary_condition/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/c_gml.md b/Documentation/ProjectFile/gml/c_gml.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/gml/points/i_points.md b/Documentation/ProjectFile/gml/points/i_points.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/points/i_points.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/points/point/a_id.md b/Documentation/ProjectFile/gml/points/point/a_id.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/points/point/a_id.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/points/point/a_name.md b/Documentation/ProjectFile/gml/points/point/a_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/points/point/a_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/points/point/a_x.md b/Documentation/ProjectFile/gml/points/point/a_x.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/points/point/a_x.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/points/point/a_y.md b/Documentation/ProjectFile/gml/points/point/a_y.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/points/point/a_y.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/points/point/a_z.md b/Documentation/ProjectFile/gml/points/point/a_z.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/points/point/a_z.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/points/point/i_point.md b/Documentation/ProjectFile/gml/points/point/i_point.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/points/point/i_point.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/polylines/i_polylines.md b/Documentation/ProjectFile/gml/polylines/i_polylines.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/polylines/i_polylines.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/polylines/polyline/a_id.md b/Documentation/ProjectFile/gml/polylines/polyline/a_id.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/polylines/polyline/a_id.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/polylines/polyline/a_name.md b/Documentation/ProjectFile/gml/polylines/polyline/a_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/polylines/polyline/a_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/polylines/polyline/i_polyline.md b/Documentation/ProjectFile/gml/polylines/polyline/i_polyline.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/polylines/polyline/i_polyline.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/polylines/polyline/t_pnt.md b/Documentation/ProjectFile/gml/polylines/polyline/t_pnt.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/polylines/polyline/t_pnt.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/i_surfaces.md b/Documentation/ProjectFile/gml/surfaces/i_surfaces.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/i_surfaces.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/surface/a_id.md b/Documentation/ProjectFile/gml/surfaces/surface/a_id.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/surface/a_id.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/surface/a_name.md b/Documentation/ProjectFile/gml/surfaces/surface/a_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/surface/a_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/surface/element/a_p1.md b/Documentation/ProjectFile/gml/surfaces/surface/element/a_p1.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/surface/element/a_p1.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/surface/element/a_p2.md b/Documentation/ProjectFile/gml/surfaces/surface/element/a_p2.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/surface/element/a_p2.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/surface/element/a_p3.md b/Documentation/ProjectFile/gml/surfaces/surface/element/a_p3.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/surface/element/a_p3.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/surface/element/i_element.md b/Documentation/ProjectFile/gml/surfaces/surface/element/i_element.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/surface/element/i_element.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/surfaces/surface/i_surface.md b/Documentation/ProjectFile/gml/surfaces/surface/i_surface.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/surfaces/surface/i_surface.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/gml/t_name.md b/Documentation/ProjectFile/gml/t_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/gml/t_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/i_ProjectFile.md b/Documentation/ProjectFile/i_ProjectFile.md
new file mode 100644
index 0000000000000000000000000000000000000000..1df80a33818bf707c52a64d8d981597384c7e788
--- /dev/null
+++ b/Documentation/ProjectFile/i_ProjectFile.md
@@ -0,0 +1,63 @@
+The OGS6 input file parameters are documented in the page hierarchy rooted here.
+
+Depending on the type of the parameters the corresponding page titles have
+different prefixes, namely:
+
+ - <b>[tag] </b> if the parameter is an XML tag in the input file<br>
+   Example: \ref ogs_file_param__prj__linear_solvers
+ - <b>[attr]</b> if the parameter is an attribute of an XML tag in the input
+   file<br>
+   Example: \ref ogs_file_attr__gml__points__point__x
+ - <b>[case]</b> either on the top level of the documentation tree, or to
+   distinguish between different cases (i.e., sets of configuration options,
+   which usually also means different underlying C++ types) in the input
+   file.<br>
+   Usually one can choose one of several cases by specifying the associated
+   <tt>&lt;type&gt;</tt> tag in the input file.<br>
+   Example: \ref ogs_file_param__linear_solver
+   and \ref ogs_file_param__parameter__Constant (<tt>&lt;type&gt;Constant&lt;/type&gt;</tt>)
+   vs. \ref ogs_file_param__parameter__MeshProperty (<tt>&lt;type&gt;MeshProperty&lt;/type&gt;</tt>)
+
+The input file parameters are documented within a tree structure (cf. the
+navigation tree on the left). This structure resembles the XML document tree of
+the input files, however, there are some small differences (see below).
+
+Currently two different input files are documented:
+The project file (\ref ogs_file_param__prj "prj")
+and the geometry file (\ref ogs_file_param__gml "gml").
+All other cases on the top level do not represent separate input files but
+rather are shortcuts to certain project file sections, which are provided only in
+order to keep the documentation tree flat, they have no other special meaning.
+
+A path in the documentation tree corresponds to a path in the prj or gml input
+file, e.g., \ref ogs_file_param__prj__process_variables__process_variable__boundary_conditions__boundary_condition
+corresponds to the path <tt>process_variables.process_variable.boundary_conditions.boundary_condition</tt>
+in the project file (here parent and child tags are separated by a dot).<br>
+Note: The top level XML tags (i.e., <tt>&lt;OpenGeoSysProject&gt;</tt> and <tt>&lt;OpenGeoSysGLI&gt;</tt>)
+have been omitted in the entire documentation for the sake of brevity.
+
+There are two exceptions to this rule, both related to the <em>[case]</em>
+prefix:
+ 1. Cases at the top level do not translate to XML tags. The cases
+    \ref ogs_file_param__prj and \ref ogs_file_param__gml mark the root of the
+    prj and gml input file, respectively.
+    All other top level cases, however, belong somewhere in the project file XML tree.
+    You can see where they belong in the <em>Additional Info</em> section of the [tag] and
+    [attr] pages, e.g., \ref ogs_file_param__boundary_condition__geometry of the
+    boundary condition has the full XML tag path
+    <tt>process_variables.process_variable.boundary_conditions.boundary_condition.geometry</tt>.
+ 2. Cases that distinguish types do not translate to XML tags either.
+    They enclose a set of configuration settings that can be used at that specific point.<br>
+    Example: There is a \ref ogs_file_param__initial_condition__MeshProperty "MeshProperty"
+    initial condition, which has a
+    \ref ogs_file_param__initial_condition__MeshProperty__field_name "field_name" tag.
+    I.e., if you select the MeshProperty IC, you can (or must) specify the XML tag
+    with the path <tt>process_variables.process_variable.initial_condition.field_name</tt>
+    in the project file.<br>
+    The MeshProperty IC can be selected by setting the
+    \ref ogs_file_param__initial_condition__type "process_variables.process_variable.initial_condition.type" tag to
+    <tt>MeshProperty</tt>.
+
+# Further Information
+
+ - \subpage ogs_file_param
diff --git a/Documentation/ProjectFile/initial_condition/MeshProperty/c_MeshProperty.md b/Documentation/ProjectFile/initial_condition/MeshProperty/c_MeshProperty.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/initial_condition/MeshProperty/c_MeshProperty.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/initial_condition/MeshProperty/t_field_name.md b/Documentation/ProjectFile/initial_condition/MeshProperty/t_field_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/initial_condition/MeshProperty/t_field_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/initial_condition/Uniform/c_Uniform.md b/Documentation/ProjectFile/initial_condition/Uniform/c_Uniform.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/initial_condition/Uniform/c_Uniform.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/initial_condition/Uniform/t_value.md b/Documentation/ProjectFile/initial_condition/Uniform/t_value.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/initial_condition/Uniform/t_value.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/initial_condition/c_initial_condition.md b/Documentation/ProjectFile/initial_condition/c_initial_condition.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/initial_condition/t_type.md b/Documentation/ProjectFile/initial_condition/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/initial_condition/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/c_linear_solver.md b/Documentation/ProjectFile/linear_solver/c_linear_solver.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/linear_solver/eigen/i_eigen.md b/Documentation/ProjectFile/linear_solver/eigen/i_eigen.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/eigen/i_eigen.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/eigen/t_error_tolerance.md b/Documentation/ProjectFile/linear_solver/eigen/t_error_tolerance.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/eigen/t_error_tolerance.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/eigen/t_max_iteration_step.md b/Documentation/ProjectFile/linear_solver/eigen/t_max_iteration_step.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/eigen/t_max_iteration_step.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/eigen/t_precon_type.md b/Documentation/ProjectFile/linear_solver/eigen/t_precon_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/eigen/t_precon_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/eigen/t_solver_type.md b/Documentation/ProjectFile/linear_solver/eigen/t_solver_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/eigen/t_solver_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/petsc/i_petsc.md b/Documentation/ProjectFile/linear_solver/petsc/i_petsc.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/petsc/i_petsc.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/petsc/t_parameters.md b/Documentation/ProjectFile/linear_solver/petsc/t_parameters.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/petsc/t_parameters.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/petsc/t_prefix.md b/Documentation/ProjectFile/linear_solver/petsc/t_prefix.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/petsc/t_prefix.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/linear_solver/t_lis.md b/Documentation/ProjectFile/linear_solver/t_lis.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/linear_solver/t_lis.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/materials/adsorption/c_adsorption.md b/Documentation/ProjectFile/materials/adsorption/c_adsorption.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/materials/adsorption/reaction/CaOH2/c_CaOH2.md b/Documentation/ProjectFile/materials/adsorption/reaction/CaOH2/c_CaOH2.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/materials/adsorption/reaction/CaOH2/c_CaOH2.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/materials/adsorption/reaction/CaOH2/t_ode_solver_config.md b/Documentation/ProjectFile/materials/adsorption/reaction/CaOH2/t_ode_solver_config.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/materials/adsorption/reaction/CaOH2/t_ode_solver_config.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/materials/adsorption/reaction/Sinusoidal/c_Sinusoidal.md b/Documentation/ProjectFile/materials/adsorption/reaction/Sinusoidal/c_Sinusoidal.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/materials/adsorption/reaction/Sinusoidal/c_Sinusoidal.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/materials/adsorption/reaction/Sinusoidal/t_reaction_enthalpy.md b/Documentation/ProjectFile/materials/adsorption/reaction/Sinusoidal/t_reaction_enthalpy.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/materials/adsorption/reaction/Sinusoidal/t_reaction_enthalpy.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/materials/adsorption/reaction/i_reaction.md b/Documentation/ProjectFile/materials/adsorption/reaction/i_reaction.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/materials/adsorption/reaction/i_reaction.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/materials/adsorption/reaction/t_type.md b/Documentation/ProjectFile/materials/adsorption/reaction/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/materials/adsorption/reaction/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/materials/c_materials.md b/Documentation/ProjectFile/materials/c_materials.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/ode_solver/CVODE/c_CVODE.md b/Documentation/ProjectFile/ode_solver/CVODE/c_CVODE.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/ode_solver/CVODE/c_CVODE.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/ode_solver/CVODE/t_linear_multistep_method.md b/Documentation/ProjectFile/ode_solver/CVODE/t_linear_multistep_method.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/ode_solver/CVODE/t_linear_multistep_method.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/ode_solver/CVODE/t_nonlinear_solver_iteration.md b/Documentation/ProjectFile/ode_solver/CVODE/t_nonlinear_solver_iteration.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/ode_solver/CVODE/t_nonlinear_solver_iteration.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/ode_solver/c_ode_solver.md b/Documentation/ProjectFile/ode_solver/c_ode_solver.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/parameter/Constant/c_Constant.md b/Documentation/ProjectFile/parameter/Constant/c_Constant.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/parameter/Constant/c_Constant.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/parameter/Constant/t_value.md b/Documentation/ProjectFile/parameter/Constant/t_value.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/parameter/Constant/t_value.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/parameter/MeshProperty/c_MeshProperty.md b/Documentation/ProjectFile/parameter/MeshProperty/c_MeshProperty.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/parameter/MeshProperty/c_MeshProperty.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/parameter/MeshProperty/t_field_name.md b/Documentation/ProjectFile/parameter/MeshProperty/t_field_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/parameter/MeshProperty/t_field_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/parameter/c_parameter.md b/Documentation/ProjectFile/parameter/c_parameter.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/parameter/c_parameter.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/parameter/t_name.md b/Documentation/ProjectFile/parameter/t_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/parameter/t_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/parameter/t_type.md b/Documentation/ProjectFile/parameter/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/parameter/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/c_prj.md b/Documentation/ProjectFile/prj/c_prj.md
new file mode 100644
index 0000000000000000000000000000000000000000..c660f3bf6064518eb68b8e1290ad151293f4711f
--- /dev/null
+++ b/Documentation/ProjectFile/prj/c_prj.md
@@ -0,0 +1 @@
+OGS project file documentation
diff --git a/Documentation/ProjectFile/prj/curves/curve/i_curve.md b/Documentation/ProjectFile/prj/curves/curve/i_curve.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/prj/curves/curve/t_coords.md b/Documentation/ProjectFile/prj/curves/curve/t_coords.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/prj/curves/curve/t_name.md b/Documentation/ProjectFile/prj/curves/curve/t_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/curves/curve/t_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/curves/curve/t_values.md b/Documentation/ProjectFile/prj/curves/curve/t_values.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/prj/curves/i_curves.md b/Documentation/ProjectFile/prj/curves/i_curves.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/prj/linear_solvers/i_linear_solvers.md b/Documentation/ProjectFile/prj/linear_solvers/i_linear_solvers.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/linear_solvers/i_linear_solvers.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/linear_solvers/linear_solver/i_linear_solver.md b/Documentation/ProjectFile/prj/linear_solvers/linear_solver/i_linear_solver.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/linear_solvers/linear_solver/i_linear_solver.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/linear_solvers/linear_solver/t_name.md b/Documentation/ProjectFile/prj/linear_solvers/linear_solver/t_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/linear_solvers/linear_solver/t_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/nonlinear_solvers/i_nonlinear_solvers.md b/Documentation/ProjectFile/prj/nonlinear_solvers/i_nonlinear_solvers.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/nonlinear_solvers/i_nonlinear_solvers.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/i_nonlinear_solver.md b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/i_nonlinear_solver.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/i_nonlinear_solver.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_linear_solver.md b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_linear_solver.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_linear_solver.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_max_iter.md b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_max_iter.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_max_iter.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_name.md b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_tol.md b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_tol.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_tol.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_type.md b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/nonlinear_solvers/nonlinear_solver/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/output/i_output.md b/Documentation/ProjectFile/prj/output/i_output.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/output/i_output.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/output/t_prefix.md b/Documentation/ProjectFile/prj/output/t_prefix.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/output/t_prefix.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/output/t_type.md b/Documentation/ProjectFile/prj/output/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/output/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/output/timesteps/i_timesteps.md b/Documentation/ProjectFile/prj/output/timesteps/i_timesteps.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/output/timesteps/i_timesteps.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/output/timesteps/pair/i_pair.md b/Documentation/ProjectFile/prj/output/timesteps/pair/i_pair.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/output/timesteps/pair/i_pair.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/output/timesteps/pair/t_each_steps.md b/Documentation/ProjectFile/prj/output/timesteps/pair/t_each_steps.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/output/timesteps/pair/t_each_steps.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/output/timesteps/pair/t_repeat.md b/Documentation/ProjectFile/prj/output/timesteps/pair/t_repeat.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/output/timesteps/pair/t_repeat.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/parameters/i_parameters.md b/Documentation/ProjectFile/prj/parameters/i_parameters.md
new file mode 100644
index 0000000000000000000000000000000000000000..f393806a1c1a950d8d62c58955e880aea203ff87
--- /dev/null
+++ b/Documentation/ProjectFile/prj/parameters/i_parameters.md
@@ -0,0 +1,2 @@
+
+List of parameters...
diff --git a/Documentation/ProjectFile/prj/parameters/parameter/i_parameter.md b/Documentation/ProjectFile/prj/parameters/parameter/i_parameter.md
new file mode 100644
index 0000000000000000000000000000000000000000..70f14b67e8152b18b416449df554075d2f8c6d69
--- /dev/null
+++ b/Documentation/ProjectFile/prj/parameters/parameter/i_parameter.md
@@ -0,0 +1,2 @@
+
+Info about parameters.parameter...
diff --git a/Documentation/ProjectFile/prj/process_variables/i_process_variables.md b/Documentation/ProjectFile/prj/process_variables/i_process_variables.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/process_variables/i_process_variables.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/i_boundary_conditions.md b/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/i_boundary_conditions.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/i_boundary_conditions.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/t_boundary_condition.md b/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/t_boundary_condition.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/process_variables/process_variable/boundary_conditions/t_boundary_condition.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/process_variables/process_variable/i_process_variable.md b/Documentation/ProjectFile/prj/process_variables/process_variable/i_process_variable.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/process_variables/process_variable/i_process_variable.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/process_variables/process_variable/t_components.md b/Documentation/ProjectFile/prj/process_variables/process_variable/t_components.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/process_variables/process_variable/t_components.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/process_variables/process_variable/t_initial_condition.md b/Documentation/ProjectFile/prj/process_variables/process_variable/t_initial_condition.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/process_variables/process_variable/t_initial_condition.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/process_variables/process_variable/t_name.md b/Documentation/ProjectFile/prj/process_variables/process_variable/t_name.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/process_variables/process_variable/t_name.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/processes/i_processes.md b/Documentation/ProjectFile/prj/processes/i_processes.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/processes/i_processes.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/processes/t_process.md b/Documentation/ProjectFile/prj/processes/t_process.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/processes/t_process.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/t_geometry.md b/Documentation/ProjectFile/prj/t_geometry.md
new file mode 100644
index 0000000000000000000000000000000000000000..f1ddc3cf01bead61d4c7fee6463e664b51daa865
--- /dev/null
+++ b/Documentation/ProjectFile/prj/t_geometry.md
@@ -0,0 +1 @@
+Info about geometry...
diff --git a/Documentation/ProjectFile/prj/t_mesh.md b/Documentation/ProjectFile/prj/t_mesh.md
new file mode 100644
index 0000000000000000000000000000000000000000..b7cefacbd935d4a60c4babf706aec64b51648a88
--- /dev/null
+++ b/Documentation/ProjectFile/prj/t_mesh.md
@@ -0,0 +1 @@
+Info about mesh...
diff --git a/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/i_FixedTimeStepping.md b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/i_FixedTimeStepping.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/i_FixedTimeStepping.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/t_t_end.md b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/t_t_end.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/t_t_end.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/t_t_initial.md b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/t_t_initial.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/t_t_initial.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/i_timesteps.md b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/i_timesteps.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/i_timesteps.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/i_pair.md b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/i_pair.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/i_pair.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/t_delta_t.md b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/t_delta_t.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/t_delta_t.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/t_repeat.md b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/t_repeat.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/FixedTimeStepping/timesteps/pair/t_repeat.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/i_time_stepping.md b/Documentation/ProjectFile/prj/time_stepping/i_time_stepping.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/i_time_stepping.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/prj/time_stepping/t_type.md b/Documentation/ProjectFile/prj/time_stepping/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/prj/time_stepping/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/c_GROUNDWATER_FLOW.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/c_GROUNDWATER_FLOW.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/process_variables/i_process_variables.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/process_variables/i_process_variables.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/process_variables/i_process_variables.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/process_variables/t_process_variable.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/process_variables/t_process_variable.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/process_variables/t_process_variable.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/i_secondary_variables.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/i_secondary_variables.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/i_secondary_variables.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_x.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_x.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_x.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_y.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_y.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_y.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_z.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_z.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/secondary_variables/t_darcy_velocity_z.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/GROUNDWATER_FLOW/t_hydraulic_conductivity.md b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/t_hydraulic_conductivity.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/GROUNDWATER_FLOW/t_hydraulic_conductivity.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/c_process.md b/Documentation/ProjectFile/process/c_process.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/c_process.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/output/i_output.md b/Documentation/ProjectFile/process/output/i_output.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/output/i_output.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/output/t_output_iteration_results.md b/Documentation/ProjectFile/process/output/t_output_iteration_results.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/output/t_output_iteration_results.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/output/variables/i_variables.md b/Documentation/ProjectFile/process/output/variables/i_variables.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/output/variables/i_variables.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/output/variables/t_variable.md b/Documentation/ProjectFile/process/output/variables/t_variable.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/output/variables/t_variable.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/t_nonlinear_solver.md b/Documentation/ProjectFile/process/t_nonlinear_solver.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/t_nonlinear_solver.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/t_process_variables.md b/Documentation/ProjectFile/process/t_process_variables.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/t_process_variables.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/t_secondary_variables.md b/Documentation/ProjectFile/process/t_secondary_variables.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/t_secondary_variables.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/t_type.md b/Documentation/ProjectFile/process/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/time_discretization/BackwardDifferentiationFormula/c_BackwardDifferentiationFormula.md b/Documentation/ProjectFile/process/time_discretization/BackwardDifferentiationFormula/c_BackwardDifferentiationFormula.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/time_discretization/BackwardDifferentiationFormula/c_BackwardDifferentiationFormula.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/time_discretization/BackwardDifferentiationFormula/t_order.md b/Documentation/ProjectFile/process/time_discretization/BackwardDifferentiationFormula/t_order.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/time_discretization/BackwardDifferentiationFormula/t_order.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/time_discretization/CrankNicolson/c_CrankNicolson.md b/Documentation/ProjectFile/process/time_discretization/CrankNicolson/c_CrankNicolson.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/time_discretization/CrankNicolson/c_CrankNicolson.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/time_discretization/CrankNicolson/t_theta.md b/Documentation/ProjectFile/process/time_discretization/CrankNicolson/t_theta.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/time_discretization/CrankNicolson/t_theta.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/time_discretization/i_time_discretization.md b/Documentation/ProjectFile/process/time_discretization/i_time_discretization.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/time_discretization/i_time_discretization.md
@@ -0,0 +1 @@
+\todo document
diff --git a/Documentation/ProjectFile/process/time_discretization/t_type.md b/Documentation/ProjectFile/process/time_discretization/t_type.md
new file mode 100644
index 0000000000000000000000000000000000000000..bbf877d784159e752987c7cd00e4f6590d864bf7
--- /dev/null
+++ b/Documentation/ProjectFile/process/time_discretization/t_type.md
@@ -0,0 +1 @@
+\todo document
diff --git a/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp b/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp
index c093eb6171e31afc77a50286ae93fed0ffefa39d..6c476c09d98132b43f4f996add767f9be952e85d 100644
--- a/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp
+++ b/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp
@@ -57,6 +57,7 @@ bool BoostXmlGmlInterface::readFile(const std::string &fname)
     std::unique_ptr<MapNameId> ply_names{new MapNameId};
     std::unique_ptr<MapNameId> sfc_names{new MapNameId};
 
+    //! \ogs_file_param{gml__name}
     auto geo_name = doc->getConfParam<std::string>("name");
     if (geo_name.empty())
     {
@@ -64,12 +65,14 @@ bool BoostXmlGmlInterface::readFile(const std::string &fname)
         std::abort();
     }
 
+    //! \ogs_file_param{gml__points}
     for (auto st : doc->getConfSubtreeList("points"))
     {
         readPoints(st, *points, *pnt_names);
         _geo_objects.addPointVec(std::move(points), geo_name, pnt_names.release());
     }
 
+    //! \ogs_file_param{gml__polylines}
     for (auto st : doc->getConfSubtreeList("polylines"))
     {
         readPolylines(st,
@@ -79,6 +82,7 @@ bool BoostXmlGmlInterface::readFile(const std::string &fname)
                       *ply_names);
     }
 
+    //! \ogs_file_param{gml__surfaces}
     for (auto st : doc->getConfSubtreeList("surfaces"))
     {
         readSurfaces(st,
@@ -103,11 +107,16 @@ void BoostXmlGmlInterface::readPoints(BaseLib::ConfigTree const& pointsRoot,
                                       std::vector<GeoLib::Point*>& points,
                                       std::map<std::string, std::size_t>& pnt_names )
 {
+    //! \ogs_file_param{gml__points__point}
     for (auto const pt : pointsRoot.getConfParamList("point"))
     {
+        //! \ogs_file_attr{gml__points__point__id}
         auto const p_id = pt.getConfAttribute<std::size_t>("id");
+        //! \ogs_file_attr{gml__points__point__x}
         auto const p_x  = pt.getConfAttribute<double>("x");
+        //! \ogs_file_attr{gml__points__point__y}
         auto const p_y  = pt.getConfAttribute<double>("y");
+        //! \ogs_file_attr{gml__points__point__z}
         auto const p_z  = pt.getConfAttribute<double>("z");
 
         auto const p_size = points.size();
@@ -115,6 +124,7 @@ void BoostXmlGmlInterface::readPoints(BaseLib::ConfigTree const& pointsRoot,
             "The point id is not unique.");
         points.push_back(new GeoLib::Point(p_x, p_y, p_z, p_id));
 
+        //! \ogs_file_attr{gml__points__point__name}
         if (auto const p_name = pt.getConfAttributeOptional<std::string>("name"))
         {
             if (p_name->empty()) {
@@ -135,8 +145,10 @@ void BoostXmlGmlInterface::readPolylines(
     std::vector<std::size_t> const& pnt_id_map,
     std::map<std::string, std::size_t>& ply_names)
 {
+    //! \ogs_file_param{gml__polylines__polyline}
     for (auto const pl : polylinesRoot.getConfSubtreeList("polyline"))
     {
+        //! \ogs_file_attr{gml__polylines__polyline__id}
         auto const id = pl.getConfAttribute<std::size_t>("id");
         // The id is not used but must be present in the GML file.
         // That's why pl.ignore...() cannot be used.
@@ -144,6 +156,7 @@ void BoostXmlGmlInterface::readPolylines(
 
         polylines.push_back(new GeoLib::Polyline(points));
 
+        //! \ogs_file_attr{gml__polylines__polyline__name}
         if (auto const p_name = pl.getConfAttributeOptional<std::string>("name"))
         {
             if (p_name->empty()) {
@@ -154,6 +167,7 @@ void BoostXmlGmlInterface::readPolylines(
             BaseLib::insertIfKeyUniqueElseError(ply_names, *p_name, polylines.size()-1,
                 "The polyline name is not unique.");
 
+            //! \ogs_file_param{gml__polylines__polyline__pnt}
             for (auto const pt : pl.getConfParamList<std::size_t>("pnt")) {
                 polylines.back()->addPoint(pnt_id_map[_idx_map[pt]]);
             }
@@ -173,14 +187,17 @@ void BoostXmlGmlInterface::readSurfaces(
     const std::vector<std::size_t>& pnt_id_map,
     std::map<std::string, std::size_t>& sfc_names)
 {
+    //! \ogs_file_param{gml__surfaces__surface}
     for (auto const& sfc : surfacesRoot.getConfSubtreeList("surface"))
     {
+        //! \ogs_file_attr{gml__surfaces__surface__id}
         auto const id = sfc.getConfAttribute<std::size_t>("id");
         // The id is not used but must be present in the GML file.
         // That's why sfc.ignore...() cannot be used.
         (void) id;
         surfaces.push_back(new GeoLib::Surface(points));
 
+        //! \ogs_file_attr{gml__surfaces__surface__name}
         if (auto const s_name = sfc.getConfAttributeOptional<std::string>("name"))
         {
             if (s_name->empty()) {
@@ -191,9 +208,13 @@ void BoostXmlGmlInterface::readSurfaces(
             BaseLib::insertIfKeyUniqueElseError(sfc_names, *s_name, surfaces.size()-1,
                 "The surface name is not unique.");
 
+            //! \ogs_file_param{gml__surfaces__surface__element}
             for (auto const& element : sfc.getConfParamList("element")) {
+                //! \ogs_file_attr{gml__surfaces__surface__element__p1}
                 auto const p1_attr = element.getConfAttribute<std::size_t>("p1");
+                //! \ogs_file_attr{gml__surfaces__surface__element__p2}
                 auto const p2_attr = element.getConfAttribute<std::size_t>("p2");
+                //! \ogs_file_attr{gml__surfaces__surface__element__p3}
                 auto const p3_attr = element.getConfAttribute<std::size_t>("p3");
 
                 auto const p1 = pnt_id_map[_idx_map[p1_attr]];
diff --git a/MaterialsLib/Adsorption/Reaction.cpp b/MaterialsLib/Adsorption/Reaction.cpp
index 7f08aab83a18c8d3d0ff5ad3984c4614447c7a5e..0a571b1ba3b540cc6ff3b2d3ce23161f82893410 100644
--- a/MaterialsLib/Adsorption/Reaction.cpp
+++ b/MaterialsLib/Adsorption/Reaction.cpp
@@ -32,6 +32,7 @@ std::unique_ptr<Reaction>
 Reaction::
 newInstance(BaseLib::ConfigTree const& conf)
 {
+    //! \ogs_file_param{materials__adsorption__reaction__type}
     auto const type = conf.getConfParam<std::string>("type");
 
     if (type == "Z13XBF")
diff --git a/MaterialsLib/Adsorption/ReactionCaOH2.h b/MaterialsLib/Adsorption/ReactionCaOH2.h
index dba2d1b7a0820fa0df40d9ac31e007a7b8366423..bb60d3170b43a3fa19662ced899b66df8cd8e3be 100644
--- a/MaterialsLib/Adsorption/ReactionCaOH2.h
+++ b/MaterialsLib/Adsorption/ReactionCaOH2.h
@@ -26,8 +26,9 @@ namespace Adsorption
 class ReactionCaOH2 final : public Reaction
 {
 public:
-    explicit ReactionCaOH2(BaseLib::ConfigTree const& conf)
-        : _ode_solver_config{conf.getConfSubtree("ode_solver_config")}
+    explicit ReactionCaOH2(BaseLib::ConfigTree const& conf) :
+        //! \ogs_file_param{materials__adsorption__reaction__CaOH2__ode_solver_config}
+        _ode_solver_config{conf.getConfSubtree("ode_solver_config")}
     {}
 
     double getEnthalpy(const double /*p_Ads*/, const double /*T_Ads*/,
diff --git a/MaterialsLib/Adsorption/ReactionSinusoidal.h b/MaterialsLib/Adsorption/ReactionSinusoidal.h
index 9fb4bb98abf30daba41ec6ee659776fce5d29b50..42415991a39e1afec229368819d84f67f313bf6b 100644
--- a/MaterialsLib/Adsorption/ReactionSinusoidal.h
+++ b/MaterialsLib/Adsorption/ReactionSinusoidal.h
@@ -21,8 +21,9 @@ namespace Adsorption
 class ReactionSinusoidal final : public Reaction
 {
 public:
-    explicit ReactionSinusoidal(BaseLib::ConfigTree const& conf)
-        : _enthalpy(conf.getConfParam<double>("reaction_enthalpy"))
+    explicit ReactionSinusoidal(BaseLib::ConfigTree const& conf) :
+        //! \ogs_file_param{materials__adsorption__reaction__Sinusoidal__reaction_enthalpy}
+        _enthalpy(conf.getConfParam<double>("reaction_enthalpy"))
     {
     }
 
diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index 2cada257341543c6d3a3d56ca0a13bc19abf6a4a..e519610b7dcdd1277e263a9caad823d060810ab1 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
@@ -143,19 +143,24 @@ EigenLinearSolver::~EigenLinearSolver() = default;
 void EigenLinearSolver::setOption(BaseLib::ConfigTree const& option)
 {
     ignoreOtherLinearSolvers(option, "eigen");
+    //! \ogs_file_param{linear_solver__eigen}
     auto const ptSolver = option.getConfSubtreeOptional("eigen");
     if (!ptSolver)
         return;
 
+    //! \ogs_file_param{linear_solver__eigen__solver_type}
     if (auto solver_type = ptSolver->getConfParamOptional<std::string>("solver_type")) {
         _option.solver_type = _option.getSolverType(*solver_type);
     }
+    //! \ogs_file_param{linear_solver__eigen__precon_type}
     if (auto precon_type = ptSolver->getConfParamOptional<std::string>("precon_type")) {
         _option.precon_type = _option.getPreconType(*precon_type);
     }
+    //! \ogs_file_param{linear_solver__eigen__error_tolerance}
     if (auto error_tolerance = ptSolver->getConfParamOptional<double>("error_tolerance")) {
         _option.error_tolerance = *error_tolerance;
     }
+    //! \ogs_file_param{linear_solver__eigen__max_iteration_step}
     if (auto max_iteration_step = ptSolver->getConfParamOptional<int>("max_iteration_step")) {
         _option.max_iterations = *max_iteration_step;
     }
diff --git a/MathLib/LinAlg/Lis/LisOption.h b/MathLib/LinAlg/Lis/LisOption.h
index 37e3822f133b7f4f8685f3a62debf308c6f39cb6..e2f6c5309a11d604175703182cf7f7816377f563 100644
--- a/MathLib/LinAlg/Lis/LisOption.h
+++ b/MathLib/LinAlg/Lis/LisOption.h
@@ -44,6 +44,7 @@ struct LisOption
     {
         if (options) {
             ignoreOtherLinearSolvers(*options, "lis");
+            //! \ogs_file_param{linear_solver__lis}
             if (auto s = options->getConfParamOptional<std::string>("lis")) {
                 if (!s->empty()) {
                     _option_string += " " + *s;
diff --git a/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp b/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp
index 9a93ddd4859728fe77f823f470f6a19e9c966ac1..bf9dd80db7f650ba1208c28265c7f0df31bc9e09 100644
--- a/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp
+++ b/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp
@@ -33,13 +33,16 @@ PETScLinearSolver::PETScLinearSolver(const std::string /*prefix*/,
     if (option) {
         ignoreOtherLinearSolvers(*option, "petsc");
 
+        //! \ogs_file_param{linear_solver__petsc}
         if (auto const subtree = option->getConfSubtreeOptional("petsc"))
         {
-            if (auto const parameters = subtree->getConfParamOptional<std::string>(
-                    "parameters")) {
+            if (auto const parameters =
+                //! \ogs_file_param{linear_solver__petsc__parameters}
+                subtree->getConfParamOptional<std::string>("parameters")) {
                 petsc_options = *parameters;
             }
 
+            //! \ogs_file_param{linear_solver__petsc__prefix}
             if (auto const pre = subtree->getConfParamOptional<std::string>("prefix")) {
                 if (!pre->empty())
                     prefix = *pre + "_";
diff --git a/MathLib/ODE/CVodeSolver.cpp b/MathLib/ODE/CVodeSolver.cpp
index 23279fe46f10f7c633a31b4443cea7f00b8d6d9a..97112d43b16a1923f1e58b6e1aa2112182985bcf 100644
--- a/MathLib/ODE/CVodeSolver.cpp
+++ b/MathLib/ODE/CVodeSolver.cpp
@@ -133,7 +133,8 @@ CVodeSolverImpl::CVodeSolverImpl(const BaseLib::ConfigTree& config,
                                  const unsigned num_equations)
 {
     if (auto const param =
-            config.getConfParamOptional<std::string>("linear_multistep_method"))
+        //! \ogs_file_param{ode_solver__CVODE__linear_multistep_method}
+        config.getConfParamOptional<std::string>("linear_multistep_method"))
     {
         DBUG("setting linear multistep method (config: %s)", param->c_str());
 
@@ -152,8 +153,9 @@ CVodeSolverImpl::CVodeSolverImpl(const BaseLib::ConfigTree& config,
         }
     }
 
-    if (auto const param = config.getConfParamOptional<std::string>(
-            "nonlinear_solver_iteration"))
+    if (auto const param =
+        //! \ogs_file_param{ode_solver__CVODE__nonlinear_solver_iteration}
+        config.getConfParamOptional<std::string>("nonlinear_solver_iteration"))
     {
         DBUG("setting nonlinear solver iteration (config: %s)", param->c_str());
 
diff --git a/NumLib/ODESolver/NonlinearSolver-impl.h b/NumLib/ODESolver/NonlinearSolver-impl.h
index 1d356d06e89c9dd8f43bc1abfed7f8da3e83b8ba..6edfa7f3295ca5508f94c8bdd40687823fdcbc5b 100644
--- a/NumLib/ODESolver/NonlinearSolver-impl.h
+++ b/NumLib/ODESolver/NonlinearSolver-impl.h
@@ -262,8 +262,11 @@ createNonlinearSolver(MathLib::LinearSolver<Matrix, Vector>& linear_solver,
 {
     using AbstractNLS = NonlinearSolverBase<Matrix, Vector>;
 
+    //! \ogs_file_param{prj__nonlinear_solvers__nonlinear_solver__type}
     auto const type      = config.getConfParam<std::string>("type");
+    //! \ogs_file_param{prj__nonlinear_solvers__nonlinear_solver__tol}
     auto const tol       = config.getConfParam<double>("tol");
+    //! \ogs_file_param{prj__nonlinear_solvers__nonlinear_solver__max_iter}
     auto const max_iter  = config.getConfParam<unsigned>("max_iter");
 
     if (type == "Picard")
diff --git a/NumLib/ODESolver/TimeDiscretizationBuilder.h b/NumLib/ODESolver/TimeDiscretizationBuilder.h
index 5e8d5a8751801992c83dfdc591073389615673a7..7acda0aea8b4e24e33418de0e3699a36748048df 100644
--- a/NumLib/ODESolver/TimeDiscretizationBuilder.h
+++ b/NumLib/ODESolver/TimeDiscretizationBuilder.h
@@ -24,6 +24,7 @@ createTimeDiscretization(BaseLib::ConfigTree const& config)
 {
     using T = std::unique_ptr<TimeDiscretization<Vector> >;
 
+    //! \ogs_file_param{process__time_discretization__type}
     auto const type = config.getConfParam<std::string>("type");
 
     if (type == "BackwardEuler") {
@@ -33,10 +34,12 @@ createTimeDiscretization(BaseLib::ConfigTree const& config)
         using ConcreteTD = ForwardEuler<Vector>;
         return T(new ConcreteTD);
     } else if (type == "CrankNicolson") {
+        //! \ogs_file_param{process__time_discretization__CrankNicolson__theta}
         auto const theta = config.getConfParam<double>("theta");
         using ConcreteTD = CrankNicolson<Vector>;
         return T(new ConcreteTD(theta));
     } else if (type == "BackwardDifferentiationFormula") {
+        //! \ogs_file_param{process__time_discretization__BackwardDifferentiationFormula__order}
         auto const order = config.getConfParam<unsigned>("order");
         using ConcreteTD = BackwardDifferentiationFormula<Vector>;
         return T(new ConcreteTD(order));
diff --git a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
index ad17ce94e598ee3ba4c1e56e13a43ef54b330cb2..ea4e0e61eb4d0cad5b17a8e4e5d1912ada19b8e1 100644
--- a/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/FixedTimeStepping.cpp
@@ -35,10 +35,14 @@ FixedTimeStepping::FixedTimeStepping(double t0, double tn, double dt)
 std::unique_ptr<ITimeStepAlgorithm>
 FixedTimeStepping::newInstance(BaseLib::ConfigTree const& config)
 {
+    //! \ogs_file_param{prj__time_stepping__type}
     config.checkConfParam("type", "FixedTimeStepping");
 
+    //! \ogs_file_param{prj__time_stepping__FixedTimeStepping__t_initial}
     auto const t_initial = config.getConfParam<double>("t_initial");
+    //! \ogs_file_param{prj__time_stepping__FixedTimeStepping__t_end}
     auto const t_end     = config.getConfParam<double>("t_end");
+    //! \ogs_file_param{prj__time_stepping__FixedTimeStepping__timesteps}
     auto const delta_ts  = config.getConfSubtree("timesteps");
 
     std::vector<double> timesteps;
@@ -46,6 +50,7 @@ FixedTimeStepping::newInstance(BaseLib::ConfigTree const& config)
     double delta_t = 0.0;
 
     // TODO: consider adding call "listNonEmpty" to config tree
+    //! \ogs_file_param{prj__time_stepping__FixedTimeStepping__timesteps__pair}
     auto const range = delta_ts.getConfSubtreeList("pair");
     if (range.begin() == range.end()) {
         ERR("no timesteps have been given");
@@ -53,7 +58,9 @@ FixedTimeStepping::newInstance(BaseLib::ConfigTree const& config)
     }
     for (auto const pair : range)
     {
+        //! \ogs_file_param{prj__time_stepping__FixedTimeStepping__timesteps__pair__repeat}
         auto const repeat = pair.getConfParam<std::size_t>("repeat");
+        //! \ogs_file_param{prj__time_stepping__FixedTimeStepping__timesteps__pair__delta_t}
         delta_t           = pair.getConfParam<double>("delta_t");
 
         if (repeat == 0) {
diff --git a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h
index 6ca68d79db632f8f641889edf58fddb311f32831..92f9d83c756df436a98b63d81c8f47911d32e97a 100644
--- a/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h
+++ b/ProcessLib/GroundwaterFlow/GroundwaterFlowProcess.h
@@ -154,18 +154,24 @@ createGroundwaterFlowProcess(
     std::vector<std::unique_ptr<ParameterBase>> const& parameters,
     BaseLib::ConfigTree const& config)
 {
+    //! \ogs_file_param{process__type}
     config.checkConfParam("type", "GROUNDWATER_FLOW");
 
     DBUG("Create GroundwaterFlowProcess.");
 
     // Process variable.
-    auto process_variables =
-        findProcessVariables(variables, config, { "process_variable" });
+    auto process_variables = findProcessVariables(variables, config, {
+        //! \ogs_file_param_special{process__GROUNDWATER_FLOW__process_variables__process_variable}
+        "process_variable"
+    });
 
     // Hydraulic conductivity parameter.
     auto& hydraulic_conductivity =
         findParameter<double, MeshLib::Element const&>(
-            config, "hydraulic_conductivity", parameters);
+            config,
+            //! \ogs_file_param_special{process__GROUNDWATER_FLOW__hydraulic_conductivity}
+            "hydraulic_conductivity",
+            parameters);
 
     DBUG("Use \'%s\' as hydraulic conductivity parameter.",
          hydraulic_conductivity.name.c_str());
@@ -174,11 +180,21 @@ createGroundwaterFlowProcess(
         hydraulic_conductivity
     };
 
-    SecondaryVariableCollection<typename GlobalSetup::VectorType>
-        secondary_variables{config.getConfSubtreeOptional("secondary_variables"),
-            { "darcy_velocity_x", "darcy_velocity_y", "darcy_velocity_z" }};
+    SecondaryVariableCollection<typename GlobalSetup::VectorType> secondary_variables {
+        //! \ogs_file_param{process__secondary_variables}
+        config.getConfSubtreeOptional("secondary_variables"),
+        {
+            //! \ogs_file_param_special{process__GROUNDWATER_FLOW__secondary_variables__darcy_velocity_x}
+            "darcy_velocity_x",
+            //! \ogs_file_param_special{process__GROUNDWATER_FLOW__secondary_variables__darcy_velocity_y}
+            "darcy_velocity_y",
+            //! \ogs_file_param_special{process__GROUNDWATER_FLOW__secondary_variables__darcy_velocity_z}
+            "darcy_velocity_z"
+        }
+    };
 
     ProcessOutput<typename GlobalSetup::VectorType>
+        //! \ogs_file_param{process__output}
         process_output{config.getConfSubtree("output"),
                 process_variables, secondary_variables};
 
diff --git a/ProcessLib/InitialCondition.cpp b/ProcessLib/InitialCondition.cpp
index 3ea7de869081caa001f9f3ab67b082f497df6ffa..d3abd14fb7cdd9acb701adb62245f7b8499e0611 100644
--- a/ProcessLib/InitialCondition.cpp
+++ b/ProcessLib/InitialCondition.cpp
@@ -23,8 +23,10 @@ namespace ProcessLib
 std::unique_ptr<InitialCondition> createUniformInitialCondition(
     BaseLib::ConfigTree const& config, int const /*n_components*/)
 {
+    //! \ogs_file_param{initial_condition__type}
     config.checkConfParam("type", "Uniform");
 
+    //! \ogs_file_param{initial_condition__Uniform__value}
     auto value = config.getConfParam<double>("value");
     DBUG("Using value %g", value);
 
@@ -37,6 +39,10 @@ std::unique_ptr<InitialCondition> createMeshPropertyInitialCondition(
     MeshLib::Mesh const& mesh,
     int const n_components)
 {
+    //! \ogs_file_param{initial_condition__type}
+    config.checkConfParam("type", "MeshProperty");
+
+    //! \ogs_file_param{initial_condition__MeshProperty__field_name}
     auto field_name = config.getConfParam<std::string>("field_name");
     DBUG("Using field_name %s", field_name.c_str());
 
diff --git a/ProcessLib/NeumannBcConfig.h b/ProcessLib/NeumannBcConfig.h
index 1664b26fb0f23e3b20c82fa12f9e7cbaf2b4ed9e..fa5660e85c03e256387f9b31b06ac4aaf478e2b2 100644
--- a/ProcessLib/NeumannBcConfig.h
+++ b/ProcessLib/NeumannBcConfig.h
@@ -48,8 +48,10 @@ public:
         : BoundaryConditionConfig(geometry)
     {
         DBUG("Constructing NeumannBcConfig from config.");
+        //! \ogs_file_param{boundary_condition__type}
         config.checkConfParam("type", "UniformNeumann");
 
+        //! \ogs_file_param{boundary_condition__UniformNeumann__value}
         double const value = config.getConfParam<double>("value");
         DBUG("Using value %g", value);
 
diff --git a/ProcessLib/Output.cpp b/ProcessLib/Output.cpp
index 0646f2bd9a5fdd07b19d4473ed0fcd28f33a3744..9fb85ad84f15f8f061bfc2363f9c482d1667df0e 100644
--- a/ProcessLib/Output.cpp
+++ b/ProcessLib/Output.cpp
@@ -50,13 +50,18 @@ newInstance(const BaseLib::ConfigTree &config, std::string const& output_directo
 {
     std::unique_ptr<Output> out{ new Output{
         BaseLib::joinPaths(output_directory,
-                           config.getConfParam<std::string>("prefix"))}};
+            //! \ogs_file_param{prj__output__prefix}
+            config.getConfParam<std::string>("prefix"))}};
 
+    //! \ogs_file_param{prj__output__timesteps}
     if (auto const timesteps = config.getConfSubtreeOptional("timesteps"))
     {
+        //! \ogs_file_param{prj__output__timesteps__pair}
         for (auto pair : timesteps->getConfSubtreeList("pair"))
         {
+            //! \ogs_file_param{prj__output__timesteps__pair__repeat}
             auto repeat     = pair.getConfParam<unsigned>("repeat");
+            //! \ogs_file_param{prj__output__timesteps__pair__each_steps}
             auto each_steps = pair.getConfParam<unsigned>("each_steps");
 
             assert(repeat != 0 && each_steps != 0);
diff --git a/ProcessLib/Parameter.cpp b/ProcessLib/Parameter.cpp
index 45e956acd41a6e5ae1c075ba333c16e6fe8421de..33b937d0a3f7acb2c1cc9a7bf61d8348e6938c44 100644
--- a/ProcessLib/Parameter.cpp
+++ b/ProcessLib/Parameter.cpp
@@ -19,7 +19,9 @@ namespace ProcessLib
 std::unique_ptr<ParameterBase> createConstParameter(
     BaseLib::ConfigTree const& config)
 {
+    //! \ogs_file_param{parameter__type}
     config.checkConfParam("type", "Constant");
+    //! \ogs_file_param{parameter__Constant__value}
     auto value = config.getConfParam<double>("value");
     DBUG("Using value %g", value);
 
@@ -29,7 +31,9 @@ std::unique_ptr<ParameterBase> createConstParameter(
 std::unique_ptr<ParameterBase> createMeshPropertyParameter(
     BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh)
 {
+    //! \ogs_file_param{parameter__type}
     config.checkConfParam("type", "MeshProperty");
+    //! \ogs_file_param{parameter__MeshProperty__field_name}
     auto field_name = config.getConfParam<std::string>("field_name");
     DBUG("Using field_name %s", field_name.c_str());
 
diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp
index 4ae6e359f6c89cd055cc1cc71088cac743e45c5e..4a1c20e50221d85abed3f302e8064b6f76ba9cd5 100644
--- a/ProcessLib/Process.cpp
+++ b/ProcessLib/Process.cpp
@@ -16,6 +16,7 @@ ProcessVariable& findProcessVariable(
     BaseLib::ConfigTree const& pv_config, std::string const& tag)
 {
     // Find process variable name in process config.
+    //! \ogs_file_special
     std::string const name = pv_config.getConfParam<std::string>(tag);
 
         // Find corresponding variable by name.
@@ -49,6 +50,7 @@ findProcessVariables(
     std::vector<std::reference_wrapper<ProcessVariable>> vars;
     vars.reserve(tag_names.size());
 
+    //! \ogs_file_param{process__process_variables}
     auto const pv_conf = process_config.getConfSubtree("process_variables");
 
     for (auto const& tag : tag_names) {
diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h
index 9b97d21e0b8a012a14ae44e787323afd17dc7e40..78a66cf118f7694bc492d71d7d82d131d5247bd5 100644
--- a/ProcessLib/Process.h
+++ b/ProcessLib/Process.h
@@ -372,6 +372,7 @@ Parameter<ParameterArgs...>& findParameter(
     std::vector<std::unique_ptr<ParameterBase>> const& parameters)
 {
     // Find parameter name in process config.
+    //! \ogs_file_special
     auto const name = process_config.getConfParam<std::string>(tag);
 
     // Find corresponding parameter by name.
diff --git a/ProcessLib/ProcessOutput.h b/ProcessLib/ProcessOutput.h
index 9757f6b6e487675d5c687594a6e8e5a837a3f5b1..03e7279899a1605d67aa32616aae1cff11451364 100644
--- a/ProcessLib/ProcessOutput.h
+++ b/ProcessLib/ProcessOutput.h
@@ -27,8 +27,10 @@ struct ProcessOutput final
                   process_variables,
                   SecondaryVariableCollection<GlobalVector> const& secondary_variables)
     {
+        //! \ogs_file_param{process__output__variables}
         auto const out_vars = output_config.getConfSubtree("variables");
 
+        //! \ogs_file_param{process__output__variables__variable}
         for (auto out_var : out_vars.getConfParamList<std::string>("variable"))
         {
             if (output_variables.find(out_var) != output_variables.cend())
@@ -64,6 +66,7 @@ struct ProcessOutput final
 
         // debug output
         if (auto const param =
+            //! \ogs_file_param{process__output__output_iteration_results}
             output_config.getConfParamOptional<bool>("output_iteration_results"))
         {
             DBUG("output_iteration_results: %s", (*param) ? "true" : "false");
diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp
index 953f2800453017c8948acd876a67a5f849b6d927..d3072e65be68f7fdf6c941dc9323f3c1c01a1ce5 100644
--- a/ProcessLib/ProcessVariable.cpp
+++ b/ProcessLib/ProcessVariable.cpp
@@ -21,15 +21,20 @@ namespace ProcessLib
 ProcessVariable::ProcessVariable(BaseLib::ConfigTree const& config,
                                  MeshLib::Mesh& mesh,
                                  GeoLib::GEOObjects const& geometries)
-    : _name(config.getConfParam<std::string>("name")),
-      _mesh(mesh),
-      _n_components(config.getConfParam<int>("components"))
+    :
+    //! \ogs_file_param{prj__process_variables__process_variable__name}
+    _name(config.getConfParam<std::string>("name")),
+    _mesh(mesh),
+    //! \ogs_file_param{prj__process_variables__process_variable__components}
+    _n_components(config.getConfParam<int>("components"))
 {
     DBUG("Constructing process variable %s", this->_name.c_str());
 
     // Initial condition
+    //! \ogs_file_param{prj__process_variables__process_variable__initial_condition}
     if (auto ic_config = config.getConfSubtreeOptional("initial_condition"))
     {
+        //! \ogs_file_param{initial_condition__type}
         auto const type = ic_config->peekConfParam<std::string>("type");
         if (type == "Uniform")
         {
@@ -52,14 +57,18 @@ ProcessVariable::ProcessVariable(BaseLib::ConfigTree const& config,
     }
 
     // Boundary conditions
+    //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions}
     if (auto bcs_config = config.getConfSubtreeOptional("boundary_conditions"))
     {
-        for (auto bc_config
-             : bcs_config->getConfSubtreeList("boundary_condition"))
+        for (auto bc_config :
+             //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition}
+             bcs_config->getConfSubtreeList("boundary_condition"))
         {
             auto const geometrical_set_name =
+                    //! \ogs_file_param{boundary_condition__geometrical_set}
                     bc_config.getConfParam<std::string>("geometrical_set");
             auto const geometry_name =
+                    //! \ogs_file_param{boundary_condition__geometry}
                     bc_config.getConfParam<std::string>("geometry");
 
             GeoLib::GeoObject const* const geometry =
@@ -69,6 +78,7 @@ ProcessVariable::ProcessVariable(BaseLib::ConfigTree const& config,
                 GeoLib::convertGeoTypeToString(geometry->getGeoType()).c_str());
 
             // Construct type dependent boundary condition
+            //! \ogs_file_param{boundary_condition__type}
             auto const type = bc_config.peekConfParam<std::string>("type");
 
             if (type == "UniformDirichlet")
diff --git a/ProcessLib/SecondaryVariable.h b/ProcessLib/SecondaryVariable.h
index 9983763728d8d3d491c3278e45b60925f9d36279..6615eec225dd81c204f4f998bef3ebd66642135e 100644
--- a/ProcessLib/SecondaryVariable.h
+++ b/ProcessLib/SecondaryVariable.h
@@ -115,6 +115,7 @@ public:
 
         // read which variables are defined in the config
         for (auto const& tag_name : tag_names) {
+            //! \ogs_file_special
             if (auto var_name = config->getConfParamOptional<std::string>(tag_name))
             {
                 // TODO check primary vars, too
diff --git a/ProcessLib/UniformDirichletBoundaryCondition.h b/ProcessLib/UniformDirichletBoundaryCondition.h
index f614c40ca426eebfbe025429061d4a83302e7bda..9c5d91308beb38477a15c64963b15cd5b6500bf3 100644
--- a/ProcessLib/UniformDirichletBoundaryCondition.h
+++ b/ProcessLib/UniformDirichletBoundaryCondition.h
@@ -42,8 +42,10 @@ public:
         : _geometry(geometry)
     {
         DBUG("Constructing UniformDirichletBoundaryCondition from config.");
+        //! \ogs_file_param{boundary_condition__type}
         config.checkConfParam("type", "UniformDirichlet");
 
+        //! \ogs_file_param{boundary_condition__UniformDirichlet__value}
         _value = config.getConfParam<double>("value");
         DBUG("Using value %g", _value);
     }
diff --git a/scripts/cmake/DocumentationProjectFile.cmake b/scripts/cmake/DocumentationProjectFile.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..74900d4984db496c5096d3b632c4c757cb5afe32
--- /dev/null
+++ b/scripts/cmake/DocumentationProjectFile.cmake
@@ -0,0 +1,137 @@
+# Moves an *.md file from the src directory to DocAux directory in the build
+# tree augmenting it with basic extra information, such as the list of child
+# pages and the page title.
+function(documentationProjectFilePutIntoPlace p)
+    file(RELATIVE_PATH relative_path ${DocumentationProjectFileInputDir} ${p})
+    get_filename_component(dir_name ${relative_path} DIRECTORY)
+
+    get_filename_component(otagname ${relative_path} NAME_WE)
+    if (otagname MATCHES ^[ic]_)
+        # if the file name starts with an underscore, then this files is
+        # the "table of contents of the current directory
+
+        file(MAKE_DIRECTORY "${DocumentationProjectFileBuildDir}/${dir_name}")
+
+        set(postfix "# Child parameters, attributes and cases\n\n")
+
+        # gather other parameter files
+        # the loop below will effects a page hierarchy to be built
+        file(GLOB param_files ${DocumentationProjectFileInputDir}/${dir_name}/*)
+        set(subpagelist "")
+        foreach(pf ${param_files})
+            # ignore hidden files
+            if (pf MATCHES /[.][^/]+)
+                continue()
+            endif()
+
+            get_filename_component(rel_pf ${pf} NAME_WE)
+
+            # if the file name matches ^[ic]_, then this
+            # is the "table of contents" file already processed outside
+            # of this loop
+            if (NOT rel_pf MATCHES ^[ic]_)
+                if(IS_DIRECTORY ${pf})
+                    set(pf_tagname ${rel_pf})
+                else()
+                    if (NOT "${rel_pf}" MATCHES ^._)
+                        message(SEND_ERROR "Path `${rel_pf}' has a wrong name."
+                            " Full path is `${pf}'.")
+                        continue()
+                    endif()
+
+                    string(SUBSTRING "${rel_pf}" 2 -1 pf_tagname)
+                endif()
+
+                if ("${dir_name}" STREQUAL "") # toplevel dir must be treated slightly different
+                    set(pf_tagpath "${pf_tagname}")
+                else()
+                    set(pf_tagpath "${dir_name}/${pf_tagname}")
+                    string(REPLACE "/" "__" pf_tagpath "${pf_tagpath}")
+                endif()
+                message("  t.o.c. entry ${pf_tagpath}")
+
+                if (rel_pf MATCHES ^a_)
+                    set(pagenameprefix "ogs_file_attr__")
+                else()
+                    set(pagenameprefix "ogs_file_param__")
+                endif()
+
+                list(FIND subpagelist "${pagenameprefix}${pf_tagpath}" idx)
+                if (NOT idx EQUAL -1)
+                    message(SEND_ERROR "The subpagelist already contains"
+                        " ${pagenameprefix}${pf_tagpath}. Maybe there are"
+                        " duplicate documentation files.")
+                else()
+                    list(APPEND subpagelist "${pagenameprefix}${pf_tagpath}")
+                endif()
+
+                if (NOT IS_DIRECTORY "${pf}")
+                    documentationProjectFilePutIntoPlace("${pf}")
+                endif()
+            endif()
+        endforeach()
+
+        list(SORT subpagelist)
+        foreach(subpage ${subpagelist})
+            set(postfix "${postfix} - \\subpage ${subpage}\n")
+        endforeach()
+    else()
+        set(postfix "")
+    endif()
+
+    string(SUBSTRING ${otagname} 2 -1 tagname)
+    if (dir_name STREQUAL "") # toplevel dir must be treated slightly different
+        set(tagpath "${tagname}")
+    else()
+        if (otagname MATCHES ^[ic]_) # treat "table of contents" file special
+            string(REPLACE "/" "__" tagpath "${dir_name}")
+        else()
+            string(REPLACE "/" "__" tagpath "${dir_name}/${tagname}")
+        endif()
+    endif()
+    message("  child param  ${tagpath}")
+
+    set(pagenameprefix "ogs_file_param__")
+    if (otagname MATCHES ^i_ AND dir_name STREQUAL "")
+        set(pagetitle "OGS Input File Parameters")
+    elseif(otagname MATCHES ^c_)
+        set(pagetitle "[case]&emsp;${tagname}")
+    elseif(otagname MATCHES ^t_ OR otagname MATCHES ^i_)
+        set(pagetitle "[tag]&emsp;${tagname}")
+    elseif(otagname MATCHES ^a_)
+        set(pagetitle "[attr]&emsp;${tagname}")
+        set(pagenameprefix "ogs_file_attr__")
+    else()
+        message(SEND_ERROR "Tag name ${otagname} does not match in any case."
+            " Maybe there is a file with a wrong name in the documentation"
+            " directory.")
+    endif()
+
+    # read, augment, write file content
+    file(READ ${p} content)
+    set(content "/*! \\page ${pagenameprefix}${tagpath} ${pagetitle}\n${content}\n\n${postfix}\n")
+    if (NOT doc_use_external_tools)
+        set(ending "\n*/\n")
+    else()
+        set(ending "") # external tools shall finish the file
+    endif()
+    string(REGEX REPLACE .md$ .dox output_file "${DocumentationProjectFileBuildDir}/${relative_path}")
+    file(WRITE "${output_file}" "${content}${ending}")
+endfunction()
+
+
+set(DocumentationProjectFileBuildDir ${PROJECT_BINARY_DIR}/DocAux/dox/ProjectFile)
+set(DocumentationProjectFileInputDir ${PROJECT_SOURCE_DIR}/Documentation/ProjectFile)
+
+# remove old output
+if (IS_DIRECTORY ${DocumentationProjectFileBuildDir})
+    file(REMOVE_RECURSE ${DocumentationProjectFileBuildDir})
+endif()
+
+# traverse input file hierarchy
+file(GLOB_RECURSE input_paths ${DocumentationProjectFileInputDir}/c_* ${DocumentationProjectFileInputDir}/i_*)
+
+foreach(p ${input_paths})
+    message("directory index file ${p}")
+    documentationProjectFilePutIntoPlace(${p})
+endforeach()
diff --git a/scripts/cmake/DocumentationSetup.cmake b/scripts/cmake/DocumentationSetup.cmake
index 144bb533951ef6fdab7e771e766317e60f9c4a13..884b77ab72648253ce4f1fce7e3d5f299b8e9af5 100644
--- a/scripts/cmake/DocumentationSetup.cmake
+++ b/scripts/cmake/DocumentationSetup.cmake
@@ -38,4 +38,35 @@ if(DOXYGEN_FOUND)
 
     configure_file(Documentation/Doxyfile.in ${PROJECT_BINARY_DIR}/Doxyfile)
 
+    if (BASH_TOOL_PATH AND PYTHON_EXECUTABLE)
+        set(doc_use_external_tools TRUE)
+    else()
+        set(doc_use_external_tools FALSE)
+    endif()
+
+    # TODO that will always transform all of the input files no matter if they changed
+    # maybe this behaviour can be changed to on-demand processing
+    add_custom_target(internal_pre_doc
+        ${CMAKE_COMMAND}
+        -DPROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}
+        -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
+        -Ddoc_use_external_tools=${doc_use_external_tools}
+        -P ${PROJECT_SOURCE_DIR}/scripts/cmake/DocumentationProjectFile.cmake
+        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+        COMMENT "Generating project file documentation hierarchy." VERBATIM)
+    add_dependencies(doc internal_pre_doc)
+
+    if (doc_use_external_tools)
+        set(data_dir "${PROJECT_SOURCE_DIR}/Tests/Data")
+        add_custom_target(internal_pre_doc_qa_page
+            ${BASH_TOOL_PATH}
+            "${PROJECT_SOURCE_DIR}/scripts/doc/generate-project-file-doc-qa.sh"
+            ${PROJECT_SOURCE_DIR}
+            ${PROJECT_BINARY_DIR}
+            ${data_dir}
+            WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+            COMMENT "Generating project file documentation quality assurance pages." VERBATIM)
+        add_dependencies(doc internal_pre_doc_qa_page)
+        add_dependencies(internal_pre_doc_qa_page internal_pre_doc)
+    endif()
 endif()
diff --git a/scripts/doc/append-xml-tags.py b/scripts/doc/append-xml-tags.py
new file mode 100755
index 0000000000000000000000000000000000000000..8343fd989cb2ac14c441dc6091dabd7172fd2135
--- /dev/null
+++ b/scripts/doc/append-xml-tags.py
@@ -0,0 +1,176 @@
+#!/usr/bin/python
+
+# This script augments the parameter documentation pages by information
+# such as if they are required/optional, their data typ and in which
+# end-to-end tests they are used.
+# It uses the cache file generated by normalize-param-cache.py
+
+# prevent broken pipe error
+from signal import signal, SIGPIPE, SIG_DFL
+signal(SIGPIPE,SIG_DFL)
+
+import os
+import xml.etree.cElementTree as ET
+import argparse
+
+github_src_url  = "https://github.com/ufz/ogs/tree/master"
+github_data_url = "https://github.com/ufz/ogs-data/tree/master"
+
+parser = argparse.ArgumentParser(description="Print XML tags")
+
+parser.add_argument("ext",       help="Extension of files to consider")
+parser.add_argument("datadir",   help="data directory")
+parser.add_argument("docauxdir", help="directory of auxiliary doc files")
+
+args = parser.parse_args()
+extension = '.' + args.ext
+datadir   = os.path.abspath(args.datadir)
+docauxdir = os.path.abspath(args.docauxdir)
+docdir    = os.path.join(docauxdir, "dox", "ProjectFile")
+
+# used to expand documentation entry points to full xml tag paths
+# that are used in the prj file.
+tag_path_expansion_table = {
+    "initial_condition":  "process_variables.process_variable.initial_condition",
+    "boundary_condition": "process_variables.process_variable.boundary_conditions.boundary_condition",
+    "linear_solver":      "linear_solvers.linear_solver",
+    "process":            "processes.process",
+    "parameter":          "parameters.parameter",
+    "prj": "",
+}
+
+# maps tags to the set of xml files they appear in
+dict_tag_files = dict()
+
+# maps tags to additional parameter info obtained prior to this script
+dict_tag_info = dict()
+
+def dict_of_set_append(dict_, key, value):
+    if key in dict_:
+        dict_[key].add(value)
+    else:
+        dict_[key] = set((value,))
+
+def dict_of_list_append(dict_, key, value):
+    if key in dict_:
+        dict_[key].append(value)
+    else:
+        dict_[key] = [value]
+
+
+def print_tags(node, path, level, filepath):
+    global dict_tag_files
+
+    tag = node.tag
+    if level>1: # skip root node
+        tagpath = path + "." + tag
+    else:
+        tagpath = tag
+
+    if level>0: # skip root node
+        dict_of_set_append(dict_tag_files, (True, tagpath), filepath)
+        for k in node.attrib:
+            dict_of_set_append(dict_tag_files, (False, tagpath + "." + k), filepath)
+
+    for child in node:
+        print_tags(child, tagpath, level + 1, filepath)
+
+# gather info from xml files
+for (dirpath, _, filenames) in os.walk(datadir):
+    for f in filenames:
+        if not f.endswith(extension): continue
+
+        filepath = os.path.join(dirpath, f)
+        xmlroot = ET.parse(filepath).getroot()
+        print_tags(xmlroot, "", 0, filepath[len(datadir)+1:])
+
+if False:
+    first = True
+    for (tag, files) in sorted(dict_tag_files.items()):
+        if first:
+            first = False
+        else:
+            print()
+
+        print("T |" if tag[0] else "A |", tag[1])
+        for f in sorted(files):
+            print("   ", f)
+
+# read parameter cache (generated by normalize-param-cache.py)
+with open(os.path.join(docauxdir, "documented-parameters-cache.txt")) as fh:
+    for line in fh:
+        line = line.strip().split("@@@")
+        if line[0] == "OK":
+            tagpath = line[3]
+            dict_of_list_append(dict_tag_info, tagpath, line)
+
+# traverse dox file hierarchy
+for (dirpath, _, filenames) in os.walk(docdir):
+    reldirpath = dirpath[len(docdir)+1:]
+    istag = True
+
+    for f in filenames:
+        if not f.endswith(".dox"): continue
+
+        if f.startswith("i_") or f.startswith("c_"):
+            tagpath = reldirpath
+        elif f.startswith("t_"):
+            tagpath = os.path.join(reldirpath, f[2:-len(".dox")])
+            istag = True
+        elif f.startswith("a_"):
+            tagpath = os.path.join(reldirpath, f[2:-len(".dox")])
+            istag = False
+
+        tagpath = tagpath.replace(os.sep, ".")
+
+        path = os.path.join(dirpath, f)
+        with open(path, "a") as fh:
+            # TODO this can currently only expand the top level
+            tagpathparts = tagpath.split(".")
+            if tagpathparts[0] in tag_path_expansion_table:
+                tagpathparts[0] = tag_path_expansion_table[tagpathparts[0]]
+            else:
+                tagpathparts[0] = "NONEXISTENT"
+            tagpath_expanded = ".".join(tagpathparts).lstrip(".")
+
+            if tagpath:
+                fh.write("\n\n# Additional info\n")
+                if tagpath in dict_tag_info:
+                    for info in dict_tag_info[tagpath]:
+                        path = info[1]; line = info[2]
+                        fh.write(("\n## From {0} line {1}\n\n")
+                                .format(path, line))
+
+                        method = info[6]
+                        if method.endswith("Optional"):
+                            fh.write("- This is an optional parameter.\n")
+                        elif method.endswith("List"):
+                            fh.write("- This parameter can be given arbitrarily many times.\n")
+                        elif method: # method not empty
+                            fh.write("- This is a required parameter.\n")
+
+                        datatype = info[5]
+                        if datatype: fh.write("- Data type: <tt>{}</tt>\n".format(datatype))
+
+                        fh.write("- Expanded tag path: {}\n".format(tagpath_expanded))
+
+                        fh.write("- Go to source code: [&rarr; ufz/ogs/master]({2}/{0}#L{1})\n"
+                                .format(path, line, github_src_url))
+                else:
+                    fh.write("\nNo additional info.\n")
+
+            if tagpath_expanded:
+                fh.write("\n\n# Used in the following test data files\n\n")
+                try:
+                    datafiles = dict_tag_files[(istag, tagpath_expanded)]
+
+                    for df in sorted(datafiles):
+                        fh.write("- \\[[&rarr; ogs-data/master]({1}/{0})\\]&emsp;{0}\n"
+                                .format(df, github_data_url))
+                except KeyError:
+                    fh.write("Used in no end-to-end test cases.\n")
+            else:
+                # no additional output for the main doc page
+                pass
+
+            fh.write("\n*/\n")
diff --git a/scripts/doc/check-project-params.py b/scripts/doc/check-project-params.py
new file mode 100755
index 0000000000000000000000000000000000000000..e86b7dae6065ab3961d98eb80b866bf55f3bd673
--- /dev/null
+++ b/scripts/doc/check-project-params.py
@@ -0,0 +1,174 @@
+#!/usr/bin/python
+
+# This script actually generates the QA page.
+# For its usage see generate-project-file-doc-qa.sh
+
+import sys
+import re
+import os.path
+
+github_src_url = "https://github.com/ufz/ogs/tree/master"
+
+def debug(msg):
+    sys.stderr.write(msg+"\n")
+
+if len(sys.argv) != 3:
+    print("USAGE: {} DOCAUXDIR SRCDIR".format(sys.argv[0]))
+    sys.exit(1)
+
+docauxdir = sys.argv[1]
+if not os.path.isdir(docauxdir):
+    print("error: `{}' is not a directory".format(docauxdir))
+    sys.exit(1)
+
+srcdir = sys.argv[2]
+
+undocumented = []
+unneeded_comments = []
+wrong_input = []
+no_doc_page = []
+unneeded_md_files = dict()
+good_tagpaths = set()
+wrong_status = False
+
+for inline in sys.stdin:
+    inline = inline.strip().split("@@@")
+    status = inline[0]
+
+    if status == "OK":
+        tag_path_comment = inline[3]
+        tag_name_comment = tag_path_comment.split(".")[-1]
+
+        dirs = tag_path_comment.split(".")[:-1]
+        p = os.path.join(docauxdir, *dirs)
+        if os.path.isfile(os.path.join(p, "t_" + tag_name_comment + ".dox")) \
+           or os.path.isfile(os.path.join(p, tag_name_comment, "i_" + tag_name_comment + ".dox")) \
+           or os.path.isfile(os.path.join(p, tag_name_comment, "c_" + tag_name_comment + ".dox")) :
+            good_tagpaths.add((tag_path_comment, "param"))
+        elif os.path.isfile(os.path.join(p, "a_" + tag_name_comment + ".dox")):
+            good_tagpaths.add((tag_path_comment, "attr"))
+        else:
+            no_doc_page.append((tag_path_comment, inline[1], inline[2]))
+
+    elif status == "WRONGIN":
+        wrong_input.append(inline[1:])
+    elif status == "NODOC":
+        method = inline[6]
+        # ignored parameters need not be documented
+        if not method.startswith("ignore"):
+            undocumented.append(inline[1:])
+    elif status == "UNNEEDED":
+        unneeded_comments.append(inline[1:])
+    elif status == "SPECIAL":
+        debug("SPECIAL: " + " ".join(inline[1:])) # TODO implement proper handling
+        # unneeded.append(inline[1:])
+    else:
+        debug("ERROR: unrecognized status {}".format(status))
+        wrong_status = True
+
+
+# traverse dox file hierarchy
+srcdocdir = os.path.join(srcdir, "Documentation", "ProjectFile")
+for (dirpath, _, filenames) in os.walk(srcdocdir):
+    reldirpath = dirpath[len(srcdocdir)+1:]
+
+    for f in filenames:
+        if not f.endswith(".md"): continue
+        filepath = os.path.join(reldirpath, f)
+        tag_or_attr = "param"
+
+        if f.startswith("i_") or f.startswith("c_"):
+            tagpath = reldirpath
+        elif f.startswith("t_"):
+            tagpath = os.path.join(reldirpath, f[2:-len(".md")])
+        elif f.startswith("a_"):
+            tagpath = os.path.join(reldirpath, f[2:-len(".md")])
+            tag_or_attr = "attr"
+        else:
+            debug("ERROR: Found md file with unrecognized name: {}"
+                    .format(filepath))
+            continue
+
+        tagpath = tagpath.replace(os.sep, ".")
+
+        if (tagpath, tag_or_attr) not in good_tagpaths:
+            unneeded_md_files[(tagpath, tag_or_attr)] = filepath
+
+# remove false positives from unneeded_md_files
+if unneeded_md_files:
+    for tagpath, _ in good_tagpaths:
+        tagpath = tagpath.split(".")
+        while tagpath:
+            tagpath.pop()
+            parenttagpath = ".".join(tagpath)
+            if (parenttagpath, "param") in unneeded_md_files:
+                del unneeded_md_files[(parenttagpath, "param")]
+                if not unneeded_md_files: break
+        if not unneeded_md_files: break
+
+
+if undocumented:
+    print()
+    print("# Undocumented parameters")
+    print("| File | Line | Parameter | Type | Method | Link |")
+    print("| ---- | ---: | --------- | ---- | ------ | ---- |")
+    for u in sorted(undocumented):
+        u2 = list(u)
+        u2.append(github_src_url)
+        print(("| {0} | {1} | {3} | <tt>{4}</tt> | <tt>{5}</tt> "
+            + "| [&rarr; ufz/ogs/master]({6}/{0}#L{1})").format(*u2))
+
+if unneeded_comments:
+    print()
+    print("# Comments not documenting anything")
+    print("| File | Line | Comment | Link |")
+    print("| ---- | ---: | ------- | ---- |")
+    for u in sorted(unneeded_comments):
+        u2 = list(u)
+        u2.append(github_src_url)
+        u2[2] = re.sub(r'([\\@&$#<>%".|])', r"\\\1", u2[2])
+        print(("| {0} | {1} | {2} "
+            + "| [&rarr; ufz/ogs/master]({3}/{0}#L{1}) |").format(*u2))
+
+if wrong_input:
+    print()
+    print("# Lines of input to that script that have not been recognized")
+    print("| File | Line | Content | Link |")
+    print("| ---- | ---: | ------- | ---- |")
+    for w in sorted(wrong_input):
+        w2 = list(w)
+        w2.append(github_src_url)
+        w2[2] = re.sub(r'([\\@&$#<>%".|])', r"\\\1", w2[2])
+        print(("| {0} | {1} | {2} "
+            + "| [&rarr; ufz/ogs/master]({3}/{0}#L{1}) |").format(*w2))
+
+if no_doc_page:
+    print()
+    print("# No documentation page")
+    print("| Parameter | File | Line | Link |")
+    print("| --------- | ---- | ---: | ---- |")
+    for n in sorted(no_doc_page):
+        n2 = list(n)
+        n2.append(github_src_url)
+        print(("| {0} | {1} | {2} "
+            + "| [&rarr; ufz/ogs/master]({3}/{1}#L{2}) |").format(*n2))
+
+if unneeded_md_files:
+    print()
+    print("# Documentation pages that are not referenced in the source code")
+    print("| Page | *.md file | Link |")
+    print("| ---- | --------- | ---- |")
+    for (tagpath, tag_or_attr), filepath in sorted(unneeded_md_files.items()):
+        print((r'| \ref ogs_file_{0}__{1} | Documentation/ProjectFile/{2} '
+            + "| [&rarr; ufz/ogs/master]({3}/Documentation/ProjectFile/{2}#) |")
+            .format(tag_or_attr, tagpath.replace(".", "__"),
+                filepath, github_src_url))
+
+# exit with error status if something was not documented.
+if (not not undocumented) or (not not unneeded_comments) \
+        or (not not wrong_input) or (not not no_doc_page) \
+        or (not not unneeded_md_files) \
+        or wrong_status:
+            sys.exit(1)
+
+sys.exit(0)
diff --git a/scripts/doc/create-docu-file-stubs.sh b/scripts/doc/create-docu-file-stubs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2cb2867cebcef823d72c421edc79581d5fff05fa
--- /dev/null
+++ b/scripts/doc/create-docu-file-stubs.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+
+# This script creates missing file in the OGS input file documentation source tree.
+# It expects input from get-project-params.sh
+#
+# The working directory of this script must be the root of the OGS sources.
+#
+# Example:
+# scripts/doc/get-project-params.sh . | scripts/doc/create-docu-file-stubs.sh
+
+base="Documentation/ProjectFile"
+
+while IFS=":" read -r fn lno content; do
+    [ "$content" = "${content#*//!}" ] && continue
+    tag_name="$(echo "$content" \
+        | sed -n -e 'sX^\s*//! \\ogs_file_\(param\|attr\)\(_special\)\?{\([A-Za-z_0-9]\+\)}$X\1 \3Xp')"
+    [ -z "$tag_name" ] && continue
+    param_or_attr="${tag_name%% *}"
+    tag_name="${tag_name#* }"
+    tag_name="${tag_name//__/\/}"
+    echo "$param_or_attr $base/$tag_name"
+done \
+| sort -r \
+| while read param_or_attr path; do
+    dn="`dirname "$path"`"
+    bn="`basename "$path"`"
+    # echo "$param_or_attr $path"
+
+    if [ ! -d "$dn" ]; then
+        mkdir -p "$dn"
+
+        bdn="`basename "$dn"`"
+        if [ "`expr match "$bdn" '^[A-Z]'`" -eq 0 ] && [ ! -f "$dn/i_$bdn.md" ]; then
+            echo "creating $dn/i_$bdn.md"
+            echo '\todo document' >"$dn/i_$bdn.md"
+        elif [ "`expr match "$bdn" '^[A-Z]'`" -ne 0 ] && [ ! -f "$dn/c_$bdn.md" ]; then
+            echo "creating $dn/c_$bdn.md"
+            echo '\todo document' >"$dn/c_$bdn.md"
+        fi
+    fi
+
+    if [ -d "$path" ]; then
+        if [ "`expr match "$bn" '^[A-Z]'`" -eq 0 ] && [ ! -f "$path/i_$bn.md" ]; then
+            echo "creating $path/i_$bn.md"
+            echo '\todo document' >"$path/i_$bn.md"
+        elif [ "`expr match "$bn" '^[A-Z]'`" -ne 0 ] && [ ! -f "$path/c_$bn.md" ]; then
+            echo "creating $path/c_$bn.md"
+            echo '\todo document' >"$path/c_$bn.md"
+        fi
+    elif [ "$param_or_attr" = param ] && [ ! -f "$dn/t_$bn.md" ]; then
+        echo "creating $dn/t_$bn.md"
+        echo '\todo document' >"$dn/t_$bn.md"
+    elif [ "$param_or_attr" = attr ] && [ ! -f "$dn/a_$bn.md" ]; then
+        echo "creating $dn/a_$bn.md"
+        echo '\todo document' >"$dn/a_$bn.md"
+    # else
+    #     echo "OK $path"
+    fi
+
+    # if [ -d "$path" ] && [ -f "$path.md" ]; then
+    #     echo "ERROR: both $path and $path.md exist!" >&2
+    # fi
+done
diff --git a/scripts/doc/generate-project-file-doc-qa.sh b/scripts/doc/generate-project-file-doc-qa.sh
new file mode 100644
index 0000000000000000000000000000000000000000..96606bef036094ba48e22ca3619cf4ef27ad6ab2
--- /dev/null
+++ b/scripts/doc/generate-project-file-doc-qa.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# This script creates the quality assurance page and augments the
+# input file parameter documentation by information about end-to-end
+# tests in which the respective parameters are used.
+
+if [ $# -ne 3 ]; then
+    echo "USAGE: $0 SRCDIR BUILDDIR DATADIR" >&2
+    exit 1
+fi
+
+srcdir="$1"
+builddir="$2"
+datadir="$3"
+
+docauxdir="$builddir/DocAux"
+doxdir="$docauxdir/dox"
+toolsdir="$srcdir/scripts/doc"
+
+param_cache="$docauxdir/documented-parameters-cache.txt"
+
+qafile="$doxdir/project-file-doc-qa.dox"
+check_quality_script="$toolsdir/check-project-params.py"
+
+mkdir -p "$doxdir"
+
+# gather information about documented parameters
+"$toolsdir/get-project-params.sh" "$srcdir" \
+    | "$toolsdir/normalize-param-cache.py" >"$param_cache"
+
+# write QA information
+cat <<"EOF" >"$qafile"
+/*! \page project_file_doc_qa OGS Input File Parameters&mdash;Quality Assurance
+
+This page lists issues with the OGS input file parameter documentation.
+If it is empty, there are no issues detected.
+
+EOF
+
+cat "$param_cache" \
+    | "$check_quality_script" "$doxdir/ProjectFile" "$srcdir" >>"$qafile"
+
+cat <<EOF >>"$qafile"
+
+*/
+EOF
+
+# finish parameter documentation dox files
+"$toolsdir/append-xml-tags.py" prj "$datadir" "$docauxdir"
diff --git a/scripts/doc/get-project-params.sh b/scripts/doc/get-project-params.sh
new file mode 100755
index 0000000000000000000000000000000000000000..09db7ccc7685ee283f17445dee04f6a52f8b88a9
--- /dev/null
+++ b/scripts/doc/get-project-params.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# This script traverses the OGS input file documentation source tree
+# making a list of all input file parameter related Doxygen commands,
+# i.e., those beginning with \ogs, and of all ConfigTree related C++
+# code.
+
+if [ $# -ne 1 ]; then
+    echo "USAGE: ${0##*/} SRCDIR" >&2
+    exit 1
+fi
+
+srcdir="`realpath "$1"`"
+
+#color="--color=always"
+color=""
+
+cat <<"EOF" \
+| grep -r "$srcdir" \
+    --include '*.h' \
+    --include '*.cpp' \
+    --exclude-dir '.git' \
+    --exclude-dir 'Tests' \
+    --exclude 'ConfigTree*.*' \
+    -f - -r -n -o $color \
+| cut -c $((${#srcdir} + 2))-
+^\s*//! \\ogs_file_\(param\|attr\){[A-Za-z_0-9]\+}\( \\todo .*\)\?$
+^\s*//! \\ogs_file_special$
+^\s*//! \\ogs_file_\(param\|attr\)_special{[A-Za-z_0-9]\+}\( \\todo .*\)\?$
+checkConfParam.*)
+getConfAttribute.*)
+getConfParam.*)
+getConfSubtree.*)
+ignoreConfAttribute.*)
+ignoreConfParam.*)
+peekConfParam.*)
+EOF
+
+# format as table:
+# | sed -e 's_::_@@_g' -e's_:\s\+_:_' | column -t -s: | sed -e 's_@@_::_g'
diff --git a/scripts/doc/normalize-param-cache.py b/scripts/doc/normalize-param-cache.py
new file mode 100755
index 0000000000000000000000000000000000000000..76b084a4f72ed3b21172c589ecaa90ac332dab18
--- /dev/null
+++ b/scripts/doc/normalize-param-cache.py
@@ -0,0 +1,133 @@
+#!/usr/bin/python
+
+# This script takes the output of get-project-params.sh on stdin
+# and transforms it into a tabular representation for further
+# processing.
+
+import sys
+import re
+import os.path
+
+def debug(msg):
+    sys.stderr.write(msg+"\n")
+
+def write_out(*args):
+    print("@@@".join([str(a) for a in args]))
+
+# capture #2 is the parameter path
+comment = re.compile(r"^//! \\ogs_file_(param|attr)\{([A-Za-z_0-9]+)\}( \\todo .*)?$")
+comment_special = re.compile(r"^//! \\ogs_file(_param|_attr)?_special(\{[A-Za-z_0-9]+\})?( \\todo .*)?$")
+
+# capture #5 is the parameter name
+getter = re.compile(r'^(get|check|ignore|peek)Conf(Param|Attribute|Subtree)(List|Optional|All)?'
+                   +r'(<.*>)?'
+                   +r'\("([a-zA-Z_0-9:]+)"[,)]')
+
+getter_special = re.compile(r'^(get|check|ignore|peek)Conf(Param|Attribute|Subtree)(List|Optional|All)?'
+                           +r'(<.*>)?\(')
+
+state = "getter"
+path = ""
+lineno = 0
+line = ""
+tag_path_comment = ""
+param_or_attr_comment = ""
+
+for inline in sys.stdin:
+    oldpath = path; oldlineno = lineno; oldline = line
+
+    path, lineno, line = inline.split(":", 2)
+
+    if path != oldpath: debug(path)
+
+    line = line.strip()
+    lineno = int(lineno)
+
+    m = comment.fullmatch(line)
+    if m:
+        if state != "getter":
+            write_out("UNNEEDED", oldpath, oldlineno, oldline)
+        state = "comment"
+
+        param_or_attr_comment = m.group(1)
+        tag_path_comment = m.group(2).replace("__", ".")
+        debug(" {:>5}  //! {}".format(lineno, tag_path_comment))
+        tag_name_comment = tag_path_comment.split(".")[-1]
+
+        continue
+
+    m = comment_special.fullmatch(line)
+    if m:
+        if state != "getter":
+            write_out("UNNEEDED", oldpath, oldlineno, oldline)
+        state = "comment"
+        param_or_attr_comment = "special"
+
+        if m.group(1): # param|attr matched
+            # second group must not be empty!
+            tag_path_comment = m.group(2).strip("{}").replace("__", ".")
+            param = tag_path_comment.split(".")[-1]
+            paramtype = ""
+            method = ""
+            write_out("OK", path, lineno, tag_path_comment, param, paramtype, method)
+            state = "getter" # reset state s.t. next time a comment is accepted
+
+        continue
+
+    m = getter.match(line)
+    if m:
+        param = m.group(5)
+        paramtype = m.group(4)[1:-1] if m.group(4) else ""
+        method = m.group(1) + "Conf" + m.group(2) + (m.group(3) or "")
+
+        if state != "comment" or oldpath != path:
+            write_out("NODOC", path, lineno, "NONE", param, paramtype, method)
+        else:
+            debug(" {:>5}  {} {} ".format(lineno, param, paramtype))
+
+            if param != tag_name_comment:
+                debug("error: parameter name from comment and code do not match: "
+                        + tag_name_comment + " vs. " + param)
+                write_out("NODOC", path, lineno, tag_path_comment, param, paramtype, method)
+            elif lineno != oldlineno+1:
+                debug("error: the associated comment is not on the line preceding this one."
+                        + " line numbers {} vs. {}".format(oldlineno, lineno))
+                write_out("NODOC", path, lineno, tag_path_comment, param, paramtype, method)
+            elif param_or_attr_comment == "param" and m.group(2) != "Param" and m.group(2) != "Subtree":
+                debug("error: comment says param but code says different.")
+                write_out("NODOC", path, lineno, tag_path_comment, param, paramtype, method)
+            elif param_or_attr_comment == "attr" and m.group(2) != "Attribute":
+                debug("error: comment says attr but code says different.")
+                write_out("NODOC", path, lineno, tag_path_comment, param, paramtype, method)
+            elif param_or_attr_comment == "special":
+                debug("error: comment comments a special line.")
+                write_out("NODOC", path, lineno, "UNKNOWN", "UNKNOWN", paramtype, method)
+            else:
+                write_out("OK", path, lineno, tag_path_comment, param, paramtype, method)
+
+        state = "getter"
+        continue
+
+    m = getter_special.match(line)
+    if m:
+        paramtype = m.group(4)[1:-1] if m.group(4) else ""
+        method = m.group(1) + "Conf" + m.group(2) + (m.group(3) or "")
+
+        if state != "comment" or oldpath != path:
+            write_out("NODOC", path, lineno, "NONE", "UNKNOWN", paramtype, method)
+        else:
+            if lineno != oldlineno+1:
+                debug("error: the associated comment is not on the line preceding this one."
+                        + " line numbers {} vs. {}".format(oldlineno, lineno))
+                write_out("NODOC", path, lineno, "UNKNOWN", "UNKNOWN", paramtype, method)
+            elif param_or_attr_comment != "special":
+                debug("error: comment does not comment a special line.")
+                write_out("NODOC", path, lineno, "UNKNOWN", "UNKNOWN", paramtype, method)
+            else:
+                write_out("SPECIAL", path, lineno, paramtype, method)
+
+        state = "getter"
+        continue
+
+    write_out("WRONGIN", path, lineno, line.strip())
+    state = "getter" # reset state in order to avoid warnings