diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp
index 38b6bd6a80d8bc3ad51699c4efdc8b6cea0f2574..d3fb9c9923f9c6f50c6055e8fa75b06d7c892c91 100644
--- a/Applications/ApplicationsLib/ProjectData.cpp
+++ b/Applications/ApplicationsLib/ProjectData.cpp
@@ -283,8 +283,9 @@ ProjectData::ProjectData() = default;
 
 ProjectData::ProjectData(BaseLib::ConfigTree const& project_config,
                          std::string const& project_directory,
-                         std::string const& output_directory)
-    : _mesh_vec(readMeshes(project_config, project_directory))
+                         std::string const& output_directory,
+                         std::string const& mesh_directory)
+    : _mesh_vec(readMeshes(project_config, mesh_directory))
 {
     if (auto const python_script =
             //! \ogs_file_param{prj__python_script}
diff --git a/Applications/ApplicationsLib/ProjectData.h b/Applications/ApplicationsLib/ProjectData.h
index 411e22c0fad74e071b6826ce6a74c52064fc0413..716731eb9b4f8a678db01cb968101b3accc70251 100644
--- a/Applications/ApplicationsLib/ProjectData.h
+++ b/Applications/ApplicationsLib/ProjectData.h
@@ -55,17 +55,18 @@ public:
 
     /// Constructs project data by parsing provided configuration.
     ///
-    /// \param project_config Configuration as read from the prj file.
+    /// \param project_config    Configuration as read from the prj file.
     /// \param project_directory Where to look for files referenced in the
     ///                          \c config_tree.
     /// \param output_directory  Where to write simulation output files to.
+    /// \param mesh_directory    Directory where meshes are read from.
     ProjectData(BaseLib::ConfigTree const& project_config,
                 std::string const& project_directory,
-                std::string const& output_directory);
+                std::string const& output_directory,
+                std::string const& mesh_directory);
 
     ProjectData(ProjectData&) = delete;
 
-
     //
     // Process interface
     //
diff --git a/Applications/CLI/ogs.cpp b/Applications/CLI/ogs.cpp
index 04d30ad53718fdae47409b46ec5dc8a059a30ddd..a91f850016df6ea0d5a1da577033bc2a98906a9a 100644
--- a/Applications/CLI/ogs.cpp
+++ b/Applications/CLI/ogs.cpp
@@ -101,6 +101,11 @@ int main(int argc, char* argv[])
                                             false, "", "PATH");
     cmd.add(outdir_arg);
 
+    TCLAP::ValueArg<std::string> meshdir_arg(
+        "m", "mesh-input-directory",
+        "the directory where the meshes are read from", false, "", "PATH");
+    cmd.add(meshdir_arg);
+
     TCLAP::ValueArg<std::string> log_level_arg(
         "l", "log-level",
         "the verbosity of logging messages: none, error, warn, info, debug, "
@@ -214,9 +219,8 @@ int main(int argc, char* argv[])
             BaseLib::setProjectDirectory(
                 BaseLib::extractPath(project_arg.getValue()));
 
-            ProjectData project(project_config,
-                                BaseLib::getProjectDirectory(),
-                                outdir_arg.getValue());
+            ProjectData project(project_config, BaseLib::getProjectDirectory(),
+                                outdir_arg.getValue(), meshdir_arg.getValue());
 
             if (!reference_path_arg.isSet())
             {  // Ignore the test_definition section.
diff --git a/BaseLib/PrjProcessing.cpp b/BaseLib/PrjProcessing.cpp
index 84702330f4594c7e7d4bb67ae7a7e95983ba4fa0..510f19171bde5328341e0613d0feac7c32843342 100644
--- a/BaseLib/PrjProcessing.cpp
+++ b/BaseLib/PrjProcessing.cpp
@@ -274,10 +274,8 @@ void prepareProjectFile(std::stringstream& prj_stream,
 
     std::vector<std::string> patch_files_copy = patch_files;
     readAndPatchPrj(prj_stream, prj_file, patch_files_copy);
-    // LB TODO later: replace canonical with absolute when a mesh input dir
-    // ogs parameter is implemented.
     replaceIncludes(prj_stream,
-                    std::filesystem::canonical(std::filesystem::path(prj_file))
+                    std::filesystem::absolute(std::filesystem::path(prj_file))
                         .parent_path());
     // re-apply xml patches to stream
     for (const auto& patch_file : patch_files_copy)