diff --git a/.gitmodules b/.gitmodules
index 39ac29ed6afd0e4865fef71904e6d65b7209da30..6ab722e418f1fe14e6cecd62a8aa69366b8941ae 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -46,3 +46,6 @@
 [submodule "ThirdParty/json-cmake"]
 	path = ThirdParty/json-cmake
 	url = https://github.com/ufz/json-cmake.git
+[submodule "ThirdParty/spdlog"]
+	path = ThirdParty/spdlog
+	url = https://github.com/gabime/spdlog.git
diff --git a/Applications/ApplicationsLib/CMakeLists.txt b/Applications/ApplicationsLib/CMakeLists.txt
index b20709fdb1124f8d0a62acc65729cf8d524c5faf..dd3feb419ba09ecd7b051efd7f62f0f16b8753e6 100644
--- a/Applications/ApplicationsLib/CMakeLists.txt
+++ b/Applications/ApplicationsLib/CMakeLists.txt
@@ -6,12 +6,13 @@ set(LIB_SOURCES ${SOURCES_APPLICATIONSLIB})
 ogs_add_library(ApplicationsLib ${LIB_SOURCES})
 
 target_link_libraries(ApplicationsLib
-                      PUBLIC BaseLib GeoLib NumLib Processes logog
+                      PUBLIC BaseLib GeoLib NumLib Processes
                       PRIVATE MathLib
                               MeshLib
                               MeshGeoToolsLib
                               ParameterLib
-                              ProcessLib)
+                              ProcessLib
+                              spdlog::spdlog)
 
 # Set cpp definitions if the cmake option is enabled for the given process.
 foreach(process ${ProcessesList})
diff --git a/Applications/ApplicationsLib/LogogSetup.h b/Applications/ApplicationsLib/LogogSetup.h
deleted file mode 100644
index c4812fd0bd6aeaa9a00b668642afce5fa56d84f2..0000000000000000000000000000000000000000
--- a/Applications/ApplicationsLib/LogogSetup.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * \copyright
- * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
- *            Distributed under a Modified BSD License.
- *              See accompanying file LICENSE.txt or
- *              http://www.opengeosys.org/project/license
- *
- */
-
-#pragma once
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include <logog/include/logog.hpp>
-
-#include "BaseLib/LogogSimpleFormatter.h"
-
-namespace ApplicationsLib
-{
-
-/// Initialization and shutting down of the logog library.
-class LogogSetup final
-{
-public:
-
-    LogogSetup()
-    {
-        LOGOG_INITIALIZE();
-        logog_cout = std::make_unique<logog::Cout>();
-        setFormatter(std::make_unique<BaseLib::LogogSimpleFormatter>());
-    }
-
-    ~LogogSetup()
-    {
-        // Objects have to be deleted before shutdown
-        fmt.reset(nullptr);
-        logog_cout.reset(nullptr);
-        LOGOG_SHUTDOWN();
-    }
-
-    void setFormatter(std::unique_ptr<logog::Formatter>&& formatter)
-    {
-        fmt = std::move(formatter);
-        logog_cout->SetFormatter(*fmt);
-    }
-
-    void setLevel(LOGOG_LEVEL_TYPE level)
-    {
-        logog::SetDefaultLevel(level);
-    }
-
-    void setLevel(std::string const & level)
-    {
-        std::map<std::string, LOGOG_LEVEL_TYPE> foo =
-        {
-            { "none", LOGOG_LEVEL_NONE },
-            { "emergency", LOGOG_LEVEL_EMERGENCY },
-            { "alert", LOGOG_LEVEL_ALERT},
-            { "critical", LOGOG_LEVEL_CRITICAL },
-            { "error", LOGOG_LEVEL_ERROR },
-            { "warn", LOGOG_LEVEL_WARN },
-            { "info", LOGOG_LEVEL_INFO },
-            { "debug", LOGOG_LEVEL_DEBUG },
-            { "all", LOGOG_LEVEL_ALL }
-        };
-
-
-        LOGOG_LEVEL_TYPE level_type = LOGOG_LEVEL_ALL;
-        if(foo.find(level) != foo.end())
-            level_type = foo[level];
-        else
-            WARN("'%s' is not a valid log level! 'all' is used instead.", level.c_str());
-        setLevel(level_type);
-    }
-
-private:
-    std::unique_ptr<logog::Formatter> fmt;
-    std::unique_ptr<logog::Cout> logog_cout;
-};
-
-}  // namespace ApplicationsLib
diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp
index b4323809ba4ee2b78caf464aac3db0b266733d2c..252444ea3e2cff9ca4a42a2fc9f6a04580d90bc1 100644
--- a/Applications/ApplicationsLib/ProjectData.cpp
+++ b/Applications/ApplicationsLib/ProjectData.cpp
@@ -15,7 +15,7 @@
 
 #include <algorithm>
 #include <cctype>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 #include <set>
 
 #ifdef OGS_USE_PYTHON
@@ -25,7 +25,7 @@
 #include "BaseLib/Algorithm.h"
 #include "BaseLib/ConfigTree.h"
 #include "BaseLib/FileTools.h"
-
+#include "BaseLib/StringTools.h"
 #include "GeoLib/GEOObjects.h"
 #include "MaterialLib/MPL/CreateMedium.h"
 #include "MathLib/Curve/CreatePiecewiseLinearCurve.h"
@@ -33,7 +33,6 @@
 #include "MeshGeoToolsLib/CreateSearchLength.h"
 #include "MeshGeoToolsLib/SearchLength.h"
 #include "MeshLib/Mesh.h"
-
 #include "NumLib/ODESolver/ConvergenceCriterion.h"
 #include "ProcessLib/CreateJacobianAssembler.h"
 #include "ProcessLib/DeactivatedSubdomain.h"
@@ -120,7 +119,7 @@ namespace
 {
 void readGeometry(std::string const& fname, GeoLib::GEOObjects& geo_objects)
 {
-    DBUG("Reading geometry file '%s'.", fname.c_str());
+    DBUG("Reading geometry file '{:s}'.", fname.c_str());
     GeoLib::IO::BoostXmlGmlInterface gml_reader(geo_objects);
     gml_reader.readFile(fname);
 }
@@ -131,13 +130,13 @@ std::unique_ptr<MeshLib::Mesh> readSingleMesh(
 {
     std::string const mesh_file = BaseLib::copyPathToFileName(
         mesh_config_parameter.getValue<std::string>(), project_directory);
-    DBUG("Reading mesh file '%s'.", mesh_file.c_str());
+    DBUG("Reading mesh file '{:s}'.", mesh_file.c_str());
 
     auto mesh = std::unique_ptr<MeshLib::Mesh>(
         MeshLib::IO::readMeshFromFile(mesh_file));
     if (!mesh)
     {
-        OGS_FATAL("Could not read mesh from '%s' file. No mesh added.",
+        OGS_FATAL("Could not read mesh from '{:s}' file. No mesh added.",
                   mesh_file.c_str());
     }
 
@@ -230,8 +229,8 @@ boost::optional<ParameterLib::CoordinateSystem> parseLocalCoordinateSystem(
     if (dimension != 2 && dimension != 3)
     {
         OGS_FATAL(
-            "Basis vector parameter '%s' must have two or three components, "
-            "but it has %d.",
+            "Basis vector parameter '{:s}' must have two or three components, "
+            "but it has {:d}.",
             basis_vector_0.name.c_str(), dimension);
     }
 
@@ -316,7 +315,7 @@ ProjectData::ProjectData(BaseLib::ConfigTree const& project_config,
             if (!_local_coordinate_system)
             {
                 OGS_FATAL(
-                    "The parameter '%s' is using the local coordinate system "
+                    "The parameter '{:s}' is using the local coordinate system "
                     "but no local coordinate system was provided.",
                     parameter->name.c_str());
             }
@@ -379,7 +378,7 @@ void ProjectData::parseProcessVariables(
                                               _parameters};
         if (!names.insert(pv.getName()).second)
         {
-            OGS_FATAL("A process variable with name `%s' already exists.",
+            OGS_FATAL("A process variable with name `{:s}' already exists.",
                       pv.getName().c_str());
         }
 
@@ -404,7 +403,7 @@ std::vector<std::string> ProjectData::parseParameters(
             ParameterLib::createParameter(parameter_config, _mesh_vec, _curves);
         if (!names.insert(p->name).second)
         {
-            OGS_FATAL("A parameter with name `%s' already exists.",
+            OGS_FATAL("A parameter with name `{:s}' already exists.",
                       p->name.c_str());
         }
 
@@ -468,7 +467,7 @@ void ProjectData::parseMedia(
                     it != end(m_id))
                 {
                     OGS_FATAL(
-                        "Could not parse material ID's from '%s'. Please "
+                        "Could not parse material ID's from '{:s}'. Please "
                         "separate multiple material ID's by comma only. "
                         "Invalid character: '%c'",
                         m_id.c_str(), *it);
@@ -482,7 +481,7 @@ void ProjectData::parseMedia(
             {
                 OGS_FATAL(
                     "Multiple media were specified for the same material id "
-                    "'%d'. "
+                    "'{:d}'. "
                     "Keep in mind, that if no material id is specified, it is "
                     "assumed to be 0 by default.",
                     id);
@@ -770,7 +769,7 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config,
                 default:
                     OGS_FATAL(
                         "SMALL_DEFORMATION_NONLOCAL process does not support "
-                        "given dimension %d",
+                        "given dimension {:d}",
                         _mesh_vec[0]->getDimension());
             }
         }
@@ -956,7 +955,7 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config,
         else
 #endif
         {
-            OGS_FATAL("Unknown process type: %s", type.c_str());
+            OGS_FATAL("Unknown process type: {:s}", type.c_str());
         }
 
         if (BaseLib::containsIf(
@@ -965,7 +964,7 @@ void ProjectData::parseProcesses(BaseLib::ConfigTree const& processes_config,
                     return p->name == name;
                 }))
         {
-            OGS_FATAL("The process name '%s' is not unique.", name.c_str());
+            OGS_FATAL("The process name '{:s}' is not unique.", name.c_str());
         }
         _processes.push_back(std::move(process));
     }
diff --git a/Applications/ApplicationsLib/TestDefinition.cpp b/Applications/ApplicationsLib/TestDefinition.cpp
index 36586d543e4851f4cca99f748e2068a3b53c9e45..a7fcdc14147b184f1f0c4b680d27648dfa70c52f 100644
--- a/Applications/ApplicationsLib/TestDefinition.cpp
+++ b/Applications/ApplicationsLib/TestDefinition.cpp
@@ -35,19 +35,20 @@ bool isConvertibleToDouble(std::string const& s)
     }
     catch (...)
     {
-        OGS_FATAL("The given string '%s' is not convertible to double.",
+        OGS_FATAL("The given string '{:s}' is not convertible to double.",
                   s.c_str());
     }
     if (pos != s.size())
     {
         OGS_FATAL(
-            "Only %d characters were used for double conversion of string '%s'",
+            "Only {:d} characters were used for double conversion of string "
+            "'{:s}'",
             pos, s.c_str());
     }
 
     if (std::isnan(value))
     {
-        OGS_FATAL("The given string '%s' results in a NaN value.", s.c_str());
+        OGS_FATAL("The given string '{:s}' results in a NaN value.", s.c_str());
     }
     return true;
 }
@@ -67,7 +68,7 @@ std::string findVtkdiff()
             std::getenv("VTKDIFF_EXE"))
     {
         std::string const vtkdiff_exe{vtkdiff_exe_environment_variable};
-        DBUG("VTKDIFF_EXE set to %s.", vtkdiff_exe.c_str());
+        DBUG("VTKDIFF_EXE set to {:s}.", vtkdiff_exe.c_str());
 
         //
         // Sanity checks.
@@ -79,7 +80,7 @@ std::string findVtkdiff()
             {
                 OGS_FATAL(
                     "The VTKDIFF_EXE environment variable does not point to "
-                    "'vtkdiff'. VTKDIFF_EXE='%s'",
+                    "'vtkdiff'. VTKDIFF_EXE='{:s}'",
                     vtkdiff_exe.c_str());
             }
         }
@@ -88,7 +89,7 @@ std::string findVtkdiff()
             {
                 OGS_FATAL(
                     "The VTKDIFF_EXE points to a non-existing file. "
-                    "VTKDIFF_EXE='%s'",
+                    "VTKDIFF_EXE='{:s}'",
                     vtkdiff_exe.c_str());
             }
         }
@@ -110,8 +111,9 @@ std::string findVtkdiff()
             return vtkdiff_exe;
         }
         WARN(
-            "Calling %s from the VTKDIFF_EXE environment variable didn't work "
-            "as expected. Return value was %d.",
+            "Calling {:s} from the VTKDIFF_EXE environment variable didn't "
+            "work "
+            "as expected. Return value was {:d}.",
             vtkdiff_exe.c_str(), return_value);
     }
 
@@ -160,7 +162,7 @@ TestDefinition::TestDefinition(BaseLib::ConfigTree const& config_tree,
         std::string const& field_name =
             //! \ogs_file_param{prj__test_definition__vtkdiff__field}
             vtkdiff_config.getConfigParameter<std::string>("field");
-        DBUG("vtkdiff will compare field '%s'.", field_name.c_str());
+        DBUG("vtkdiff will compare field '{:s}'.", field_name.c_str());
 
 #ifdef USE_PETSC
         int rank;
@@ -192,7 +194,7 @@ TestDefinition::TestDefinition(BaseLib::ConfigTree const& config_tree,
             !isConvertibleToDouble(absolute_tolerance))
         {
             OGS_FATAL(
-                "The absolute tolerance value '%s' is not convertible to "
+                "The absolute tolerance value '{:s}' is not convertible to "
                 "double.",
                 absolute_tolerance.c_str());
         }
@@ -207,7 +209,7 @@ TestDefinition::TestDefinition(BaseLib::ConfigTree const& config_tree,
             !isConvertibleToDouble(relative_tolerance))
         {
             OGS_FATAL(
-                "The relative tolerance value '%s' is not convertible to "
+                "The relative tolerance value '{:s}' is not convertible to "
                 "double.",
                 relative_tolerance.c_str());
         }
@@ -222,7 +224,7 @@ TestDefinition::TestDefinition(BaseLib::ConfigTree const& config_tree,
             safeString(field_name) + " " + safeString(reference_filename) +
             " " + safeString(output_filename) + " " +
             absolute_tolerance_parameter + " " + relative_tolerance_parameter;
-        INFO("Will run '%s'", command_line.c_str());
+        INFO("Will run '{:s}'", command_line.c_str());
         _command_lines.emplace_back(std::move(command_line));
     }
 }
@@ -236,7 +238,7 @@ bool TestDefinition::runTests() const
                   int const return_value = std::system(command_line.c_str());
                   if (return_value != 0)
                   {
-                      WARN("Return value %d was returned by '%s'.",
+                      WARN("Return value {:d} was returned by '{:s}'.",
                            return_value, command_line.c_str());
                   }
                   return return_value;
diff --git a/Applications/CLI/ogs.cpp b/Applications/CLI/ogs.cpp
index a77d5d08599b35023ed74a3c445c214264380b15..5d8fff6658a191ebdee644512fc7efe210204979 100644
--- a/Applications/CLI/ogs.cpp
+++ b/Applications/CLI/ogs.cpp
@@ -10,7 +10,9 @@
  *
  */
 
+#include <spdlog/spdlog.h>
 #include <tclap/CmdLine.h>
+
 #include <chrono>
 
 #ifndef _WIN32
@@ -31,10 +33,8 @@
 #include "BaseLib/DateTools.h"
 #include "BaseLib/FileTools.h"
 #include "BaseLib/RunTime.h"
-#include "BaseLib/TemplateLogogFormatterSuppressedGCC.h"
 
 #include "Applications/ApplicationsLib/LinearSolverLibrarySetup.h"
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/ApplicationsLib/ProjectData.h"
 #include "Applications/ApplicationsLib/TestDefinition.h"
 #include "Applications/InSituLib/Adaptor.h"
@@ -123,11 +123,15 @@ int main(int argc, char* argv[])
         std::cout.setf(std::ios::unitbuf);
     }
 
-    ApplicationsLib::LogogSetup logog_setup;
-    logog_setup.setLevel(log_level_arg.getValue());
+    BaseLib::setConsoleLogLevel(log_level_arg.getValue());
+    spdlog::set_pattern("%^%l:%$ %v");
+    spdlog::set_error_handler([](const std::string& msg) {
+        std::cerr << "spdlog error: " << msg << std::endl;
+        OGS_FATAL("spdlog logger error occured.");
+    });
 
-    INFO("This is OpenGeoSys-6 version %s.",
-         GitInfoLib::GitInfo::ogs_version.c_str());
+    INFO("This is OpenGeoSys-6 version {:s}.",
+         GitInfoLib::GitInfo::ogs_version);
 
 #ifndef _WIN32  // On windows this command line option is not present.
     // Enable floating point exceptions
@@ -151,7 +155,7 @@ int main(int argc, char* argv[])
     {
         auto const start_time = std::chrono::system_clock::now();
         auto const time_str = BaseLib::formatDate(start_time);
-        INFO("OGS started on %s.", time_str.c_str());
+        INFO("OGS started on {:s}.", time_str);
     }
 
     std::unique_ptr<ApplicationsLib::TestDefinition> test_definition;
@@ -169,10 +173,11 @@ int main(int argc, char* argv[])
             controller->Initialize(&argc, &argv, 1);
             vtkMPIController::SetGlobalController(controller);
 
-            logog_setup.setFormatter(
-                std::make_unique<BaseLib::TemplateLogogFormatterSuppressedGCC<
-                    TOPIC_LEVEL_FLAG | TOPIC_FILE_NAME_FLAG |
-                    TOPIC_LINE_NUMBER_FLAG>>());
+            {   // Can be called only after MPI_INIT.
+                int mpi_rank;
+                MPI_Comm_rank(PETSC_COMM_WORLD, &mpi_rank);
+                spdlog::set_pattern(fmt::format("[{}] %^%l:%$ %v", mpi_rank));
+            }
 #endif
             run_time.start();
 
@@ -242,7 +247,7 @@ int main(int argc, char* argv[])
             if (isInsituConfigured)
                 InSituLib::Finalize();
 #endif
-            INFO("[time] Execution took %g s.", run_time.elapsed());
+            INFO("[time] Execution took {:g} s.", run_time.elapsed());
 
 #if defined(USE_PETSC)
             controller->Finalize(1);
@@ -264,7 +269,7 @@ int main(int argc, char* argv[])
     {
         auto const end_time = std::chrono::system_clock::now();
         auto const time_str = BaseLib::formatDate(end_time);
-        INFO("OGS terminated on %s.", time_str.c_str());
+        INFO("OGS terminated on {:s}.", time_str);
     }
 
     if (ogs_status == EXIT_FAILURE)
diff --git a/Applications/CLI/ogs_embedded_python.cpp b/Applications/CLI/ogs_embedded_python.cpp
index 2bb020fa9083af2259c61dba817247d3bafad8a4..08ad7b5df0acc645511440c27752c3a56c5964d8 100644
--- a/Applications/CLI/ogs_embedded_python.cpp
+++ b/Applications/CLI/ogs_embedded_python.cpp
@@ -11,7 +11,7 @@
 
 #include <pybind11/embed.h>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "ProcessLib/BoundaryCondition/Python/BHEInflowPythonBoundaryConditionModule.h"
 #include "ProcessLib/BoundaryCondition/Python/PythonBoundaryConditionModule.h"
diff --git a/Applications/DataExplorer/DataExplorer.cmake b/Applications/DataExplorer/DataExplorer.cmake
index e67925f37bc30495f26245a795161e82aeac6416..5feab093766b872cca73695316aacdd9dbe60bd0 100644
--- a/Applications/DataExplorer/DataExplorer.cmake
+++ b/Applications/DataExplorer/DataExplorer.cmake
@@ -49,7 +49,7 @@ target_link_libraries(DataExplorer
     Qt5::Widgets
     Qt5::Xml
     Qt5::Network
-    logog
+    spdlog::spdlog
     ${VTK_LIBRARIES}
 )
 
diff --git a/Applications/DataExplorer/DataView/CMakeLists.txt b/Applications/DataExplorer/DataView/CMakeLists.txt
index 8b65bdcea6c985712abdb95146aeb2e721f0f9d7..2849e9b86e0a9e7f144786406ded75aad5955752 100644
--- a/Applications/DataExplorer/DataView/CMakeLists.txt
+++ b/Applications/DataExplorer/DataView/CMakeLists.txt
@@ -135,7 +135,7 @@ target_link_libraries(QtDataView
                               QtDiagramView
                               QtStratView
                               DataHolderLib
-                              logog
+                              spdlog::spdlog
                               Qt5::Core
                               Qt5::Gui)
 
diff --git a/Applications/DataExplorer/DataView/DataExplorerSettingsDialog.cpp b/Applications/DataExplorer/DataView/DataExplorerSettingsDialog.cpp
index 0b694027c1fac28f7ff1f9cf3868439c872e026c..135088a8892ba17d16765896e9cc70dfcc80dceb 100644
--- a/Applications/DataExplorer/DataView/DataExplorerSettingsDialog.cpp
+++ b/Applications/DataExplorer/DataView/DataExplorerSettingsDialog.cpp
@@ -17,7 +17,7 @@
 #include <QFileDialog>
 #include <QSettings>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "OGSError.h"
 
diff --git a/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt b/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt
index 96c1a84c45a68522800006986dbcbbc68c3bc59d..7264261894395b2a491efc67f073a3bfec1a5476 100644
--- a/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt
+++ b/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt
@@ -37,7 +37,7 @@ target_link_libraries(QtDiagramView
                               QtBase
                               DataHolderLib
                               Qt5::Gui
-                              logog)
+                              spdlog::spdlog)
 
 add_autogen_include(QtDiagramView)
 
diff --git a/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp b/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp
index e3231e598ee2225013e288a5cc7519e7025224c8..4ca3bbd21df8f2e86b792644c3e19c8f5f22691c 100644
--- a/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp
+++ b/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp
@@ -15,7 +15,7 @@
 #include "DiagramList.h"
 #include "GetDateTime.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "DateTools.h"
 #include "StringTools.h"
@@ -220,7 +220,8 @@ int DiagramList::readList(const QString &path, std::vector<DiagramList*> &lists)
             }
             else
             {
-                WARN("DiagramList::readList(): Unexpected format in line %d.", line_count);
+                WARN("DiagramList::readList(): Unexpected format in line {:d}.",
+                     line_count);
                 file.close();
                 return 0;
             }
diff --git a/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp b/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp
index da46c1e378f61dd0b6ac2fdffe9dfd5563597ce5..1607922052d4c29860da79d867a7ebcace70e1e7 100644
--- a/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp
+++ b/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp
@@ -15,7 +15,7 @@
 #include <fstream>
 #include <memory>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "DirectConditionGenerator.h"
 
@@ -104,7 +104,7 @@ const std::vector< std::pair<std::size_t,double> >& DirectConditionGenerator::di
     }
     catch (std::runtime_error const& e)
     {
-        WARN("%s", e.what());
+        WARN("{:s}", e.what());
         return _direct_values;
     }
 
diff --git a/Applications/DataExplorer/DataView/GEOModels.cpp b/Applications/DataExplorer/DataView/GEOModels.cpp
index dabe3c4101a999b2c71a995e679264a3c19f88d0..77dca677f6b3963899bdcc00e501ca9a1b5d8b74 100644
--- a/Applications/DataExplorer/DataView/GEOModels.cpp
+++ b/Applications/DataExplorer/DataView/GEOModels.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "GEOModels.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Applications/FileIO/Legacy/createSurface.h"
 #include "GeoTreeModel.h"
@@ -70,7 +70,7 @@ void GEOModels::updateGeometry(const std::string &geo_name)
         }
     }
     else
-        ERR("GEOModels::updateGeometry() - Geometry '%s' not found.",
+        ERR("GEOModels::updateGeometry() - Geometry '{:s}' not found.",
             geo_name.c_str());
 }
 
@@ -250,7 +250,7 @@ void GEOModels::addNameForElement(std::string const& geometry_name,
         _geo_objects.getSurfaceVecObj(geometry_name)->setNameForElement(id, new_name);
     }
     else
-        ERR("GEOModels::addNameForElement() - Unknown GEOTYPE %s.",
+        ERR("GEOModels::addNameForElement() - Unknown GEOTYPE {:s}.",
             GeoLib::convertGeoTypeToString(object_type).c_str());
 }
 
@@ -290,6 +290,6 @@ void GEOModels::addNameForObjectPoints(const std::string &geometry_name,
         }
     }
     else
-        ERR("GEOModels::addNameForObjectPoints() - Unknown GEOTYPE %s.",
+        ERR("GEOModels::addNameForObjectPoints() - Unknown GEOTYPE {:s}.",
             GeoLib::convertGeoTypeToString(object_type).c_str());
 }
diff --git a/Applications/DataExplorer/DataView/GeoOnMeshMappingDialog.cpp b/Applications/DataExplorer/DataView/GeoOnMeshMappingDialog.cpp
index f6f59149c3ec400ae24c6d7aaafd92a39931022e..0b0a506ab74ba2f43ecea2b7ba72df0293d2b1fa 100644
--- a/Applications/DataExplorer/DataView/GeoOnMeshMappingDialog.cpp
+++ b/Applications/DataExplorer/DataView/GeoOnMeshMappingDialog.cpp
@@ -15,7 +15,7 @@
 #include "GeoOnMeshMappingDialog.h"
 #include "Mesh.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "OGSError.h"
 
diff --git a/Applications/DataExplorer/DataView/GeoTreeModel.cpp b/Applications/DataExplorer/DataView/GeoTreeModel.cpp
index 5ca4c7b664f89db4172a144e28554137324d0cae..f22a2418fb290fc335e8861b872a75616f802f9c 100644
--- a/Applications/DataExplorer/DataView/GeoTreeModel.cpp
+++ b/Applications/DataExplorer/DataView/GeoTreeModel.cpp
@@ -12,7 +12,7 @@
  *
  */
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoObjectListItem.h"
 #include "GeoTreeItem.h"
@@ -78,8 +78,8 @@ void GeoTreeModel::addPointList(QString geoName, GeoLib::PointVec const& pointVe
                               ->setData(4, QString::fromStdString(pnt->first)));
     }
 
-    INFO("Geometry '%s' built. %d points added.", geoName.toStdString().c_str(),
-         nPoints);
+    INFO("Geometry '{:s}' built. {:d} points added.",
+         geoName.toStdString().c_str(), nPoints);
 
     endResetModel();
 }
@@ -101,7 +101,7 @@ void GeoTreeModel::addPolylineList(QString geoName, GeoLib::PolylineVec const& p
     if (geo == nullptr)
     {
         ERR("GeoTreeModel::addPolylineList(): No corresponding geometry for "
-            "'%s' found.",
+            "'{:s}' found.",
             geoName.toStdString().c_str());
         return;
     }
@@ -182,7 +182,7 @@ void GeoTreeModel::addChildren(GeoObjectListItem* plyList,
                               ->setData(1, QString::fromStdString(pnt->first)));
     }
 
-    INFO("%d polylines added.", end_index - start_index);
+    INFO("{:d} polylines added.", end_index - start_index);
 }
 
 void GeoTreeModel::addSurfaceList(QString geoName, GeoLib::SurfaceVec const& surfaceVec)
@@ -202,7 +202,7 @@ void GeoTreeModel::addSurfaceList(QString geoName, GeoLib::SurfaceVec const& sur
     if (geo == nullptr)
     {
         ERR("GeoTreeModel::addSurfaceList(): No corresponding geometry for "
-            "'%s' found.",
+            "'{:s}' found.",
             geoName.toStdString().c_str());
         return;
     }
@@ -297,7 +297,7 @@ void GeoTreeModel::addChildren(GeoObjectListItem* sfcList,
                               ->setData(1, QString::fromStdString(pnt->first)));
     }
 
-    INFO("%d surfaces added.", end_index - start_index);
+    INFO("{:d} surfaces added.", end_index - start_index);
 }
 
 void GeoTreeModel::renameGeometry(std::string const& old_name,
@@ -316,7 +316,7 @@ void GeoTreeModel::renameGeometry(std::string const& old_name,
     {
         if (new_name == tree_item_entry->data(0).toString().toStdString())
         {
-            INFO("Found tree_item_entry with name '%s'.", new_name.c_str());
+            INFO("Found tree_item_entry with name '{:s}'.", new_name.c_str());
         }
     }
 }
diff --git a/Applications/DataExplorer/DataView/MeshAnalysisDialog.cpp b/Applications/DataExplorer/DataView/MeshAnalysisDialog.cpp
index 63df6becc07df1ae6af13cef2010192588f88efe..0df2ceb519e605a3114f0993e3828d887913b9d3 100644
--- a/Applications/DataExplorer/DataView/MeshAnalysisDialog.cpp
+++ b/Applications/DataExplorer/DataView/MeshAnalysisDialog.cpp
@@ -20,7 +20,7 @@
 
 #include "StrictDoubleValidator.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 MeshAnalysisDialog::MeshAnalysisDialog(
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& mesh_vec,
diff --git a/Applications/DataExplorer/DataView/MeshLayerEditDialog.cpp b/Applications/DataExplorer/DataView/MeshLayerEditDialog.cpp
index 823d56ca7339359142fe20fe18973e77c9f6436c..f147ec266babc82c2dc669c123517be8f941ccd6 100644
--- a/Applications/DataExplorer/DataView/MeshLayerEditDialog.cpp
+++ b/Applications/DataExplorer/DataView/MeshLayerEditDialog.cpp
@@ -15,7 +15,7 @@
 #include "MeshGenerators/LayeredVolume.h"
 #include "MeshLayerEditDialog.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "OGSError.h"
 #include "StringTools.h"
@@ -209,7 +209,7 @@ MeshLib::Mesh* MeshLayerEditDialog::createPrismMesh()
         auto const rasters = FileIO::readRasters(raster_paths);
         if (rasters && mapper.createLayers(*_msh, *rasters, minimum_thickness))
         {
-            INFO("Mesh construction time: %d ms.", myTimer0.elapsed());
+            INFO("Mesh construction time: {:d} ms.", myTimer0.elapsed());
             return mapper.getMesh("SubsurfaceMesh").release();
         }
         return nullptr;
@@ -220,7 +220,7 @@ MeshLib::Mesh* MeshLayerEditDialog::createPrismMesh()
     {
         layer_thickness.push_back(this->_edits[i]->text().toFloat());
     }
-    INFO("Mesh construction time: %d ms.", myTimer0.elapsed());
+    INFO("Mesh construction time: {:d} ms.", myTimer0.elapsed());
     return MeshLib::MeshLayerMapper::createStaticLayers(*_msh, layer_thickness);
 }
 
@@ -279,7 +279,7 @@ MeshLib::Mesh* MeshLayerEditDialog::createTetMesh()
         FileIO::TetGenInterface tetgen_interface;
         tetgen_interface.writeTetGenSmesh(filename.toStdString(), *tg_mesh, tg_attr);
     }
-    INFO("Mesh construction time: %d ms.", myTimer0.elapsed());
+    INFO("Mesh construction time: {:d} ms.", myTimer0.elapsed());
 
     return tg_mesh;
 }
diff --git a/Applications/DataExplorer/DataView/MeshModel.cpp b/Applications/DataExplorer/DataView/MeshModel.cpp
index 85ec9a95656b66d3bcfce14a1d18b00fdf4801b9..6aeaf947a437cc74b3b7f2a0cf1d4836274bdc51 100644
--- a/Applications/DataExplorer/DataView/MeshModel.cpp
+++ b/Applications/DataExplorer/DataView/MeshModel.cpp
@@ -14,10 +14,10 @@
 
 #include "MeshModel.h"
 
+#include <vtkUnstructuredGridAlgorithm.h>
 #include <QFileInfo>
 #include <QString>
-#include <vtkUnstructuredGridAlgorithm.h>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Applications/DataHolderLib/Project.h"
 #include "BaseLib/StringTools.h"
@@ -65,7 +65,7 @@ void MeshModel::addMeshObject(const MeshLib::Mesh* mesh)
 {
     beginResetModel();
 
-    INFO("name: %s", mesh->getName().c_str());
+    INFO("name: {:s}", mesh->getName().c_str());
     QVariant const display_name (QString::fromStdString(mesh->getName()));
     QList<QVariant> meshData;
     meshData << display_name << "" << "";
@@ -115,7 +115,8 @@ const MeshLib::Mesh* MeshModel::getMesh(const std::string &name) const
         }
     }
 
-    INFO("MeshModel::getMesh(): No entry found with name \"%s\".", name.c_str());
+    INFO("MeshModel::getMesh(): No entry found with name \"{:s}\".",
+         name.c_str());
     return nullptr;
 }
 
@@ -148,7 +149,8 @@ bool MeshModel::removeMesh(const std::string &name)
         }
     }
 
-    INFO("MeshModel::removeMesh(): No entry found with name \"%s\".", name.c_str());
+    INFO("MeshModel::removeMesh(): No entry found with name \"{:s}\".",
+         name.c_str());
     return false;
 }
 
@@ -214,6 +216,7 @@ vtkUnstructuredGridAlgorithm* MeshModel::vtkSource(const std::string &name) cons
         }
     }
 
-    INFO("MeshModel::vtkSource(): No entry found with name \"%s\".", name.c_str());
+    INFO("MeshModel::vtkSource(): No entry found with name \"{:s}\".",
+         name.c_str());
     return nullptr;
 }
diff --git a/Applications/DataExplorer/DataView/ProcessModel.cpp b/Applications/DataExplorer/DataView/ProcessModel.cpp
index eff66c7cc90c037219a9b449e9b0d998fc93e723..2a5738fbbb908dbe8365a205661319c6ff37e75f 100644
--- a/Applications/DataExplorer/DataView/ProcessModel.cpp
+++ b/Applications/DataExplorer/DataView/ProcessModel.cpp
@@ -10,17 +10,15 @@
 
 #include "ProcessModel.h"
 
-// ThirdParty/logog
-#include <logog/include/logog.hpp>
-
 #include <vtkPolyDataAlgorithm.h>
+
 #include <QFileInfo>
 
 #include "Applications/DataHolderLib/FemCondition.h"
+#include "BaseLib/Logging.h"
+#include "CondItem.h"
 #include "GeoLib/GEOObjects.h"
 #include "GeoLib/GeoObject.h"
-
-#include "CondItem.h"
 #include "GeoType.h"
 #include "ProcessVarItem.h"
 
diff --git a/Applications/DataExplorer/DataView/SaveMeshDialog.cpp b/Applications/DataExplorer/DataView/SaveMeshDialog.cpp
index 3710d19a12401e9f941ab5b17d6d8e850a6b9c6f..345d9b5c6f220e64ef3b1adcfb6fa9368447e6b1 100644
--- a/Applications/DataExplorer/DataView/SaveMeshDialog.cpp
+++ b/Applications/DataExplorer/DataView/SaveMeshDialog.cpp
@@ -17,7 +17,7 @@
 #include <QFileDialog>
 #include <QSettings>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/IO/VtkIO/VtuInterface.h"
 #include "MeshLib/IO/Legacy/MeshIO.h"
diff --git a/Applications/DataExplorer/DataView/StationTreeModel.cpp b/Applications/DataExplorer/DataView/StationTreeModel.cpp
index 8e34aa7e6bc4c11299ec664ef0abb0e66d579d5f..dd7a40ab23d26650c818fd07570ef315d7e9354b 100644
--- a/Applications/DataExplorer/DataView/StationTreeModel.cpp
+++ b/Applications/DataExplorer/DataView/StationTreeModel.cpp
@@ -14,7 +14,7 @@
 
 #include "StationTreeModel.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseItem.h"
 #include "OGSError.h"
diff --git a/Applications/DataExplorer/VtkVis/CMakeLists.txt b/Applications/DataExplorer/VtkVis/CMakeLists.txt
index 57815c579026788f6c8b77726da7ac8058dc5ca3..2f94c39172d349627749bfc162afd3bbd73fc688 100644
--- a/Applications/DataExplorer/VtkVis/CMakeLists.txt
+++ b/Applications/DataExplorer/VtkVis/CMakeLists.txt
@@ -142,7 +142,7 @@ target_link_libraries(VtkVis
                              DataHolderLib
                              QtBase
                              vtkIOImage
-                      PRIVATE MathLib ApplicationsFileIO Qt5::Gui logog)
+                      PRIVATE MathLib ApplicationsFileIO Qt5::Gui spdlog::spdlog)
 
 if(OGS_USE_NETCDF)
     target_link_libraries(VtkVis
diff --git a/Applications/DataExplorer/VtkVis/VtkAddFilterDialog.cpp b/Applications/DataExplorer/VtkVis/VtkAddFilterDialog.cpp
index 94e96ef77c8a5b8cae7d0e9be57023bc3f4150ca..6a39bc2d8cd63bcb6eb6d9ded30d0422450ae92b 100644
--- a/Applications/DataExplorer/VtkVis/VtkAddFilterDialog.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkAddFilterDialog.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkAddFilterDialog.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "VtkCompositeFilter.h"
 #include "VtkFilterFactory.h"
@@ -113,7 +113,8 @@ void VtkAddFilterDialog::on_buttonBox_accepted()
         }
         else
         {
-            ERR("VtkFilterFactory cannot create %s.", filterName.toStdString().c_str());
+            ERR("VtkFilterFactory cannot create {:s}.",
+                filterName.toStdString().c_str());
             return;
         }
     }
diff --git a/Applications/DataExplorer/VtkVis/VtkAlgorithmProperties.cpp b/Applications/DataExplorer/VtkVis/VtkAlgorithmProperties.cpp
index 2c0818643c13a486f3d1215e4638c04cc74b24a7..30641b492d636ac72305bd1c87d62d21ecda881d 100644
--- a/Applications/DataExplorer/VtkVis/VtkAlgorithmProperties.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkAlgorithmProperties.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkAlgorithmProperties.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkProperty.h>
 #include <vtkTexture.h>
@@ -111,7 +111,7 @@ QVariant VtkAlgorithmProperties::GetUserProperty(QString name) const
         return this->_algorithmUserProperties->value(name);
     }
 
-    ERR("Not a valid property: %s", name.toStdString().c_str());
+    ERR("Not a valid property: {:s}", name.toStdString().c_str());
     return QVariant();
 }
 
@@ -122,7 +122,7 @@ QList<QVariant> VtkAlgorithmProperties::GetUserVectorProperty(QString name) cons
         return this->_algorithmUserVectorProperties->value(name);
     }
 
-    ERR("Not a valid property: %s", name.toStdString().c_str());
+    ERR("Not a valid property: {:s}", name.toStdString().c_str());
     return QList<QVariant>();
 }
 
diff --git a/Applications/DataExplorer/VtkVis/VtkAppendArrayFilter.cpp b/Applications/DataExplorer/VtkVis/VtkAppendArrayFilter.cpp
index 66d693f2fa9c1f7c9cfb149c6fbb17da040fa7ad..8375577e77ded122bf3b0bc3fd80a3bba383037d 100644
--- a/Applications/DataExplorer/VtkVis/VtkAppendArrayFilter.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkAppendArrayFilter.cpp
@@ -15,7 +15,7 @@
 // ** VTK INCLUDES **
 #include "VtkAppendArrayFilter.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkCellData.h>
 #include <vtkDoubleArray.h>
diff --git a/Applications/DataExplorer/VtkVis/VtkColorByHeightFilter.cpp b/Applications/DataExplorer/VtkVis/VtkColorByHeightFilter.cpp
index b64d733785f58bcf8eac51876d9b2a0d68f116ee..fc47e8a1858bba88ae5b0a27bfa55dcbeefa73a8 100644
--- a/Applications/DataExplorer/VtkVis/VtkColorByHeightFilter.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkColorByHeightFilter.cpp
@@ -15,7 +15,7 @@
 // ** VTK INCLUDES **
 #include "VtkColorByHeightFilter.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "VtkColorLookupTable.h"
 
diff --git a/Applications/DataExplorer/VtkVis/VtkColorLookupTable.cpp b/Applications/DataExplorer/VtkVis/VtkColorLookupTable.cpp
index 8c7a1230691c9f2fc08a75c4d099b95796e1cdd0..00e7535337dd741238d9c4a799e44f7e2a29cf71 100644
--- a/Applications/DataExplorer/VtkVis/VtkColorLookupTable.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkColorLookupTable.cpp
@@ -17,7 +17,7 @@
 #include <cmath>
 #include <sstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkObjectFactory.h>
 
@@ -149,7 +149,7 @@ void VtkColorLookupTable::writeToFile(const std::string &filename)
     }
 
     strout << " done." << std::endl;
-    INFO("%s", strout.str().c_str());
+    INFO("{:s}", strout.str().c_str());
     out.close();
 }
 
diff --git a/Applications/DataExplorer/VtkVis/VtkCompositeTextureOnSurfaceFilter.cpp b/Applications/DataExplorer/VtkVis/VtkCompositeTextureOnSurfaceFilter.cpp
index 5076fc6b71dba9f2465a1cbc6bd1ca33fd1ded63..4106499b54cac0b8941571c9b22656fc806ac446 100644
--- a/Applications/DataExplorer/VtkVis/VtkCompositeTextureOnSurfaceFilter.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkCompositeTextureOnSurfaceFilter.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkCompositeTextureOnSurfaceFilter.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "VtkTextureOnSurfaceFilter.h"
 #include <vtkDataSetSurfaceFilter.h>
diff --git a/Applications/DataExplorer/VtkVis/VtkCompositeThresholdFilter.cpp b/Applications/DataExplorer/VtkVis/VtkCompositeThresholdFilter.cpp
index ede58aae2f04cea5174a6414f95ee1002ab98df2..3e8815af673ac524a8c8ed10cfc00002ee2ab930 100644
--- a/Applications/DataExplorer/VtkVis/VtkCompositeThresholdFilter.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkCompositeThresholdFilter.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkCompositeThresholdFilter.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkCellData.h>
 #include <vtkThreshold.h>
diff --git a/Applications/DataExplorer/VtkVis/VtkCustomInteractorStyle.cpp b/Applications/DataExplorer/VtkVis/VtkCustomInteractorStyle.cpp
index d522b0b7fae4ebc09086e7c8e36f9d0e34a764d9..0b0ebbb79621d2445dabd29e03006117be748714 100644
--- a/Applications/DataExplorer/VtkVis/VtkCustomInteractorStyle.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkCustomInteractorStyle.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkCustomInteractorStyle.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkActor.h>
 #include <vtkAlgorithmOutput.h>
@@ -154,11 +154,12 @@ void VtkCustomInteractorStyle::OnLeftButtonDown()
         picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
 
         double* worldPosition = picker->GetPickPosition();
-        INFO("Cell id is: %d", picker->GetCellId());
+        INFO("Cell id is: {:d}", picker->GetCellId());
 
         if(picker->GetCellId() != -1)
         {
-            INFO("Pick position is: %f %f %f", worldPosition[0], worldPosition[1], worldPosition[2]);
+            INFO("Pick position is: {:f} {:f} {:f}", worldPosition[0],
+                 worldPosition[1], worldPosition[2]);
 
             vtkSmartPointer<vtkIdTypeArray> ids =
                     vtkSmartPointer<vtkIdTypeArray>::New();
@@ -186,8 +187,10 @@ void VtkCustomInteractorStyle::OnLeftButtonDown()
                     vtkSmartPointer<vtkUnstructuredGrid>::New();
             selected->ShallowCopy(extractSelection->GetOutput());
 
-            INFO("There are %d points in the selection.", selected->GetNumberOfPoints());
-            INFO("There are %d cells in the selection.", selected->GetNumberOfCells());
+            INFO("There are {:d} points in the selection.",
+                 selected->GetNumberOfPoints());
+            INFO("There are {:d} cells in the selection.",
+                 selected->GetNumberOfCells());
 
             // check if the underlying object is a mesh and if so, send a signal to the element model for display of information about the picked element.
             vtkAlgorithm* data_set = picker->GetActor()->GetMapper()->GetInputConnection(0, 0)->GetProducer()->GetInputConnection(0,0)->GetProducer();
@@ -243,7 +246,7 @@ void VtkCustomInteractorStyle::OnRightButtonDown()
         picker->Pick(pos[0], pos[1], 0, this->GetDefaultRenderer());
 
         double* worldPosition = picker->GetPickPosition();
-        INFO("Cell id is: %d", picker->GetCellId());
+        INFO("Cell id is: {:d}", picker->GetCellId());
 
         if(picker->GetCellId() != -1)
         {
diff --git a/Applications/DataExplorer/VtkVis/VtkPickCallback.cpp b/Applications/DataExplorer/VtkVis/VtkPickCallback.cpp
index 3286f3ef4179ef7d517b3572f680c976687f381d..983cefe1f47e2ee8ceed97ee913401cafcf4d20d 100644
--- a/Applications/DataExplorer/VtkVis/VtkPickCallback.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkPickCallback.cpp
@@ -18,7 +18,7 @@
 #include <vtkActor.h>
 #include <vtkCellPicker.h>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 VtkPickCallback* VtkPickCallback::New()
 {
@@ -43,8 +43,8 @@ void VtkPickCallback::Execute(vtkObject* caller,
         }
 
         double* pos = picker->GetPickPosition();
-        INFO("Picked cell id is: %d", picker->GetCellId());
-        INFO("Picked position is: %f %f %f", pos[0], pos[1], pos[2]);
+        INFO("Picked cell id is: {:d}", picker->GetCellId());
+        INFO("Picked position is: {:f} {:f} {:f}", pos[0], pos[1], pos[2]);
     }
 }
 
diff --git a/Applications/DataExplorer/VtkVis/VtkPointsSource.cpp b/Applications/DataExplorer/VtkVis/VtkPointsSource.cpp
index 4639b11fbd0e4f1adf7c84f718a20b7faeb3b4d7..58c1d36230ff1e56a4d257ffc27653fb46cc45bb 100644
--- a/Applications/DataExplorer/VtkVis/VtkPointsSource.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkPointsSource.cpp
@@ -14,7 +14,7 @@
 
 #include "VtkPointsSource.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkCellArray.h>
 #include <vtkInformation.h>
diff --git a/Applications/DataExplorer/VtkVis/VtkPolylinesSource.cpp b/Applications/DataExplorer/VtkVis/VtkPolylinesSource.cpp
index 7f58d565497728306833fa8cc66074742e8eea57..e6159db1ef4fd097c651a2905689b6e8621f4558 100644
--- a/Applications/DataExplorer/VtkVis/VtkPolylinesSource.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkPolylinesSource.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkPolylinesSource.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkCellArray.h>
 #include <vtkCellData.h>
diff --git a/Applications/DataExplorer/VtkVis/VtkRaster.cpp b/Applications/DataExplorer/VtkVis/VtkRaster.cpp
index ec3d8f4436dade6e6149bf8785af84b7acb88c2c..592cea37641c7981d956bf5cdc3e2aa074451f79 100644
--- a/Applications/DataExplorer/VtkVis/VtkRaster.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkRaster.cpp
@@ -33,10 +33,11 @@
 #include "xtiffio.h"
 #endif
 
-#include <logog/include/logog.hpp>
 #include <memory>
 
 #include "Applications/FileIO/AsciiRasterInterface.h"
+#include "BaseLib/FileTools.h"
+#include "BaseLib/Logging.h"
 #include "BaseLib/StringTools.h"
 #include "GeoLib/Raster.h"
 
@@ -143,7 +144,10 @@ vtkImageAlgorithm* VtkRaster::loadImageFromTIFF(const std::string& fileName,
                 ++nImages;
             } while (TIFFReadDirectory(tiff));
             if (nImages > 1)
-                INFO("VtkRaster::loadImageFromTIFF() - File contains %d images. This method is not tested for this case.", nImages);
+                INFO(
+                    "VtkRaster::loadImageFromTIFF() - File contains {:d} "
+                    "images. This method is not tested for this case.",
+                    nImages);
 
             // get image size
             TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH,  &imgWidth);
@@ -340,7 +344,7 @@ bool VtkRaster::readWorldFile(std::string const& filename,
     std::ifstream in(world_file.c_str());
     if (!in.is_open())
     {
-        ERR("VtkRaster::readWorldFile(): Could not open file %s.",
+        ERR("VtkRaster::readWorldFile(): Could not open file {:s}.",
             filename.c_str());
         return false;
     }
@@ -365,8 +369,8 @@ bool VtkRaster::readWorldFile(std::string const& filename,
     double const delta_y = BaseLib::str2number<double>(line);
     if (delta_x != -delta_y)
         WARN(
-            "Anisotropic pixel size detected (%f vs %f). An isotropic "
-            "spacing of %f is assumed, be aware results may be wrong.",
+            "Anisotropic pixel size detected ({:f} vs {:f}). An isotropic "
+            "spacing of {:f} is assumed, be aware results may be wrong.",
             delta_x, delta_y, delta_x);
     // x-translation
     if (!std::getline(in, line))
diff --git a/Applications/DataExplorer/VtkVis/VtkStationSource.cpp b/Applications/DataExplorer/VtkVis/VtkStationSource.cpp
index ed63ad7babcfa546e08ceae4e4a71daaf4f00a79..0324a0ba4f722d8ff9ff03a22102c5df4a3f793e 100644
--- a/Applications/DataExplorer/VtkVis/VtkStationSource.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkStationSource.cpp
@@ -15,7 +15,7 @@
 // ** VTK INCLUDES **
 #include "VtkStationSource.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "StationBorehole.h"
 
@@ -235,7 +235,7 @@ std::size_t VtkStationSource::GetIndexByName( std::string const& name )
     }
 
     vtkIdType new_index = (_id_map.empty()) ? 0 : (max_key+1);
-    INFO("Key '%s' has been assigned index %d.", name.c_str(), new_index);
+    INFO("Key '{:s}' has been assigned index {:d}.", name.c_str(), new_index);
     _id_map.insert(std::pair<std::string, vtkIdType>(name, new_index));
     return new_index;
 }
diff --git a/Applications/DataExplorer/VtkVis/VtkTextureOnSurfaceFilter.cpp b/Applications/DataExplorer/VtkVis/VtkTextureOnSurfaceFilter.cpp
index 3ec3ed4039c3faa071d4e0695894cd9f24f802db..e7bc83ba2e3c3cbf55a3ccf66ccad4b81905b610 100644
--- a/Applications/DataExplorer/VtkVis/VtkTextureOnSurfaceFilter.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkTextureOnSurfaceFilter.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkTextureOnSurfaceFilter.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkCellData.h>
 #include <vtkFloatArray.h>
diff --git a/Applications/DataExplorer/VtkVis/VtkVisImageItem.cpp b/Applications/DataExplorer/VtkVis/VtkVisImageItem.cpp
index a0af1abf756f3cf598d420debb923d91dba0f6e3..0d3259e58ef3f13415dfcf3de34d8c90e7322aef 100644
--- a/Applications/DataExplorer/VtkVis/VtkVisImageItem.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkVisImageItem.cpp
@@ -15,7 +15,7 @@
 // ** INCLUDES **
 #include "VtkVisImageItem.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 
diff --git a/Applications/DataExplorer/VtkVis/VtkVisPipeline.cpp b/Applications/DataExplorer/VtkVis/VtkVisPipeline.cpp
index 1ed5f98cf0c900349cf44e740358f6d8e04e7899..ff323044c9fff31a15ee3ceeb3deb3f02cde652d 100644
--- a/Applications/DataExplorer/VtkVis/VtkVisPipeline.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkVisPipeline.cpp
@@ -42,8 +42,7 @@
 #include <QString>
 #include <QTime>
 
-
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/InterpolationAlgorithms/LinearIntervalInterpolation.h"
 #include "MeshLib/Mesh.h"
@@ -179,7 +178,7 @@ void VtkVisPipeline::loadFromFile(QString filename)
 #ifndef NDEBUG
     QTime myTimer;
     myTimer.start();
-    INFO("VTK Read: %s.", filename.toStdString().c_str());
+    INFO("VTK Read: {:s}.", filename.toStdString().c_str());
 #endif
 
     if (filename.size() > 0)
@@ -245,7 +244,7 @@ void VtkVisPipeline::loadFromFile(QString filename)
     }
 
 #ifndef NDEBUG
-    INFO("%d ms", myTimer.elapsed());
+    INFO("{:d} ms", myTimer.elapsed());
 #endif
 }
 
@@ -468,14 +467,14 @@ void VtkVisPipeline::listArrays(vtkDataSet* dataSet)
     if (dataSet)
     {
         vtkPointData* pointData = dataSet->GetPointData();
-        INFO("  #point data arrays: %d", pointData->GetNumberOfArrays());
+        INFO("  #point data arrays: {:d}", pointData->GetNumberOfArrays());
         for (int i = 0; i < pointData->GetNumberOfArrays(); i++)
-            INFO("    Name: %s", pointData->GetArrayName(i));
+            INFO("    Name: {:s}", pointData->GetArrayName(i));
 
         vtkCellData* cellData = dataSet->GetCellData();
-        INFO("  #cell data arrays: %d", cellData->GetNumberOfArrays());
+        INFO("  #cell data arrays: {:d}", cellData->GetNumberOfArrays());
         for (int i = 0; i < cellData->GetNumberOfArrays(); i++)
-            INFO("    Name: %s", cellData->GetArrayName(i));
+            INFO("    Name: {:s}", cellData->GetArrayName(i));
     }
     else
         ERR("VtkVisPipeline::listArrays(): not a valid vtkDataSet.");
diff --git a/Applications/DataExplorer/VtkVis/VtkVisPointSetItem.cpp b/Applications/DataExplorer/VtkVis/VtkVisPointSetItem.cpp
index 9f818c9953943d726b05cd8334474c3644a751ac..46ad898ef7ae3115e4a04eebf4e4d681be87e3b2 100644
--- a/Applications/DataExplorer/VtkVis/VtkVisPointSetItem.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkVisPointSetItem.cpp
@@ -22,7 +22,7 @@
 #include <QSettings>
 #include <QStringList>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 
diff --git a/Applications/DataExplorer/VtkVis/VtkVisTabWidget.cpp b/Applications/DataExplorer/VtkVis/VtkVisTabWidget.cpp
index ec6eee9911219ba172927b01bbf0c66c9e0135ff..6cdb96a410b84d62fc3d75089a0126220fb1e0d3 100644
--- a/Applications/DataExplorer/VtkVis/VtkVisTabWidget.cpp
+++ b/Applications/DataExplorer/VtkVis/VtkVisTabWidget.cpp
@@ -22,7 +22,7 @@
 #include "VtkVisImageItem.h"
 #include "VtkVisPipelineItem.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <vtkActor.h>
 #include <vtkImageChangeInformation.h>
diff --git a/Applications/DataExplorer/main.cpp b/Applications/DataExplorer/main.cpp
index 512f4a9075a77ff559a93570488761d256bb7cde..6e96e570563966ce3a90cbd95ead434f2db6fd1c 100644
--- a/Applications/DataExplorer/main.cpp
+++ b/Applications/DataExplorer/main.cpp
@@ -3,8 +3,8 @@
 #include <QApplication>
 #include <QSurfaceFormat>
 #include <QVTKOpenGLWidget.h>
-#include <logog/include/logog.hpp>
 #include <memory>
+#include "BaseLib/Logging.h"
 
 #ifdef VTKFBXCONVERTER_FOUND
 #include <fbxsdk.h>
@@ -16,7 +16,7 @@ FbxScene* lScene = nullptr;
 #include <vtkSmartPointer.h>
 
 #include "InfoLib/GitInfo.h"
-#include "BaseLib/LogogSimpleFormatter.h"
+#include "BaseLib/Logging.h"
 #include "VtkVis/VtkConsoleOutputWindow.h"
 
 int main(int argc, char* argv[])
@@ -31,10 +31,6 @@ int main(int argc, char* argv[])
     auto myOutputWindow = vtkSmartPointer<VtkConsoleOutputWindow>::New();
     vtkOutputWindow::SetInstance(myOutputWindow);
 
-    LOGOG_INITIALIZE();
-    auto* logogCout = new logog::Cout;
-    auto* formatter = new BaseLib::LogogSimpleFormatter;
-    logogCout->SetFormatter(*formatter);
     QApplication a(argc, argv);
     QApplication::setApplicationName("OpenGeoSys - Data Explorer");
     QApplication::setApplicationVersion(QString::fromStdString(
@@ -51,9 +47,6 @@ int main(int argc, char* argv[])
     }
     w->show();
     int returncode = QApplication::exec();
-    delete formatter;
-    delete logogCout;
-    LOGOG_SHUTDOWN();
 #ifdef VTKFBXCONVERTER_FOUND
     DestroySdkObjects(lSdkManager, true);
 #endif
diff --git a/Applications/DataExplorer/mainwindow.cpp b/Applications/DataExplorer/mainwindow.cpp
index 73b630a784b49e4e16de63ed46cd166e37d16be6..d609239d3910c049e457edf29c28613c8812c8c5 100644
--- a/Applications/DataExplorer/mainwindow.cpp
+++ b/Applications/DataExplorer/mainwindow.cpp
@@ -14,7 +14,7 @@
 
 #include "mainwindow.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 // Qt includes
 #include <QDate>
@@ -593,7 +593,7 @@ void MainWindow::loadFile(ImportFileType::type t, const QString &fileName)
             std::unique_ptr<MeshLib::Mesh> mesh(
                 MeshLib::IO::readMeshFromFile(fileName.toStdString()));
 #ifndef NDEBUG
-            INFO("Mesh loading time: %d ms.", myTimer0.elapsed());
+            INFO("Mesh loading time: {:d} ms.", myTimer0.elapsed());
             myTimer1.start();
 #endif
             if (mesh)
@@ -605,7 +605,7 @@ void MainWindow::loadFile(ImportFileType::type t, const QString &fileName)
                 OGSError::box("Failed to load mesh file.");
             }
 #ifndef NDEBUG
-            INFO("Mesh model setup time: %d ms.", myTimer1.elapsed());
+            INFO("Mesh model setup time: {:d} ms.", myTimer1.elapsed());
 #endif
         }
 
@@ -1130,7 +1130,7 @@ void MainWindow::callGMSH(std::vector<std::string> & selectedGeometries,
                 remove_command = "del ";
 #endif
                 remove_command += fileName.toStdString();
-                INFO("remove command: %s", remove_command.c_str());
+                INFO("remove command: {:s}", remove_command.c_str());
                 auto const return_value = system(remove_command.c_str());
                 if (return_value != 0)
                 {
diff --git a/Applications/DataHolderLib/CMakeLists.txt b/Applications/DataHolderLib/CMakeLists.txt
index 606d95218fd52ad88ebef6f397bb3cd84236127a..fc8691ffd085a555c45553be64a367aad3a3d2b4 100644
--- a/Applications/DataHolderLib/CMakeLists.txt
+++ b/Applications/DataHolderLib/CMakeLists.txt
@@ -4,4 +4,7 @@ get_source_files(SOURCES_DataHolderLib)
 # Library
 ogs_add_library(DataHolderLib ${SOURCES_DataHolderLib})
 
-target_link_libraries(DataHolderLib PUBLIC GeoLib MeshLib PRIVATE BaseLib logog)
+target_link_libraries(
+    DataHolderLib
+    PUBLIC GeoLib MeshLib
+    PRIVATE BaseLib spdlog::spdlog)
diff --git a/Applications/DataHolderLib/Color.cpp b/Applications/DataHolderLib/Color.cpp
index 6a7cc3f7ba470eda8ccb0482ac961f683403dec1..7feeba80fa3dceba2f1ef1202d242baa2f736142 100644
--- a/Applications/DataHolderLib/Color.cpp
+++ b/Applications/DataHolderLib/Color.cpp
@@ -14,7 +14,7 @@
 
 #include "Color.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 namespace DataHolderLib {
 
@@ -36,7 +36,7 @@ Color getColor(const std::string& id, std::map<std::string, Color>& colors)
 
     if (it == end(colors))
     {
-        WARN("Key '%s' not found in color lookup table.", id.c_str());
+        WARN("Key '{:s}' not found in color lookup table.", id.c_str());
         it = colors.insert({id, getRandomColor()}).first;
     }
 
diff --git a/Applications/DataHolderLib/Project.cpp b/Applications/DataHolderLib/Project.cpp
index 097367bea3919b0085cbf13a76c89080edc18ae8..a090d0e2be5147bb9f007ac25f6eb493e0d5b706 100644
--- a/Applications/DataHolderLib/Project.cpp
+++ b/Applications/DataHolderLib/Project.cpp
@@ -11,7 +11,7 @@
 #include "Project.h"
 
 #include <algorithm>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Algorithm.h"
 #include "BaseLib/FileTools.h"
diff --git a/Applications/FileIO/AsciiRasterInterface.cpp b/Applications/FileIO/AsciiRasterInterface.cpp
index 295263ee3a85645ce1880fb554952968015ba198..7dbf9aff0e226e188092f8333c4b644f517dd4b5 100644
--- a/Applications/FileIO/AsciiRasterInterface.cpp
+++ b/Applications/FileIO/AsciiRasterInterface.cpp
@@ -13,8 +13,8 @@
 
 #include "AsciiRasterInterface.h"
 
-#include <logog/include/logog.hpp>
 #include <boost/optional.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -44,7 +44,8 @@ GeoLib::Raster* AsciiRasterInterface::getRasterFromASCFile(std::string const& fn
     std::ifstream in(fname.c_str());
 
     if (!in.is_open()) {
-        WARN("Raster::getRasterFromASCFile(): Could not open file %s.", fname.c_str());
+        WARN("Raster::getRasterFromASCFile(): Could not open file {:s}.",
+             fname.c_str());
         return nullptr;
     }
 
@@ -68,7 +69,7 @@ GeoLib::Raster* AsciiRasterInterface::getRasterFromASCFile(std::string const& fn
         delete [] values;
         return raster;
     }
-    WARN("Raster::getRasterFromASCFile(): Could not read header of file %s",
+    WARN("Raster::getRasterFromASCFile(): Could not read header of file {:s}",
          fname.c_str());
     return nullptr;
 }
@@ -159,7 +160,8 @@ GeoLib::Raster* AsciiRasterInterface::getRasterFromSurferFile(std::string const&
     std::ifstream in(fname.c_str());
 
     if (!in.is_open()) {
-        ERR("Raster::getRasterFromSurferFile() - Could not open file %s", fname.c_str());
+        ERR("Raster::getRasterFromSurferFile() - Could not open file {:s}",
+            fname.c_str());
         return nullptr;
     }
 
@@ -191,7 +193,7 @@ GeoLib::Raster* AsciiRasterInterface::getRasterFromSurferFile(std::string const&
         delete [] values;
         return raster;
     }
-    ERR("Raster::getRasterFromASCFile() - could not read header of file %s",
+    ERR("Raster::getRasterFromASCFile() - could not read header of file {:s}",
         fname.c_str());
     return nullptr;
 }
diff --git a/Applications/FileIO/CMakeLists.txt b/Applications/FileIO/CMakeLists.txt
index 995e3fa864fadf73ae16e8dd475a77e5e1ef4be2..d3d3d45f5511005cbde6857fdd37803bbe62edad 100644
--- a/Applications/FileIO/CMakeLists.txt
+++ b/Applications/FileIO/CMakeLists.txt
@@ -29,8 +29,7 @@ target_link_libraries(ApplicationsFileIO
                              DataHolderLib
                              GeoLib
                              MathLib
-                             logog
-                      PRIVATE MeshLib GitInfoLib std::filesystem)
+                      PRIVATE MeshLib GitInfoLib std::filesystem spdlog::spdlog)
 
 if(OGS_BUILD_GUI)
     # Needed for the XmlPrjInterface, which links the DE/Base/OGSError.h.
diff --git a/Applications/FileIO/CsvInterface.cpp b/Applications/FileIO/CsvInterface.cpp
index 92c8c20f57997f1771c517a2c6a84eb76b29dbf4..f81125650e504b117f9c49a1a0459d334119e868 100644
--- a/Applications/FileIO/CsvInterface.cpp
+++ b/Applications/FileIO/CsvInterface.cpp
@@ -29,7 +29,7 @@ std::vector<std::string> CsvInterface::getColumnNames(std::string const& fname,
 
     if (!in.is_open())
     {
-        ERR("CsvInterface::readPoints(): Could not open file %s.",
+        ERR("CsvInterface::readPoints(): Could not open file {:s}.",
             fname.c_str());
         return std::vector<std::string>();
     }
@@ -65,7 +65,8 @@ int CsvInterface::readPoints(std::string const& fname, char delim,
     std::ifstream in(fname.c_str());
 
     if (!in.is_open()) {
-        ERR ("CsvInterface::readPoints(): Could not open file %s.", fname.c_str());
+        ERR("CsvInterface::readPoints(): Could not open file {:s}.",
+            fname.c_str());
         return -1;
     }
 
@@ -82,7 +83,9 @@ int CsvInterface::readPoints(std::string const& fname, char delim,
 
         if (fields.size() < 3)
         {
-            ERR ("Line %d contains not enough columns of data. Skipping line...", line_count);
+            ERR("Line {:d} contains not enough columns of data. Skipping "
+                "line...",
+                line_count);
             error_count++;
             continue;
         }
@@ -94,7 +97,8 @@ int CsvInterface::readPoints(std::string const& fname, char delim,
             point[2] = std::stod(*(++it));
             points.push_back(new GeoLib::Point(point[0], point[1], point[2]));
         } catch (const std::invalid_argument&) {
-            ERR ("Error converting data to coordinates in line %d.", line_count);
+            ERR("Error converting data to coordinates in line {:d}.",
+                line_count);
         }
     }
     return error_count;
@@ -110,7 +114,8 @@ int CsvInterface::readPoints(std::string const& fname, char delim,
     std::array<std::string, 3> const column_names = {{x_column_name, y_column_name, z_column_name}};
 
     if (!in.is_open()) {
-        ERR ("CsvInterface::readPoints(): Could not open file %s.", fname.c_str());
+        ERR("CsvInterface::readPoints(): Could not open file {:s}.",
+            fname.c_str());
         return -1;
     }
 
@@ -126,7 +131,7 @@ int CsvInterface::readPoints(std::string const& fname, char delim,
     {
         if (column_idx[i] == std::numeric_limits<std::size_t>::max())
         {
-            ERR("Column '%s' not found in file header.",
+            ERR("Column '{:s}' not found in file header.",
                 column_names[i].c_str());
             return -1;
         }
@@ -144,7 +149,8 @@ int CsvInterface::readPoints(std::string const& fname, char delim,
     std::ifstream in(fname.c_str());
 
     if (!in.is_open()) {
-        ERR ("CsvInterface::readPoints(): Could not open file %s.", fname.c_str());
+        ERR("CsvInterface::readPoints(): Could not open file {:s}.",
+            fname.c_str());
         return -1;
     }
 
@@ -181,7 +187,9 @@ int CsvInterface::readPoints(std::ifstream &in, char delim,
 
         if (fields.size() < column_idx[order[2]]+1)
         {
-            ERR ("Line %d contains not enough columns of data. Skipping line...", line_count);
+            ERR("Line {:d} contains not enough columns of data. Skipping "
+                "line...",
+                line_count);
             error_count++;
             continue;
         }
@@ -197,7 +205,8 @@ int CsvInterface::readPoints(std::ifstream &in, char delim,
             point[order[2]] = (column_idx[1] == column_idx[2]) ? 0 : std::stod(*it);
             points.push_back(new GeoLib::Point(point[0], point[1], point[2]));
         } catch (const std::invalid_argument&) {
-            ERR ("Error converting data to coordinates in line %d.", line_count);
+            ERR("Error converting data to coordinates in line {:d}.",
+                line_count);
             error_count++;
         }
     }
diff --git a/Applications/FileIO/CsvInterface.h b/Applications/FileIO/CsvInterface.h
index 43e2e14578280b40f0fb88558965473191fc18a9..069942d74aef039ab48ae0cb04191c424aa3ab57 100644
--- a/Applications/FileIO/CsvInterface.h
+++ b/Applications/FileIO/CsvInterface.h
@@ -13,8 +13,8 @@
 
 #pragma once
 
-#include <logog/include/logog.hpp>
 #include <boost/any.hpp>
+#include "BaseLib/Logging.h"
 
 #include <array>
 #include <fstream>
@@ -74,7 +74,9 @@ public:
             std::size_t const vec_size (getVectorSize(0));
             if (vec_size != vec.size())
             {
-                ERR ("Vector size does not match existing data (should be %d).", vec_size);
+                ERR("Vector size does not match existing data (should be "
+                    "{:d}).",
+                    vec_size);
                 return false;
             }
         }
@@ -153,7 +155,8 @@ public:
     {
         std::ifstream in(fname.c_str());
         if (!in.is_open()) {
-            ERR ("CsvInterface::readColumn(): Could not open file %s.", fname.c_str());
+            ERR("CsvInterface::readColumn(): Could not open file {:s}.",
+                fname.c_str());
             return -1;
         }
 
@@ -162,7 +165,7 @@ public:
         std::size_t const column_idx = CsvInterface::findColumn(line, delim, column_name);
         if (column_idx == std::numeric_limits<std::size_t>::max())
         {
-            ERR("Column '%s' not found in file header.", column_name.c_str());
+            ERR("Column '{:s}' not found in file header.", column_name.c_str());
             return -1;
         }
         return readColumn<T>(in, delim, data_array, column_idx);
@@ -175,7 +178,8 @@ public:
     {
         std::ifstream in(fname.c_str());
         if (!in.is_open()) {
-            ERR ("CsvInterface::readColumn(): Could not open file %s.", fname.c_str());
+            ERR("CsvInterface::readColumn(): Could not open file {:s}.",
+                fname.c_str());
             return -1;
         }
         return readColumn<T>(in, delim, data_array, column_idx);
@@ -204,7 +208,9 @@ private:
 
             if (fields.size() < column_idx+1)
             {
-                ERR ("Line %d contains not enough columns of data. Skipping line...", line_count);
+                ERR("Line {:d} contains not enough columns of data. Skipping "
+                    "line...",
+                    line_count);
                 error_count++;
                 continue;
             }
@@ -215,7 +221,7 @@ private:
             T value;
             if (!(stream >> value))
             {
-                ERR("Error reading value in line %d.", line_count);
+                ERR("Error reading value in line {:d}.", line_count);
                 error_count++;
                 continue;
             }
diff --git a/Applications/FileIO/FEFLOW/FEFLOWGeoInterface.cpp b/Applications/FileIO/FEFLOW/FEFLOWGeoInterface.cpp
index 2026465ca1459c45c73dea0cf24b2d6aece4abdc..9c5174961fcab355aaedb207ebc2767680ad6caf 100644
--- a/Applications/FileIO/FEFLOW/FEFLOWGeoInterface.cpp
+++ b/Applications/FileIO/FEFLOW/FEFLOWGeoInterface.cpp
@@ -17,7 +17,7 @@
 #include <QString>
 #include <QtXml/QDomDocument>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -34,7 +34,7 @@ void FEFLOWGeoInterface::readFEFLOWFile(const std::string& filename,
     std::ifstream in(filename.c_str());
     if (!in)
     {
-        ERR("FEFLOWGeoInterface::readFEFLOWFile(): Could not open file %s.",
+        ERR("FEFLOWGeoInterface::readFEFLOWFile(): Could not open file {:s}.",
             filename.c_str());
         return;
     }
diff --git a/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp b/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp
index 7adfd15467b1498190184fdbd896c5763799806b..273c94078a3ae8c674e436c85dbc4db5bd66dd9c 100644
--- a/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp
+++ b/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp
@@ -13,7 +13,7 @@
 
 #include <boost/algorithm/string/trim.hpp>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -33,7 +33,7 @@ MeshLib::Mesh* FEFLOWMeshInterface::readFEFLOWFile(const std::string& filename)
     std::ifstream in(filename.c_str());
     if (!in)
     {
-        ERR("FEFLOWMeshInterface::readFEFLOWFile(): Could not open file %s.",
+        ERR("FEFLOWMeshInterface::readFEFLOWFile(): Could not open file {:s}.",
             filename.c_str());
         return nullptr;
     }
@@ -131,7 +131,7 @@ MeshLib::Mesh* FEFLOWMeshInterface::readFEFLOWFile(const std::string& filename)
             if (eleType == MeshLib::MeshElemType::INVALID)
             {
                 ERR("FEFLOWInterface::readFEFLOWFile(): Unsupported element "
-                    "type with the number of node = %d and dim = %d",
+                    "type with the number of node = {:d} and dim = {:d}",
                     fem_dim.n_nodes_of_element, fem_class.dimension);
                 std::for_each(vec_nodes.begin(), vec_nodes.end(),
                               [](MeshLib::Node* nod)
@@ -276,7 +276,7 @@ void FEFLOWMeshInterface::readNodeCoordinates(
         // read the line containing the coordinates as string
         if (!std::getline(in, line_string))
         {
-            ERR("Could not read the node '%u'.", k);
+            ERR("Could not read the node '{:d}'.", k);
             for (auto* n : vec_nodes)
             {
                 delete n;
@@ -290,7 +290,7 @@ void FEFLOWMeshInterface::readNodeCoordinates(
         {
             if (!(line_stream >> (*vec_nodes[k])[i]))
             {
-                ERR("Could not parse coordinate %u of node '%u'.", i, k);
+                ERR("Could not parse coordinate {:d} of node '{:d}'.", i, k);
                 for (auto* n : vec_nodes)
                 {
                     delete n;
@@ -299,7 +299,7 @@ void FEFLOWMeshInterface::readNodeCoordinates(
             }
             if (!(line_stream >> dummy_char) && i < 2)  // read comma
             {
-                ERR("Could not parse node '%u'.", k);
+                ERR("Could not parse node '{:d}'.", k);
                 for (auto* n : vec_nodes)
                 {
                     delete n;
@@ -691,7 +691,7 @@ void FEFLOWMeshInterface::readELEMENTALSETS(
                 set_name = line_string.substr(0, pos);
                 ids = line_string.substr(pos + 1);
             }
-            INFO("Found an element group - %s", set_name.data());
+            INFO("Found an element group - {:s}", set_name.data());
             str_idList += compressSpaces(ids);
         }
         else
diff --git a/Applications/FileIO/GMSInterface.cpp b/Applications/FileIO/GMSInterface.cpp
index 1ddb17a718db4cfb260e807ee623a18f6fad3532..cb9a9e165fab5ea2feab00f88c135f0dc6d411b5 100644
--- a/Applications/FileIO/GMSInterface.cpp
+++ b/Applications/FileIO/GMSInterface.cpp
@@ -19,9 +19,9 @@
 
 #include <fstream>
 #include <list>
-#include <logog/include/logog.hpp>
 
 #include "BaseLib/FileTools.h"
+#include "BaseLib/Logging.h"
 #include "BaseLib/StringTools.h"
 #include "GeoLib/StationBorehole.h"
 #include "MeshLib/Elements/Prism.h"
@@ -50,7 +50,7 @@ int GMSInterface::readBoreholesFromGMS(std::vector<GeoLib::Point*>* boreholes,
     std::ifstream in(filename.c_str());
     if (!in.is_open())
     {
-        ERR("GMSInterface::readBoreholeFromGMS(): Could not open file %s.",
+        ERR("GMSInterface::readBoreholeFromGMS(): Could not open file {:s}.",
             filename.c_str());
         return 0;
     }
@@ -92,7 +92,7 @@ int GMSInterface::readBoreholesFromGMS(std::vector<GeoLib::Point*>* boreholes,
                 else
                     WARN(
                         "GMSInterface::readBoreholeFromGMS(): Skipped layer "
-                        "'%s' in borehole '%s' because of thickness 0.0.",
+                        "'{:s}' in borehole '{:s}' because of thickness 0.0.",
                         sName.c_str(), cName.c_str());
             }
             else  // add new borehole
@@ -186,7 +186,7 @@ MeshLib::Mesh* GMSInterface::readGMS3DMMesh(const std::string& filename)
     std::ifstream in(filename.c_str());
     if (!in.is_open())
     {
-        ERR("GMSInterface::readGMS3DMMesh(): Could not open file %s.",
+        ERR("GMSInterface::readGMS3DMMesh(): Could not open file {:s}.",
             filename.c_str());
         return nullptr;
     }
@@ -282,7 +282,7 @@ MeshLib::Mesh* GMSInterface::readGMS3DMMesh(const std::string& filename)
         else  // default
         {
             WARN(
-                "GMSInterface::readGMS3DMMesh() - Element type '%s' not "
+                "GMSInterface::readGMS3DMMesh() - Element type '{:s}' not "
                 "recognised.",
                 element_id.c_str());
             return nullptr;
diff --git a/Applications/FileIO/Gmsh/GMSHAdaptiveMeshDensity.cpp b/Applications/FileIO/Gmsh/GMSHAdaptiveMeshDensity.cpp
index 605ccce75e20f0f7dccc3befb9dc6ec64b115113..4e5e43dbe54be306bd2684558a737d2824c6358b 100644
--- a/Applications/FileIO/Gmsh/GMSHAdaptiveMeshDensity.cpp
+++ b/Applications/FileIO/Gmsh/GMSHAdaptiveMeshDensity.cpp
@@ -15,7 +15,7 @@
 
 #include <list>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Point.h"
 #include "GeoLib/Polygon.h"
@@ -86,7 +86,10 @@ void GMSHAdaptiveMeshDensity::addPoints(std::vector<GeoLib::Point const*> const&
 {
     // *** QuadTree - insert points
     const std::size_t n_pnts(pnts.size());
-    DBUG("GMSHAdaptiveMeshDensity::addPoints(): Inserting %d points into quadtree.", n_pnts);
+    DBUG(
+        "GMSHAdaptiveMeshDensity::addPoints(): Inserting {:d} points into "
+        "quadtree.",
+        n_pnts);
     for (std::size_t k(0); k < n_pnts; k++)
     {
         _quad_tree->addPoint(pnts[k]);
diff --git a/Applications/FileIO/Gmsh/GMSHInterface.cpp b/Applications/FileIO/Gmsh/GMSHInterface.cpp
index 987835480b28411eef57fc2460502c89fe4c7ca1..a2a8c3126f3ecec814ed0835ff03f03908be0328 100644
--- a/Applications/FileIO/Gmsh/GMSHInterface.cpp
+++ b/Applications/FileIO/Gmsh/GMSHInterface.cpp
@@ -11,7 +11,7 @@
 #include <memory>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
@@ -150,12 +150,12 @@ int GMSHInterface::writeGMSHInputFile(std::ostream& out)
     }
     DBUG(
         "GMSHInterface::writeGMSHInputFile(): Computed topological hierarchy - "
-        "detected %d polygons.",
+        "detected {:d} polygons.",
         _polygon_tree_list.size());
     GeoLib::createPolygonTrees<GMSH::GMSHPolygonTree>(_polygon_tree_list);
     DBUG(
         "GMSHInterface::writeGMSHInputFile(): Computed topological hierarchy - "
-        "calculated %d polygon trees.",
+        "calculated {:d} polygon trees.",
         _polygon_tree_list.size());
 
     // *** Mark in each polygon tree the segments shared by two polygons.
diff --git a/Applications/FileIO/Gmsh/GmshReader.cpp b/Applications/FileIO/Gmsh/GmshReader.cpp
index 41b6398e1654adbe38a39817db689d0cc2ed65ee..8d415c5e8d473da07a8739a95ea0c6c7f3b66b30 100644
--- a/Applications/FileIO/Gmsh/GmshReader.cpp
+++ b/Applications/FileIO/Gmsh/GmshReader.cpp
@@ -39,7 +39,7 @@ bool isGMSHMeshFile(const std::string& fname)
     std::ifstream input(fname.c_str());
 
     if (!input) {
-        ERR("isGMSHMeshFile(): Could not open file %s.", fname.c_str());
+        ERR("isGMSHMeshFile(): Could not open file {:s}.", fname.c_str());
         return false;
     }
 
@@ -50,7 +50,7 @@ bool isGMSHMeshFile(const std::string& fname)
         std::string version;
         getline(input, version);
         getline(input, version);
-        INFO("isGMSHMeshFile(): Found GMSH mesh file version: %s.",
+        INFO("isGMSHMeshFile(): Found GMSH mesh file version: {:s}.",
              version.c_str());
         input.close();
         return true;
@@ -156,7 +156,7 @@ std::pair<MeshLib::Element*, int> readElement(
         in >> dummy; // skip rest of line
         break;
     default:
-        WARN("readGMSHMesh(): Unknown element type %d.", type);
+        WARN("readGMSHMesh(): Unknown element type {:d}.", type);
         break;
     }
     return std::make_pair(nullptr, -1);
@@ -168,7 +168,7 @@ MeshLib::Mesh* readGMSHMesh(std::string const& fname)
     std::ifstream in(fname.c_str(), std::ios::in);
     if (!in.is_open())
     {
-        WARN ("readGMSHMesh() - Could not open file %s.", fname.c_str());
+        WARN("readGMSHMesh() - Could not open file {:s}.", fname.c_str());
         return nullptr;
     }
 
@@ -183,7 +183,8 @@ MeshLib::Mesh* readGMSHMesh(std::string const& fname)
     getline(in, line); // version-number file-type data-size
     if (line.substr(0, 3) != "2.2")
     {
-        WARN("Wrong gmsh file format version '%s'.", line.substr(0,3).c_str());
+        WARN("Wrong gmsh file format version '{:s}'.",
+             line.substr(0, 3).c_str());
         return nullptr;
     }
 
@@ -281,8 +282,8 @@ MeshLib::Mesh* readGMSHMesh(std::string const& fname)
     MeshLib::ElementValueModification::condense(*mesh);
 
     INFO("\t... finished.");
-    INFO("Nr. Nodes: %d.", nodes.size());
-    INFO("Nr. Elements: %d.", elements.size());
+    INFO("Nr. Nodes: {:d}.", nodes.size());
+    INFO("Nr. Elements: {:d}.", elements.size());
 
     return mesh;
 }
diff --git a/Applications/FileIO/GocadIO/CoordinateSystem.cpp b/Applications/FileIO/GocadIO/CoordinateSystem.cpp
index 2bdfe1e2834a2390486803e15b188d9e97f800f0..b314c28ee5dad00d381ce31aa1d493f95451c40b 100644
--- a/Applications/FileIO/GocadIO/CoordinateSystem.cpp
+++ b/Applications/FileIO/GocadIO/CoordinateSystem.cpp
@@ -7,13 +7,13 @@
  *              http://www.opengeosys.org/LICENSE.txt
  */
 
-#include <iostream>
+#include "CoordinateSystem.h"
 
-#include <logog/include/logog.hpp>
-#include <boost/tokenizer.hpp>
 #include <boost/algorithm/string/trim.hpp>
+#include <boost/tokenizer.hpp>
+#include <iostream>
 
-#include "CoordinateSystem.h"
+#include "BaseLib/Logging.h"
 
 namespace FileIO
 {
@@ -100,7 +100,8 @@ bool CoordinateSystem::parse(std::istream& in)
             return true;
         }
         else
-            WARN("CoordinateSystem::parse() - Unknown keyword found: %s", line.c_str());
+            WARN("CoordinateSystem::parse() - Unknown keyword found: {:s}",
+                 line.c_str());
     }
     ERR ("Error: Unexpected end of file.");
     return false;
diff --git a/Applications/FileIO/GocadIO/GenerateFaceSetMeshes.cpp b/Applications/FileIO/GocadIO/GenerateFaceSetMeshes.cpp
index 77ca064e968ba2929187c20ffc248777ff21db7d..f69ae0feed64334434a3c2e761c6592c876aad43 100644
--- a/Applications/FileIO/GocadIO/GenerateFaceSetMeshes.cpp
+++ b/Applications/FileIO/GocadIO/GenerateFaceSetMeshes.cpp
@@ -26,12 +26,12 @@ void generateFaceSets(GocadSGridReader const& reader, std::string const& path)
         {
             continue;
         }
-        INFO("Face set mesh created. #nodes: %d, #elements: %d",
+        INFO("Face set mesh created. #nodes: {:d}, #elements: {:d}",
              face_set->getNumberOfNodes(),
              face_set->getNumberOfElements());
 
         std::string const mesh_out_fname(path + face_set->getName() + ".vtu");
-        INFO("Writing face set mesh to '%s'.", mesh_out_fname.c_str());
+        INFO("Writing face set mesh to '{:s}'.", mesh_out_fname.c_str());
         MeshLib::IO::writeMeshToFile(*face_set, mesh_out_fname);
     }
 }
diff --git a/Applications/FileIO/GocadIO/GocadAsciiReader.cpp b/Applications/FileIO/GocadIO/GocadAsciiReader.cpp
index 9a74dcff8dd0f8d0065fc55027552acf366ea787..7dc709fcf57007b824f2fe42a55cba1704e4963d 100644
--- a/Applications/FileIO/GocadIO/GocadAsciiReader.cpp
+++ b/Applications/FileIO/GocadIO/GocadAsciiReader.cpp
@@ -9,12 +9,11 @@
 
 #include "GocadAsciiReader.h"
 
-#include <logog/include/logog.hpp>
-
 #include <iosfwd>
 
 #include "Applications/FileIO/GocadIO/CoordinateSystem.h"
 #include "BaseLib/FileTools.h"
+#include "BaseLib/Logging.h"
 #include "BaseLib/StringTools.h"
 #include "MeshLib/Elements/Line.h"
 #include "MeshLib/Elements/Tri.h"
@@ -90,7 +89,7 @@ bool skipToEND(std::ifstream& in)
             return true;
         }
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -151,7 +150,7 @@ bool parseHeader(std::ifstream& in, std::string& mesh_name)
         }
         // ignore all other header parameters
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -167,7 +166,7 @@ bool parsePropertyClass(std::ifstream& in)
             return true;
         }
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -221,8 +220,8 @@ bool parseProperties(std::ifstream& in,
 
             if (names.size() != prop_size.size())
             {
-                ERR("Error: Number of PROPERTY-names (%d) does not match "
-                    "number of ESIZES (%d)",
+                ERR("Error: Number of PROPERTY-names ({:d}) does not match "
+                    "number of ESIZES ({:d})",
                     names.size(), prop_size.size());
                 return false;
             }
@@ -238,7 +237,7 @@ bool parseProperties(std::ifstream& in,
         // Remember current position in case the properties black ends now.
         pos = in.tellg();
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -284,7 +283,7 @@ bool parseNodes(std::ifstream& in,
         if (!(line.substr(0, 4) == "VRTX" || line.substr(0, 5) == "PVRTX" ||
               line.substr(0, 4) == "ATOM"))
         {
-            WARN("GocadAsciiReader::parseNodes() - Unknown keyword found: %s",
+            WARN("GocadAsciiReader::parseNodes() - Unknown keyword found: {:s}",
                  line.c_str());
             continue;
         }
@@ -322,7 +321,7 @@ bool parseNodes(std::ifstream& in,
         node_id_map[nodes.back()->getID()] = nodes.size() - 1;
         pos = in.tellg();
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -361,8 +360,8 @@ bool parseLineSegments(std::ifstream& in,
                 auto const it = node_id_map.find(data[i]);
                 if (it == node_id_map.end() || it->second >= nodes.size())
                 {
-                    ERR("Error: Node ID (%d) out of range (0, %d).", data[i],
-                        nodes.back()->getID());
+                    ERR("Error: Node ID ({:d}) out of range (0, {:d}).",
+                        data[i], nodes.back()->getID());
                     return false;
                 }
                 elem_nodes[i] = nodes[it->second];
@@ -377,7 +376,7 @@ bool parseLineSegments(std::ifstream& in,
         }
         pos = in.tellg();
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -410,10 +409,10 @@ bool parseLine(std::ifstream& in,
         {
             return true;
         }
-        WARN("GocadAsciiReader::parseLine() - Unknown keyword found: %s",
+        WARN("GocadAsciiReader::parseLine() - Unknown keyword found: {:s}",
              line.c_str());
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -452,8 +451,8 @@ bool parseElements(std::ifstream& in,
                 auto const it = node_id_map.find(data[i]);
                 if (it == node_id_map.end() || it->second >= nodes.size())
                 {
-                    ERR("Error: Node ID (%d) out of range (0, %d).", data[i],
-                        nodes.back()->getID());
+                    ERR("Error: Node ID ({:d}) out of range (0, {:d}).",
+                        data[i], nodes.back()->getID());
                     return false;
                 }
                 elem_nodes[i] = nodes[it->second];
@@ -468,7 +467,7 @@ bool parseElements(std::ifstream& in,
         }
         pos = in.tellg();
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -511,11 +510,13 @@ bool parseSurface(std::ifstream& in,
         }
         else
         {
-            WARN("GocadAsciiReader::parseSurface() - Unknown keyword found: %s",
-                 line.c_str());
+            WARN(
+                "GocadAsciiReader::parseSurface() - Unknown keyword found: "
+                "{:s}",
+                line.c_str());
         }
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return false;
 }
 
@@ -528,7 +529,7 @@ MeshLib::Mesh* createMesh(std::ifstream& in, DataType type,
     std::vector<MeshLib::Node*> nodes;
     std::vector<MeshLib::Element*> elems;
     std::map<std::size_t, std::size_t> node_id_map;
-    INFO("Parsing %s %s.", dataType2ShortString(type).c_str(),
+    INFO("Parsing {:s} {:s}.", dataType2ShortString(type).c_str(),
          mesh_name.c_str());
     bool return_val;
     return_val = parser(in, nodes, elems, node_id_map, mesh_prop);
@@ -537,7 +538,7 @@ MeshLib::Mesh* createMesh(std::ifstream& in, DataType type,
     {
         return new MeshLib::Mesh(mesh_name, nodes, elems, mesh_prop);
     }
-    ERR("Error parsing %s %s.", dataType2ShortString(type).c_str(),
+    ERR("Error parsing {:s} {:s}.", dataType2ShortString(type).c_str(),
         mesh_name.c_str());
     clearData(nodes, elems);
     return nullptr;
@@ -605,11 +606,11 @@ MeshLib::Mesh* readData(std::ifstream& in,
         }
         else
         {
-            WARN("GocadAsciiReader::readData() - Unknown keyword found: %s",
+            WARN("GocadAsciiReader::readData() - Unknown keyword found: {:s}",
                  line.c_str());
         }
     }
-    ERR("%s", eof_error.c_str());
+    ERR("{:s}", eof_error.c_str());
     return nullptr;
 }
 
@@ -620,7 +621,7 @@ bool readFile(std::string const& file_name,
     std::ifstream in(file_name.c_str());
     if (!in.is_open())
     {
-        ERR("GocadAsciiReader::readFile(): Could not open file %s.",
+        ERR("GocadAsciiReader::readFile(): Could not open file {:s}.",
             file_name.c_str());
         return false;
     }
@@ -638,7 +639,8 @@ bool readFile(std::string const& file_name,
         {
             if (!skipToEND(in))
             {
-                ERR("Parsing of type %s is not implemented. Skipping section.",
+                ERR("Parsing of type {:s} is not implemented. Skipping "
+                    "section.",
                     dataType2String(type).c_str());
                 return false;
             }
diff --git a/Applications/FileIO/GocadIO/GocadNode.h b/Applications/FileIO/GocadIO/GocadNode.h
index 993f57d7f94e6e204c06fc6e3202075f2bd92b04..556495ae386d450b1600db6d4fb2ab1d126697af 100644
--- a/Applications/FileIO/GocadIO/GocadNode.h
+++ b/Applications/FileIO/GocadIO/GocadNode.h
@@ -60,8 +60,9 @@ public:
                                               FaceDirection::W);
                 break;
             default:
-                OGS_FATAL("GocadNode::setFaceSet(): unknown face indicator %d.",
-                          face_indicator);
+                OGS_FATAL(
+                    "GocadNode::setFaceSet(): unknown face indicator {:d}.",
+                    face_indicator);
         }
     }
 
@@ -93,7 +94,8 @@ public:
         if (it == _face_directions.end())
         {
             OGS_FATAL(
-                "GocadNode %d: Could not found face indicator for face set %d",
+                "GocadNode {:d}: Could not found face indicator for face set "
+                "{:d}",
                 _id, face_set_number);
         }
         return it->second;
diff --git a/Applications/FileIO/GocadIO/GocadSGridReader.cpp b/Applications/FileIO/GocadIO/GocadSGridReader.cpp
index f3a38a70163c7c2129f7b0c3df622887c9cc364e..b7787bc7d28bd0aabfc55124604c200a24b6e6d4 100644
--- a/Applications/FileIO/GocadIO/GocadSGridReader.cpp
+++ b/Applications/FileIO/GocadIO/GocadSGridReader.cpp
@@ -10,13 +10,13 @@
 #include "GocadSGridReader.h"
 
 #include <algorithm>
+#include <boost/tokenizer.hpp>
 #include <cstddef>
 #include <fstream>
 #include <iostream>
 #include <sstream>
 
-#include <boost/tokenizer.hpp>
-
+#include "BaseLib/FileTools.h"
 #include "MeshLib/Elements/Hex.h"
 #include "MeshLib/Elements/Quad.h"
 #include "MeshLib/Mesh.h"
@@ -38,7 +38,7 @@ GocadSGridReader::GocadSGridReader(std::string const& fname)
     std::ifstream in(_fname.c_str());
     if (!in)
     {
-        ERR("Could not open '%s'.", _fname.c_str());
+        ERR("Could not open '{:s}'.", _fname.c_str());
         in.close();
         return;
     }
@@ -108,7 +108,7 @@ GocadSGridReader::GocadSGridReader(std::string const& fname)
             std::size_t bit_length = std::atoi(it->c_str());
             if (regions.size() != bit_length)
             {
-                ERR("%d regions read but %d expected.\n", regions.size(),
+                ERR("{:d} regions read but {:d} expected.\n", regions.size(),
                     bit_length);
                 throw std::runtime_error(
                     "Number of read regions differs from expected.\n");
@@ -131,20 +131,20 @@ GocadSGridReader::GocadSGridReader(std::string const& fname)
     regions_ss << regions.size() << " regions read:\n";
     std::copy(regions.begin(), regions.end(),
               std::ostream_iterator<Gocad::Region>(regions_ss, "\t"));
-    DBUG("%s", regions_ss.str().c_str());
+    DBUG("{:s}", regions_ss.str().c_str());
 
     std::stringstream layers_ss;
     layers_ss << layers.size() << " layers read:\n";
     std::copy(layers.begin(), layers.end(),
               std::ostream_iterator<Gocad::Layer>(layers_ss, "\n"));
-    DBUG("%s", layers_ss.str().c_str());
+    DBUG("{:s}", layers_ss.str().c_str());
 
     std::stringstream properties_ss;
     properties_ss << "meta data for " << _property_meta_data_vecs.size()
                   << " properties read:\n";
     std::copy(_property_meta_data_vecs.begin(), _property_meta_data_vecs.end(),
               std::ostream_iterator<Gocad::Property>(properties_ss, "\n"));
-    DBUG("%s", properties_ss.str().c_str());
+    DBUG("{:s}", properties_ss.str().c_str());
 #endif
 
     // if not done already read the points
@@ -204,14 +204,14 @@ void GocadSGridReader::addGocadPropertiesToMesh(MeshLib::Mesh& mesh) const
             continue;
         }
 
-        DBUG("Adding Gocad property '%s' with %d values.", name.c_str(),
+        DBUG("Adding Gocad property '{:s}' with {:d} values.", name.c_str(),
              prop->_property_data.size());
 
         auto pv = MeshLib::getOrCreateMeshProperty<double>(
             mesh, name, MeshLib::MeshItemType::Cell, 1);
         if (pv == nullptr)
         {
-            ERR("Could not create mesh property '%s'.", name.c_str());
+            ERR("Could not create mesh property '{:s}'.", name.c_str());
             continue;
         }
 
@@ -262,9 +262,11 @@ void GocadSGridReader::parseDims(std::string const& line)
     std::stringstream ssz(*it, std::stringstream::in | std::stringstream::out);
     ssz >> z_dim;
     _index_calculator = Gocad::IndexCalculator(x_dim, y_dim, z_dim);
-    DBUG("x_dim = %d, y_dim = %d, z_dim = %d => #nodes = %d, #cells = %d",
-         x_dim, y_dim, z_dim, _index_calculator._n_nodes,
-         _index_calculator._n_cells);
+    DBUG(
+        "x_dim = {:d}, y_dim = {:d}, z_dim = {:d} => #nodes = {:d}, #cells = "
+        "{:d}",
+        x_dim, y_dim, z_dim, _index_calculator._n_nodes,
+        _index_calculator._n_cells);
 }
 
 void GocadSGridReader::parseFileName(std::string const& line,
@@ -302,7 +304,7 @@ void GocadSGridReader::parseFaceSet(std::string& line, std::istream& in)
     // Check first word is FACE_SET
     if (*it != std::string("FACE_SET"))
     {
-        ERR("Expected FACE_SET keyword but '%s' found.", it->c_str());
+        ERR("Expected FACE_SET keyword but '{:s}' found.", it->c_str());
         throw std::runtime_error(
             "In GocadSGridReader::parseFaceSet() expected FACE_SET keyword not "
             "found.");
@@ -333,7 +335,8 @@ void GocadSGridReader::parseFaceSet(std::string& line, std::istream& in)
 
             if (id >= _index_calculator._n_nodes)
             {
-                ERR("Face set id %d is greater than the number of nodes (%d).",
+                ERR("Face set id {:d} is greater than the number of nodes "
+                    "({:d}).",
                     id, _index_calculator._n_nodes);
             }
             else
@@ -343,11 +346,11 @@ void GocadSGridReader::parseFaceSet(std::string& line, std::istream& in)
                 std::array<std::size_t, 3> const c(
                     _index_calculator.getCoordsForID(id));
                 if (c[0] >= _index_calculator._x_dim - 1)
-                    ERR("****** i coord %d to big for id %d.", c[0], id);
+                    ERR("****** i coord {:d} to big for id {:d}.", c[0], id);
                 if (c[1] >= _index_calculator._y_dim - 1)
-                    ERR("****** j coord %d to big for id %d.", c[1], id);
+                    ERR("****** j coord {:d} to big for id {:d}.", c[1], id);
                 if (c[2] >= _index_calculator._z_dim - 1)
-                    ERR("****** k coord %d to big for id %d.", c[2], id);
+                    ERR("****** k coord {:d} to big for id {:d}.", c[2], id);
                 std::size_t const cell_id(
                     _index_calculator.getCellIdx(c[0], c[1], c[2]));
                 face_set_property._property_data[cell_id] =
@@ -359,8 +362,8 @@ void GocadSGridReader::parseFaceSet(std::string& line, std::istream& in)
 
     if (face_set_id_cnt != n_of_face_set_ids)
     {
-        ERR("Expected %d number of face set ids, read %d.", n_of_face_set_ids,
-            face_set_id_cnt);
+        ERR("Expected {:d} number of face set ids, read {:d}.",
+            n_of_face_set_ids, face_set_id_cnt);
         throw std::runtime_error(
             "Expected number of face set points does not match number of read "
             "points.");
@@ -400,7 +403,7 @@ void GocadSGridReader::readNodesBinary()
     std::ifstream in(_pnts_fname.c_str(), std::ios::binary);
     if (!in)
     {
-        ERR("Could not open points file '%s'.", _pnts_fname.c_str());
+        ERR("Could not open points file '{:s}'.", _pnts_fname.c_str());
         throw std::runtime_error("Could not open points file.");
     }
 
@@ -432,7 +435,8 @@ void GocadSGridReader::readNodesBinary()
         k++;
     }
     if (k != n * 3 && !in.eof())
-        ERR("Read different number of points. Expected %d floats, got %d.\n",
+        ERR("Read different number of points. Expected {:d} floats, got "
+            "{:d}.\n",
             n * 3, k);
 }
 
@@ -441,7 +445,7 @@ void GocadSGridReader::mapRegionFlagsToCellProperties(
 {
     DBUG(
         "GocadSGridReader::mapRegionFlagsToCellProperties region_flags.size: "
-        "%d",
+        "{:d}",
         rf.size());
 
     Gocad::Property region_flags;
@@ -491,14 +495,14 @@ void GocadSGridReader::readElementPropertiesBinary()
         std::string const& fname(prop_it->_property_data_fname);
         if (prop_it->_property_data_fname.empty())
         {
-            WARN("Empty filename for property %s.",
+            WARN("Empty filename for property {:s}.",
                  prop_it->_property_name.c_str());
             continue;
         }
         std::vector<float> float_properties =
             BaseLib::readBinaryArray<float>(fname, _index_calculator._n_cells);
         DBUG(
-            "GocadSGridReader::readElementPropertiesBinary(): Read %d float "
+            "GocadSGridReader::readElementPropertiesBinary(): Read {:d} float "
             "properties from binary file.",
             _index_calculator._n_cells);
 
@@ -512,7 +516,7 @@ void GocadSGridReader::readElementPropertiesBinary()
                   prop_it->_property_data.begin());
         if (prop_it->_property_data.empty())
         {
-            ERR("Reading of element properties file '%s' failed.",
+            ERR("Reading of element properties file '{:s}' failed.",
                 fname.c_str());
         }
     }
@@ -525,7 +529,7 @@ std::vector<Bitset> GocadSGridReader::readRegionFlagsBinary() const
     std::ifstream in(_region_flags_fname.c_str());
     if (!in)
     {
-        ERR("readRegionFlagsBinary(): Could not open file '%s' for input.\n",
+        ERR("readRegionFlagsBinary(): Could not open file '{:s}' for input.\n",
             _region_flags_fname.c_str());
         in.close();
         return result;
@@ -540,7 +544,8 @@ std::vector<Bitset> GocadSGridReader::readRegionFlagsBinary() const
         result[k++] = readBits(in, regions.size());
     }
     if (k != n && !in.eof())
-        ERR("Read different number of values. Expected %d, got %d.\n", n, k);
+        ERR("Read different number of values. Expected {:d}, got {:d}.\n", n,
+            k);
 
     return result;
 }
@@ -580,7 +585,7 @@ void GocadSGridReader::readSplitInformation()
     std::ifstream in(_fname.c_str());
     if (!in)
     {
-        ERR("Could not open '%s'.", _fname.c_str());
+        ERR("Could not open '{:s}'.", _fname.c_str());
         in.close();
         return;
     }
@@ -820,7 +825,7 @@ void GocadSGridReader::addFaceSetQuad(
                 *_nodes[_index_calculator({c[0], c[1] + 1, c[2]})]);
             break;
         default:
-            ERR("Could not create face for node with id %d.", id);
+            ERR("Could not create face for node with id {:d}.", id);
     }
     std::copy(begin(quad_nodes), end(quad_nodes),
               back_inserter(face_set_nodes));
diff --git a/Applications/FileIO/GocadIO/GocadSGridReader.h b/Applications/FileIO/GocadIO/GocadSGridReader.h
index 62d1245d2c065edbaac0704f004218e90060ed29..abef20ff1a5d6be801693569562a5ad1ef1f8a4b 100644
--- a/Applications/FileIO/GocadIO/GocadSGridReader.h
+++ b/Applications/FileIO/GocadIO/GocadSGridReader.h
@@ -9,22 +9,20 @@
 
 #pragma once
 
+#include <spdlog/spdlog.h>
+
+#include <boost/dynamic_bitset.hpp>
 #include <cstddef>
 #include <limits>
 #include <numeric>
 #include <string>
 #include <vector>
 
-#include <boost/dynamic_bitset.hpp>
-
-#include <logog/include/logog.hpp>
-
-#include "MeshLib/Elements/Element.h"
-
 #include "CoordinateSystem.h"
 #include "GocadNode.h"
 #include "IndexCalculator.h"
 #include "Layer.h"
+#include "MeshLib/Elements/Element.h"
 #include "Property.h"
 #include "Region.h"
 
diff --git a/Applications/FileIO/GocadIO/IndexCalculator.h b/Applications/FileIO/GocadIO/IndexCalculator.h
index 5b4140d34dd22ff0d8152ddef473496afcf5c715..d663b2b368e213b820a283b8da48c0a0cec1da7b 100644
--- a/Applications/FileIO/GocadIO/IndexCalculator.h
+++ b/Applications/FileIO/GocadIO/IndexCalculator.h
@@ -9,13 +9,13 @@
 
 #pragma once
 
+#include <spdlog/spdlog.h>
+
 #include <array>
 #include <cstddef>
 #include <limits>
 #include <numeric>
 
-#include <logog/include/logog.hpp>
-
 namespace FileIO
 {
 namespace Gocad
@@ -61,8 +61,8 @@ public:
         {
             ERR("GocadSGridReader::IndexCalculator::getCellIdx(): At least "
                 "one grid coordinate to big.");
-            ERR("\t Given: (%d, %d, %d), max allowed cell grid coords: "
-                "(%d, %d, %d).",
+            ERR("\t Given: ({:d}, {:d}, {:d}), max allowed cell grid coords: "
+                "({:d}, {:d}, {:d}).",
                 u, v, w, _x_dim - 1, _y_dim - 1, _z_dim - 1);
             return std::numeric_limits<std::size_t>::max();
         }
diff --git a/Applications/FileIO/GocadIO/Layer.cpp b/Applications/FileIO/GocadIO/Layer.cpp
index e17e31730302736f2d42a1341ab1a6bc7c53769e..8ebed256ecb537b3082093c60ca27589d535101c 100644
--- a/Applications/FileIO/GocadIO/Layer.cpp
+++ b/Applications/FileIO/GocadIO/Layer.cpp
@@ -7,13 +7,13 @@
  *              http://www.opengeosys.org/LICENSE.txt
  */
 
+#include "Layer.h"
+
 #include <algorithm>
 #include <iterator>
 #include <sstream>
 
-#include <logog/include/logog.hpp>
-
-#include "Layer.h"
+#include "BaseLib/Logging.h"
 
 namespace FileIO
 {
@@ -35,7 +35,7 @@ Layer parseLayer(std::string const& line, std::vector<Gocad::Region> const& regi
     // Check first word is MODEL_LAYER.
     if (*it != std::string("MODEL_LAYER"))
     {
-        ERR("Expected MODEL_LAYER keyword but '%s' found.\n", it->c_str());
+        ERR("Expected MODEL_LAYER keyword but '{:s}' found.\n", it->c_str());
         throw std::runtime_error(
             "In parseRegion() expected MODEL_LAYER keyword not found.\n");
     }
diff --git a/Applications/FileIO/GocadIO/Layer.h b/Applications/FileIO/GocadIO/Layer.h
index cf3b166fbb0663355a150982fbe9a58ce7544a14..2979d93c438a4e5dbc781578ca121c27de45bb74 100644
--- a/Applications/FileIO/GocadIO/Layer.h
+++ b/Applications/FileIO/GocadIO/Layer.h
@@ -9,6 +9,7 @@
 
 #pragma once
 
+#include <algorithm>
 #include <string>
 #include <vector>
 
diff --git a/Applications/FileIO/GocadIO/Property.cpp b/Applications/FileIO/GocadIO/Property.cpp
index f6e47450b050b017fbc969f7dca87dd9695d6300..7a24c0d5dda715151c32dcf8faba80b4dab807d3 100644
--- a/Applications/FileIO/GocadIO/Property.cpp
+++ b/Applications/FileIO/GocadIO/Property.cpp
@@ -39,7 +39,7 @@ Property parseGocadPropertyMetaData(std::string& line, std::istream& in,
     // PROPERTY id "property_name"
     if (*tok_it != "PROPERTY")
     {
-        ERR("Expected PROPERTY keyword but '%s' found.", tok_it->c_str());
+        ERR("Expected PROPERTY keyword but '{:s}' found.", tok_it->c_str());
         throw std::runtime_error(
             "In parseGocadPropertyMetaData() expected PROPERTY keyword not "
             "found.");
@@ -115,7 +115,7 @@ Property parseGocadPropertyMetaData(std::string& line, std::istream& in,
             tok_it++;
             if (*tok_it != "QUANTITY" && *tok_it != "ENUM")
             {
-                ERR("Expected keywords QUANTITY or ENUM, but found '%s'.",
+                ERR("Expected keywords QUANTITY or ENUM, but found '{:s}'.",
                     tok_it->c_str());
                 throw std::runtime_error(
                     "parseGocadPropertyMetaData(): Expected keywords QUANTITY "
diff --git a/Applications/FileIO/GocadIO/Property.h b/Applications/FileIO/GocadIO/Property.h
index c3c45ce37da77b09cf3a8303f0f97867e6f7d69f..ad65f327c61838ea074f3ba11e5d25a23f4a7428 100644
--- a/Applications/FileIO/GocadIO/Property.h
+++ b/Applications/FileIO/GocadIO/Property.h
@@ -12,7 +12,7 @@
 #include <cstddef>
 #include <string>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 namespace FileIO
 {
@@ -32,7 +32,7 @@ struct Property final
     {
         if (_property_id != std::stoul(id_string))
         {
-            ERR("Expected property id %d but found %d.",
+            ERR("Expected property id {:d} but found {:d}.",
                 _property_id,
                 std::stoul(id_string));
             return false;
diff --git a/Applications/FileIO/GocadIO/Region.cpp b/Applications/FileIO/GocadIO/Region.cpp
index 59631d28210e96c8a5e3dc4577ea0ee86875cabc..cbddb750865b972320d7c5ed620c8cc4b4da911a 100644
--- a/Applications/FileIO/GocadIO/Region.cpp
+++ b/Applications/FileIO/GocadIO/Region.cpp
@@ -7,12 +7,12 @@
  *              http://www.opengeosys.org/LICENSE.txt
  */
 
+#include "Region.h"
+
 #include <iterator>
 #include <sstream>
 
-#include <logog/include/logog.hpp>
-
-#include "Region.h"
+#include "BaseLib/Logging.h"
 
 namespace FileIO
 {
@@ -31,7 +31,7 @@ Region parseRegion(std::string const& line)
     // Check first word is REGION or MODEL_REGION.
     if (*it != std::string("REGION") && *it != std::string("MODEL_REGION"))
     {
-        ERR("Expected REGION or MODEL_REGION keyword but '%s' found.\n",
+        ERR("Expected REGION or MODEL_REGION keyword but '{:s}' found.\n",
             it->c_str());
         throw std::runtime_error(
             "In parseRegion() expected REGION or MODEL_REGION keyword not "
diff --git a/Applications/FileIO/Legacy/OGSIOVer4.cpp b/Applications/FileIO/Legacy/OGSIOVer4.cpp
index da5e7a32276819cd4a6a2fcecfe45a8152db7f28..16022edd32a8e81e1da589b97ce9280f905fe88e 100644
--- a/Applications/FileIO/Legacy/OGSIOVer4.cpp
+++ b/Applications/FileIO/Legacy/OGSIOVer4.cpp
@@ -18,7 +18,7 @@
 #include <limits>
 #include <sstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Applications/FileIO/Legacy/createSurface.h"
 
@@ -101,7 +101,10 @@ std::string readPoints(std::istream &in, std::vector<GeoLib::Point*>* pnt_vec,
 
             std::size_t id_pos (line.find("$ID"));
             if (id_pos != std::string::npos)
-                WARN("readPoints(): found tag $ID - please use tag $NAME for reading point names in point %d.", cnt);
+                WARN(
+                    "readPoints(): found tag $ID - please use tag $NAME for "
+                    "reading point names in point {:d}.",
+                    cnt);
             cnt++;
         }
         getline(in, line);
@@ -120,7 +123,8 @@ void readPolylinePointVector(const std::string &fname,
     // open file
     std::ifstream in((path + fname).c_str());
     if (!in) {
-        WARN("readPolylinePointVector(): error opening stream from %s", fname.c_str());
+        WARN("readPolylinePointVector(): error opening stream from {:s}",
+             fname.c_str());
         errors.push_back ("[readPolylinePointVector] error opening stream from " + fname);
         return;
     }
@@ -410,7 +414,10 @@ std::string readSurface(std::istream& in,
             }
             else
             {
-                WARN("readSurface(): cannot create surface %s from polyline %d since polyline is not closed.",  name.c_str(), ply_id);
+                WARN(
+                    "readSurface(): cannot create surface {:s} from polyline "
+                    "{:d} since polyline is not closed.",
+                    name.c_str(), ply_id);
             }
         }
     }
@@ -481,10 +488,10 @@ bool readGLIFileV4(const std::string& fname,
                    std::vector<std::string>& errors,
                    std::string const& gmsh_path)
 {
-    INFO("GeoLib::readGLIFile(): open stream from file %s.", fname.c_str());
+    INFO("GeoLib::readGLIFile(): open stream from file {:s}.", fname.c_str());
     std::ifstream in(fname.c_str());
     if (!in) {
-        WARN("GeoLib::readGLIFile(): could not open file %s.", fname.c_str());
+        WARN("GeoLib::readGLIFile(): could not open file {:s}.", fname.c_str());
         errors.push_back("[readGLIFileV4] error opening stream from " + fname);
         return false;
     }
@@ -505,7 +512,7 @@ bool readGLIFileV4(const std::string& fname,
     auto pnt_vec = std::make_unique<std::vector<GeoLib::Point*>>();
     INFO("GeoLib::readGLIFile(): read points from stream.");
     tag = readPoints(in, pnt_vec.get(), zero_based_idx, pnt_id_names_map.get());
-    INFO("GeoLib::readGLIFile(): \t ok, %d points read.", pnt_vec->size());
+    INFO("GeoLib::readGLIFile(): \t ok, {:d} points read.", pnt_vec->size());
 
     unique_name = BaseLib::extractBaseName(fname);
     if (!pnt_vec->empty())
@@ -530,7 +537,8 @@ bool readGLIFileV4(const std::string& fname,
         tag = readPolylines(in, ply_vec.get(), *ply_names, *geo_pnt_vec,
                             zero_based_idx,
                             geo.getPointVecObj(unique_name)->getIDMap(), path, errors);
-        INFO("GeoLib::readGLIFile(): \t ok, %d polylines read.", ply_vec->size());
+        INFO("GeoLib::readGLIFile(): \t ok, {:d} polylines read.",
+             ply_vec->size());
     }
     else
         INFO("GeoLib::readGLIFile(): tag #POLYLINE not found.");
@@ -560,7 +568,8 @@ bool readGLIFileV4(const std::string& fname,
         readSurfaces(in, *sfc_vec, *sfc_names, *geo.getPolylineVec(unique_name),
                      ply_names_copy, point_vec, path, errors, geo, unique_name,
                      gmsh_path);
-        INFO("GeoLib::readGLIFile(): \tok, %d surfaces read.", sfc_vec->size());
+        INFO("GeoLib::readGLIFile(): \tok, {:d} surfaces read.",
+             sfc_vec->size());
     }
     else
     {
@@ -611,7 +620,8 @@ void writeGLIFileV4 (const std::string& fname,
     std::ofstream os (fname.c_str());
     if (pnts) {
         const std::size_t n_pnts(pnts->size());
-        INFO("GeoLib::writeGLIFileV4(): writing %d points to file %s.", n_pnts, fname.c_str());
+        INFO("GeoLib::writeGLIFileV4(): writing {:d} points to file {:s}.",
+             n_pnts, fname.c_str());
         os << "#POINTS" << "\n";
         os.precision(std::numeric_limits<double>::digits10);
         for (std::size_t k(0); k < n_pnts; k++) {
@@ -628,8 +638,8 @@ void writeGLIFileV4 (const std::string& fname,
     if (plys_vec)
     {
         const std::vector<GeoLib::Polyline*>* plys (plys_vec->getVector());
-        INFO("GeoLib::writeGLIFileV4(): %d polylines to file %s.",
-             plys->size (), fname.c_str());
+        INFO("GeoLib::writeGLIFileV4(): {:d} polylines to file {:s}.",
+             plys->size(), fname.c_str());
         for (auto ply : *plys)
         {
             os << "#POLYLINE" << "\n";
@@ -691,7 +701,7 @@ void writeAllDataToGLIFileV4 (const std::string& fname, const GeoLib::GEOObjects
         }
     }
 
-    INFO("GeoLib::writeAllDataToGLIFileV4(): wrote %d points.", pnts_offset);
+    INFO("GeoLib::writeAllDataToGLIFileV4(): wrote {:d} points.", pnts_offset);
 
     // writing all stations
     std::vector<std::string> stn_names;
diff --git a/Applications/FileIO/Legacy/createSurface.cpp b/Applications/FileIO/Legacy/createSurface.cpp
index 69698a3cc65347632082a5220b1f3220f88c292a..ff5b4f858dbeaab535d20ccddf070987c5637645 100644
--- a/Applications/FileIO/Legacy/createSurface.cpp
+++ b/Applications/FileIO/Legacy/createSurface.cpp
@@ -12,7 +12,7 @@
 #include <list>
 #include <memory>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "createSurface.h"
 #include "filesystem.h"
@@ -95,8 +95,8 @@ bool createSurface(GeoLib::Polyline const& ply,
     int const gmsh_return_value = std::system(gmsh_command.c_str());
     if (gmsh_return_value != 0)
     {
-        WARN("Call to '%s' returned non-zero value %d.", gmsh_command.c_str(),
-             gmsh_return_value);
+        WARN("Call to '{:s}' returned non-zero value {:d}.",
+             gmsh_command.c_str(), gmsh_return_value);
     }
     auto surface_mesh =
         FileIO::GMSH::readGMSHMesh(msh_file.string());
diff --git a/Applications/FileIO/PetrelInterface.cpp b/Applications/FileIO/PetrelInterface.cpp
index 4fe4c66d0ce87c864c8a99241bb429012062b330..89007cf36bf450c61738395042bbf7a57752b0e3 100644
--- a/Applications/FileIO/PetrelInterface.cpp
+++ b/Applications/FileIO/PetrelInterface.cpp
@@ -19,7 +19,7 @@
 
 #include <fstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/StringTools.h"
 #include "GeoLib/StationBorehole.h"
@@ -45,8 +45,10 @@ PetrelInterface::PetrelInterface(std::list<std::string> &sfc_fnames,
             in.close();
         }
         else
-            WARN("PetrelInterface::PetrelInterface(): \tCould not open file %s.",
-                 it->c_str());
+            WARN(
+                "PetrelInterface::PetrelInterface(): \tCould not open file "
+                "{:s}.",
+                it->c_str());
     }
 
     for (std::list<std::string>::const_iterator it(well_path_fnames.begin()); it
@@ -61,7 +63,10 @@ PetrelInterface::PetrelInterface(std::list<std::string> &sfc_fnames,
             in.close();
         }
         else
-            WARN("PetrelInterface::PetrelInterface(): \tCould not open well path file %s.", it->c_str());
+            WARN(
+                "PetrelInterface::PetrelInterface(): \tCould not open well "
+                "path file {:s}.",
+                it->c_str());
     }
 
     // store data in GEOObject
@@ -122,7 +127,7 @@ void PetrelInterface::readPetrelSurface(std::istream &in)
     } else
         WARN(
             "PetrelInterface::readPetrelSurface(): problem reading petrel "
-            "points from line\n'%s'.",
+            "points from line\n'{:s}'.",
             line.c_str());
 }
 
@@ -141,7 +146,8 @@ void PetrelInterface::readPetrelWellTrace(std::istream &in)
         std::list<std::string> str_list(BaseLib::splitString(line, ' '));
         std::list<std::string>::const_iterator it(str_list.begin());
         while (it != str_list.end()) {
-            INFO("PetrelInterface::readPetrelWellTrace(): well name: %s.", it->c_str());
+            INFO("PetrelInterface::readPetrelWellTrace(): well name: {:s}.",
+                 it->c_str());
             ++it;
         }
 
@@ -151,7 +157,10 @@ void PetrelInterface::readPetrelWellTrace(std::istream &in)
         str_list = BaseLib::splitString(line, ' ');
         it = str_list.begin();
         while (it != str_list.end()) {
-            INFO("PetrelInterface::readPetrelWellTrace(): well head x coord: %s.", it->c_str());
+            INFO(
+                "PetrelInterface::readPetrelWellTrace(): well head x coord: "
+                "{:s}.",
+                it->c_str());
             ++it;
         }
         it = (str_list.end())--;
@@ -165,7 +174,10 @@ void PetrelInterface::readPetrelWellTrace(std::istream &in)
         str_list = BaseLib::splitString(line, ' ');
         it = str_list.begin();
         while (it != str_list.end()) {
-            INFO("PetrelInterface::readPetrelWellTrace(): well head y coord: %s.", it->c_str());
+            INFO(
+                "PetrelInterface::readPetrelWellTrace(): well head y coord: "
+                "{:s}.",
+                it->c_str());
             ++it;
         }
         it = (str_list.end())--;
@@ -178,14 +190,15 @@ void PetrelInterface::readPetrelWellTrace(std::istream &in)
         str_list = BaseLib::splitString(line, ' ');
         it = str_list.begin();
         while (it != str_list.end()) {
-            INFO("PetrelInterface::readPetrelWellTrace(): well kb entry: %s.", it->c_str());
+            INFO("PetrelInterface::readPetrelWellTrace(): well kb entry: {:s}.",
+                 it->c_str());
             ++it;
         }
         it = (str_list.end())--;
         --it;
         double well_kb(strtod((*it).c_str(), &buf));
 
-        INFO("PetrelInterface::readPetrelWellTrace(): %f, %f, %f.",
+        INFO("PetrelInterface::readPetrelWellTrace(): {:f}, {:f}, {:f}.",
              well_head_x,
              well_head_y,
              well_kb);
@@ -218,7 +231,10 @@ void PetrelInterface::readPetrelWellTraceData(std::istream &in)
     std::list<std::string> str_list = BaseLib::splitString(line, ' ');
     auto it = str_list.begin();
     while (it != str_list.end()) {
-        INFO("PetrelInterface::readPetrelWellTraceData(): column information: %s.", it->c_str());
+        INFO(
+            "PetrelInterface::readPetrelWellTraceData(): column information: "
+            "{:s}.",
+            it->c_str());
         ++it;
     }
 
diff --git a/Applications/FileIO/SHPInterface.cpp b/Applications/FileIO/SHPInterface.cpp
index 60ccc0f8ce106958ee608039142cf9b598eda7b5..0cccda5eeb41732b44a3459a7fd397d86b3da617 100644
--- a/Applications/FileIO/SHPInterface.cpp
+++ b/Applications/FileIO/SHPInterface.cpp
@@ -17,7 +17,7 @@
 
 #include "SHPInterface.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Applications/FileIO/Legacy/createSurface.h"
 
@@ -294,7 +294,7 @@ bool SHPInterface::write2dMeshToSHP(const std::string &file_name, const MeshLib:
         }
     }
     DBFClose(hDBF);
-    INFO("Shape export of 2D mesh '%s' finished.", mesh.getName().c_str());
+    INFO("Shape export of 2D mesh '{:s}' finished.", mesh.getName().c_str());
     return true;
 }
 
diff --git a/Applications/FileIO/SWMM/SWMMInterface.cpp b/Applications/FileIO/SWMM/SWMMInterface.cpp
index 6fd25330cf6e0662bd052cd4e5b33ebe32017862..d5eb64e5368e89d14ffe124a6f2f5a51460e2e3c 100644
--- a/Applications/FileIO/SWMM/SWMMInterface.cpp
+++ b/Applications/FileIO/SWMM/SWMMInterface.cpp
@@ -129,14 +129,16 @@ bool SwmmInterface::isSwmmInputFile(std::string const& inp_file_name)
 {
     if (!boost::iequals(BaseLib::getFileExtension(inp_file_name), "inp"))
     {
-        ERR ("SWMMInterface: %s is not a SWMM input file.", inp_file_name.c_str());
+        ERR("SWMMInterface: {:s} is not a SWMM input file.",
+            inp_file_name.c_str());
         return false;
     }
 
     std::ifstream in ( inp_file_name.c_str() );
     if (!in.is_open())
     {
-        ERR ("SWMMInterface: Could not open input file %s.", inp_file_name.c_str());
+        ERR("SWMMInterface: Could not open input file {:s}.",
+            inp_file_name.c_str());
         return false;
     }
 
@@ -159,8 +161,8 @@ bool SwmmInterface::isSwmmInputFile(std::string const& inp_file_name)
             header_found = true;
         else
         {
-            INFO ("SWMMInterface: input file type %s not recognised.",
-                BaseLib::getFileExtension(inp_file_name).c_str());
+            INFO("SWMMInterface: input file type {:s} not recognised.",
+                 BaseLib::getFileExtension(inp_file_name).c_str());
             return false;
         }
     }
@@ -289,7 +291,9 @@ bool SwmmInterface::addPointElevation(std::ifstream &in,
         auto const it = name_id_map.find(current_name);
         if (it == name_id_map.end())
         {
-            ERR ("SwmmInterface::addPointElevation(): Name %s not found in coordinates map.", current_name.c_str());
+            ERR("SwmmInterface::addPointElevation(): Name {:s} not found in "
+                "coordinates map.",
+                current_name.c_str());
             return false;
         }
         std::size_t const id = it->second;
@@ -323,7 +327,9 @@ bool SwmmInterface::readLinksAsPolylines(std::ifstream &in,
         auto const i_it = point_names.find(inlet);
         if (i_it == point_names.end())
         {
-            ERR ("SwmmInterface::readLineElements(): Inlet node %s not found in coordinates map.", inlet.c_str());
+            ERR("SwmmInterface::readLineElements(): Inlet node {:s} not found "
+                "in coordinates map.",
+                inlet.c_str());
             return false;
         }
 
@@ -331,7 +337,9 @@ bool SwmmInterface::readLinksAsPolylines(std::ifstream &in,
         auto const o_it = point_names.find(outlet);
         if (o_it == point_names.end())
         {
-            ERR ("SwmmInterface::readLineElements(): Outlet node %s not found in coordinates map.", outlet.c_str());
+            ERR("SwmmInterface::readLineElements(): Outlet node {:s} not found "
+                "in coordinates map.",
+                outlet.c_str());
             return false;
         }
         GeoLib::Polyline* ply = new GeoLib::Polyline(points);
@@ -363,7 +371,8 @@ bool SwmmInterface::convertSwmmInputToGeometry(std::string const& inp_file_name,
     std::ifstream in ( inp_file_name.c_str() );
     if (!in.is_open())
     {
-        ERR ("SWMMInterface: Could not open input file %s.", inp_file_name.c_str());
+        ERR("SWMMInterface: Could not open input file {:s}.",
+            inp_file_name.c_str());
         return false;
     }
 
@@ -518,7 +527,9 @@ bool SwmmInterface::readNodeData(std::ifstream &in, std::vector<MeshLib::Node*>
         auto const it = name_id_map.find(current_name);
         if (it == name_id_map.end())
         {
-            ERR ("SwmmInterface::readNodeData(): Name %s not found in coordinates map.", current_name.c_str());
+            ERR("SwmmInterface::readNodeData(): Name {:s} not found in "
+                "coordinates map.",
+                current_name.c_str());
             return false;
         }
         std::size_t const id = it->second;
@@ -556,7 +567,9 @@ bool SwmmInterface::readLineElements(std::ifstream &in, std::vector<MeshLib::Ele
         auto const i_it = name_id_map.find(inlet);
         if (i_it == name_id_map.end())
         {
-            ERR ("SwmmInterface::readLineElements(): Inlet node %s not found in coordinates map.", inlet.c_str());
+            ERR("SwmmInterface::readLineElements(): Inlet node {:s} not found "
+                "in coordinates map.",
+                inlet.c_str());
             return false;
         }
 
@@ -564,7 +577,9 @@ bool SwmmInterface::readLineElements(std::ifstream &in, std::vector<MeshLib::Ele
         auto const o_it = name_id_map.find(outlet);
         if (o_it == name_id_map.end())
         {
-            ERR ("SwmmInterface::readLineElements(): Outlet node %s not found in coordinates map.", outlet.c_str());
+            ERR("SwmmInterface::readLineElements(): Outlet node {:s} not found "
+                "in coordinates map.",
+                outlet.c_str());
             return false;
         }
 
@@ -607,7 +622,7 @@ bool SwmmInterface::readSubcatchments(std::ifstream &in, std::map< std::string,
         }
         if (sc.rain_gauge == std::numeric_limits<std::size_t>::max())
         {
-            ERR("Rain gauge for subcatchment '%s' not found.",
+            ERR("Rain gauge for subcatchment '{:s}' not found.",
                 split_str[0].c_str());
             return false;
         }
@@ -615,7 +630,7 @@ bool SwmmInterface::readSubcatchments(std::ifstream &in, std::map< std::string,
         auto const it = name_id_map.find(split_str[2]);
         if (it == name_id_map.end())
         {
-            ERR("Outlet node for subcatchment '%s' not found.",
+            ERR("Outlet node for subcatchment '{:s}' not found.",
                 split_str[0].c_str());
             return false;
         }
@@ -642,7 +657,8 @@ bool SwmmInterface::readSwmmInputToLineMesh()
     std::ifstream in ( inp_file_name.c_str() );
     if (!in.is_open())
     {
-        ERR ("SWMMInterface: Could not open input file %s.", inp_file_name.c_str());
+        ERR("SWMMInterface: Could not open input file {:s}.",
+            inp_file_name.c_str());
         return false;
     }
 
@@ -830,7 +846,8 @@ bool SwmmInterface::matchSubcatchmentsWithPolygons(std::vector<GeoLib::Polyline*
         }
         if (found == false)
         {
-            ERR("No match in subcatcments for outline '%s'.", names[i].c_str());
+            ERR("No match in subcatcments for outline '{:s}'.",
+                names[i].c_str());
             return false;
         }
     }
@@ -965,13 +982,17 @@ bool SwmmInterface::addResultsToMesh(MeshLib::Mesh &mesh, SwmmObject const swmm_
 
     if (swmm_type == SwmmObject::NODE && data.size() != mesh.getNumberOfNodes())
     {
-        ERR ("Number of mesh nodes (%d) does not match length of array (%d).", mesh.getNumberOfNodes(), data.size());
+        ERR("Number of mesh nodes ({:d}) does not match length of array "
+            "({:d}).",
+            mesh.getNumberOfNodes(), data.size());
         return false;
     }
 
     if (swmm_type == SwmmObject::LINK && data.size() != mesh.getNumberOfElements())
     {
-        ERR ("Number of mesh elements (%d) does not match length of array (%d).", mesh.getNumberOfElements(), data.size());
+        ERR("Number of mesh elements ({:d}) does not match length of array "
+            "({:d}).",
+            mesh.getNumberOfElements(), data.size());
         return false;
     }
 
@@ -982,7 +1003,7 @@ bool SwmmInterface::addResultsToMesh(MeshLib::Mesh &mesh, SwmmObject const swmm_
         MeshLib::getOrCreateMeshProperty<double>(mesh, vec_name, item_type, 1);
     if (!prop)
     {
-        ERR("Error fetching array '%s'.", vec_name.c_str());
+        ERR("Error fetching array '{:s}'.", vec_name.c_str());
         return false;
     }
     std::copy(data.cbegin(), data.cend(), prop->begin());
@@ -998,7 +1019,8 @@ std::vector<double> SwmmInterface::getArrayAtTimeStep(SwmmObject obj_type, std::
 
     if (time_step >= SWMM_Nperiods)
     {
-        ERR ("Time step %d not available, file contains only %d periods.", time_step, SWMM_Nperiods);
+        ERR("Time step {:d} not available, file contains only {:d} periods.",
+            time_step, SWMM_Nperiods);
         return data;
     }
 
@@ -1044,7 +1066,7 @@ std::vector<double> SwmmInterface::getArrayAtTimeStep(SwmmObject obj_type, std::
         return data;
     }
 
-    INFO("Fetching '%s'-data for time step %d...",
+    INFO("Fetching '{:s}'-data for time step {:d}...",
          getArrayName(obj_type, var_idx, SWMM_Npolluts).c_str(), time_step);
 
     for (std::size_t i=0; i<n_objects; ++i)
@@ -1201,7 +1223,7 @@ bool SwmmInterface::addRainGaugeTimeSeriesLocations(std::ifstream &in)
 
     for (auto const& stn : _rain_gauges)
         if (stn.second.empty())
-            WARN("No associated time series found for rain gauge '%s'.",
+            WARN("No associated time series found for rain gauge '{:s}'.",
                  stn.first.getName().c_str());
     return true;
 }
@@ -1311,8 +1333,8 @@ bool SwmmInterface::writeCsvForTimestep(std::string const& file_name, SwmmObject
 bool SwmmInterface::writeCsvForObject(std::string const& file_name, SwmmObject obj_type, std::size_t obj_idx) const
 {
     FileIO::CsvInterface csv;
-    INFO("Writing data for %s %d.", swmmObjectTypeToString(obj_type).c_str(),
-         obj_idx);
+    INFO("Writing data for {:s} {:d}.",
+         swmmObjectTypeToString(obj_type).c_str(), obj_idx);
     csv.addIndexVectorForWriting(getNumberOfTimeSteps());
     std::size_t const n_params (getNumberOfParameters(obj_type));
     for (std::size_t i=0; i<n_params; ++i)
diff --git a/Applications/FileIO/SWMM/SWMMInterface.h b/Applications/FileIO/SWMM/SWMMInterface.h
index 25a88aa325ab2f61ffd9f44e031b20f38ecfa08f..be93dc3de9af9cf813e4fd2e87ec73d84186993e 100644
--- a/Applications/FileIO/SWMM/SWMMInterface.h
+++ b/Applications/FileIO/SWMM/SWMMInterface.h
@@ -12,7 +12,7 @@
 #include <string>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Station.h"
 
diff --git a/Applications/FileIO/TetGenInterface.cpp b/Applications/FileIO/TetGenInterface.cpp
index c3ef06535a8b274184679d32f361ce30d71306fa..b79fd08ad6475a1b5e0bd3673d7f0f6c159a1177 100644
--- a/Applications/FileIO/TetGenInterface.cpp
+++ b/Applications/FileIO/TetGenInterface.cpp
@@ -18,7 +18,7 @@
 #include <string>
 #include <fstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -42,7 +42,8 @@ bool TetGenInterface::readTetGenGeometry (std::string const& geo_fname,
 
     if (!poly_stream)
     {
-        ERR ("TetGenInterface::readTetGenGeometry() failed to open %s", geo_fname.c_str());
+        ERR("TetGenInterface::readTetGenGeometry() failed to open {:s}",
+            geo_fname.c_str());
         return false;
     }
     std::string ext (BaseLib::getFileExtension(geo_fname));
@@ -137,7 +138,7 @@ bool TetGenInterface::parseSmeshFacets(std::ifstream &input,
         getline (input, line);
         if (input.fail())
         {
-            ERR("TetGenInterface::parseFacets(): Error reading facet %d.", k);
+            ERR("TetGenInterface::parseFacets(): Error reading facet {:d}.", k);
             return false;
         }
 
@@ -178,7 +179,9 @@ bool TetGenInterface::parseSmeshFacets(std::ifstream &input,
         }
         else
         {
-            ERR("TetGenInterface::parseFacets(): Error reading points for facet %d.", k);
+            ERR("TetGenInterface::parseFacets(): Error reading points for "
+                "facet {:d}.",
+                k);
             return false;
         }
         ++k;
@@ -196,7 +199,10 @@ bool TetGenInterface::parseSmeshFacets(std::ifstream &input,
         return true;
     }
 
-    ERR ("TetGenInterface::parseFacets(): Number of expected total triangles (%d) does not match number of found triangles (%d).", surfaces.size(), nTotalTriangles);
+    ERR("TetGenInterface::parseFacets(): Number of expected total triangles "
+        "({:d}) does not match number of found triangles ({:d}).",
+        surfaces.size(),
+        nTotalTriangles);
     return false;
 }
 
@@ -209,9 +215,11 @@ MeshLib::Mesh* TetGenInterface::readTetGenMesh (std::string const& nodes_fname,
     if (!ins_nodes || !ins_ele)
     {
         if (!ins_nodes)
-            ERR ("TetGenInterface::readTetGenMesh failed to open %s", nodes_fname.c_str());
+            ERR("TetGenInterface::readTetGenMesh failed to open {:s}",
+                nodes_fname.c_str());
         if (!ins_ele)
-            ERR ("TetGenInterface::readTetGenMesh failed to open %s", ele_fname.c_str());
+            ERR("TetGenInterface::readTetGenMesh failed to open {:s}",
+                ele_fname.c_str());
         return nullptr;
     }
 
@@ -332,7 +340,7 @@ bool TetGenInterface::parseNodes(std::ifstream &ins,
         std::getline(ins, line);
         if (ins.fail())
         {
-            ERR("TetGenInterface::parseNodes(): Error reading node %d.", k);
+            ERR("TetGenInterface::parseNodes(): Error reading node {:d}.", k);
             return false;
         }
 
@@ -353,7 +361,8 @@ bool TetGenInterface::parseNodes(std::ifstream &ins,
                 _zero_based_idx = true;
             }
         } else {
-            ERR("TetGenInterface::parseNodes(): Error reading ID of node %d.", k);
+            ERR("TetGenInterface::parseNodes(): Error reading ID of node {:d}.",
+                k);
             return false;
         }
         // read coordinates
@@ -371,7 +380,10 @@ bool TetGenInterface::parseNodes(std::ifstream &ins,
             }
             else
             {
-                ERR("TetGenInterface::parseNodes(): error reading coordinate %d of node %d.", i, k);
+                ERR("TetGenInterface::parseNodes(): error reading coordinate "
+                    "{:d} of node {:d}.",
+                    i,
+                    k);
                 return false;
             }
         }
@@ -484,7 +496,9 @@ bool TetGenInterface::parseElements(std::ifstream& ins,
         getline (ins, line);
         if (ins.fail())
         {
-            ERR("TetGenInterface::parseElements(): Error reading tetrahedron %d.", k);
+            ERR("TetGenInterface::parseElements(): Error reading tetrahedron "
+                "{:d}.",
+                k);
             return false;
         }
 
@@ -500,7 +514,9 @@ bool TetGenInterface::parseElements(std::ifstream& ins,
 
         if (pos_beg == std::string::npos || pos_end == std::string::npos)
         {
-            ERR("TetGenInterface::parseElements(): Error reading id of tetrahedron %d.", k);
+            ERR("TetGenInterface::parseElements(): Error reading id of "
+                "tetrahedron {:d}.",
+                k);
             return false;
         }
 
@@ -519,7 +535,10 @@ bool TetGenInterface::parseElements(std::ifstream& ins,
             }
             else
             {
-                ERR("TetGenInterface::parseElements(): Error reading node %d of tetrahedron %d.", i, k);
+                ERR("TetGenInterface::parseElements(): Error reading node {:d} "
+                    "of tetrahedron {:d}.",
+                    i,
+                    k);
                 return false;
             }
         }
@@ -539,7 +558,9 @@ bool TetGenInterface::parseElements(std::ifstream& ins,
             }
             else
             {
-                ERR("TetGenInterface::parseElements(): Error reading region attribute of tetrahedron %d.", k);
+                ERR("TetGenInterface::parseElements(): Error reading region "
+                    "attribute of tetrahedron {:d}.",
+                    k);
                 return false;
             }
         }
@@ -566,11 +587,12 @@ bool TetGenInterface::writeTetGenSmesh(const std::string &file_name,
 
     if (points==nullptr)
     {
-        ERR ("Geometry %s not found.", geo_name.c_str());
+        ERR("Geometry {:s} not found.", geo_name.c_str());
         return false;
     }
     if (surfaces==nullptr)
-        WARN ("No surfaces found for geometry %s. Writing points only.", geo_name.c_str());
+        WARN("No surfaces found for geometry {:s}. Writing points only.",
+             geo_name.c_str());
 
     std::ofstream out( file_name.c_str(), std::ios::out );
     out.precision(std::numeric_limits<double>::digits10);
@@ -620,7 +642,11 @@ bool TetGenInterface::writeTetGenSmesh(const std::string &file_name,
                 << " " << 10 * attribute_points[i].getID() << "\n";
         }
     }
-    INFO ("TetGenInterface::writeTetGenSmesh() - %d points and %d surfaces successfully written.", nPoints, nSurfaces);
+    INFO(
+        "TetGenInterface::writeTetGenSmesh() - {:d} points and {:d} surfaces "
+        "successfully written.",
+        nPoints,
+        nSurfaces);
     out.close();
     return true;
 }
@@ -676,7 +702,11 @@ bool TetGenInterface::writeTetGenSmesh(const std::string &file_name,
         }
     }
 
-    INFO ("TetGenInterface::writeTetGenPoly() - %d points and %d surfaces successfully written.", nPoints, mesh.getNumberOfElements());
+    INFO(
+        "TetGenInterface::writeTetGenPoly() - {:d} points and {:d} surfaces "
+        "successfully written.",
+        nPoints,
+        mesh.getNumberOfElements());
     out.close();
     return true;
 }
diff --git a/Applications/FileIO/XmlIO/Qt/XmlLutReader.h b/Applications/FileIO/XmlIO/Qt/XmlLutReader.h
index b861efffd1e1482d34d817cad7d8354ec4a0cc01..fbc0c90bd5ee6557914c6eed48e588d7dce271fd 100644
--- a/Applications/FileIO/XmlIO/Qt/XmlLutReader.h
+++ b/Applications/FileIO/XmlIO/Qt/XmlLutReader.h
@@ -17,7 +17,7 @@
 #include <QFile>
 #include <QtXml/QDomDocument>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Applications/DataHolderLib/ColorLookupTable.h"
 
@@ -36,7 +36,8 @@ public:
         QFile file(fileName);
         if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         {
-            ERR("XmlLutReader::readFromFile(): Can't open xml-file %s.", fileName.data());
+            ERR("XmlLutReader::readFromFile(): Can't open xml-file {:s}.",
+                fileName.toStdString());
             return false;
         }
 
diff --git a/Applications/FileIO/XmlIO/Qt/XmlNumInterface.cpp b/Applications/FileIO/XmlIO/Qt/XmlNumInterface.cpp
index b949719cb41685f5869108b147541d86f9ddcbea..e6e2776e8f27af18c35c6c049847a971fe67ef09 100644
--- a/Applications/FileIO/XmlIO/Qt/XmlNumInterface.cpp
+++ b/Applications/FileIO/XmlIO/Qt/XmlNumInterface.cpp
@@ -18,7 +18,7 @@
 #include <QTextCodec>
 #include <QtXml/QDomDocument>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileFinder.h"
 
@@ -50,7 +50,7 @@ int XmlNumInterface::readFile(QString const& fileName)
         if (num_node.nodeName().compare("Type") == 0)
         {
             std::string const solver_type = num_node.toElement().text().toStdString();
-            INFO("Non-linear solver type: %s.", solver_type.c_str());
+            INFO("Non-linear solver type: {:s}.", solver_type.c_str());
         }
         else if (num_node.nodeName().compare("LinearSolver") == 0)
         {
@@ -91,7 +91,8 @@ void XmlNumInterface::readLinearSolverConfiguration(QDomElement const& lin_root)
         }
         linear_solver_node = linear_solver_node.nextSiblingElement();
     }
-    INFO("Using %s-library with solver %s and %s preconditioner.", library.c_str(), lin_solver_type.c_str(), precond_type.c_str());
+    INFO("Using {:s}-library with solver {:s} and {:s} preconditioner.",
+         library.c_str(), lin_solver_type.c_str(), precond_type.c_str());
 }
 
 
@@ -114,7 +115,8 @@ void XmlNumInterface::readIterationScheme(QDomElement const& iteration_root)
 
         iteration_node = iteration_node.nextSiblingElement();
     }
-    INFO("Doing a maximum of %d iterations at fixed step size of %f", max_iterations, fixed_step_size);
+    INFO("Doing a maximum of {:d} iterations at fixed step size of {:f}",
+         max_iterations, fixed_step_size);
 }
 
 void XmlNumInterface::readConvergenceCriteria(QDomElement const& convergence_root)
@@ -136,7 +138,8 @@ void XmlNumInterface::readConvergenceCriteria(QDomElement const& convergence_roo
 
         conv_node = conv_node.nextSiblingElement();
     }
-    INFO("Convergence reached when error below %f using %s.", error_threshold, error_method.c_str());
+    INFO("Convergence reached when error below {:f} using {:s}.",
+         error_threshold, error_method.c_str());
 }
 
 bool XmlNumInterface::write()
diff --git a/Applications/FileIO/XmlIO/Qt/XmlPrjInterface.cpp b/Applications/FileIO/XmlIO/Qt/XmlPrjInterface.cpp
index d2d73642c0b68a904bc4929c2aa163f9b10f92c6..3495d40d8482a67327c52c2ffc064aefe2c83ceb 100644
--- a/Applications/FileIO/XmlIO/Qt/XmlPrjInterface.cpp
+++ b/Applications/FileIO/XmlIO/Qt/XmlPrjInterface.cpp
@@ -16,7 +16,7 @@
 #include <QFile>
 #include <QFileInfo>
 #include <QtXml/QDomDocument>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Applications/DataExplorer/Base/OGSError.h"
 #include "Applications/DataHolderLib/FemCondition.h"
@@ -119,14 +119,14 @@ int XmlPrjInterface::readFile(const QString& fileName)
                 }
                 if (meshes_node.nodeName() != "mesh")
                 {
-                    ERR("Expected an XML element node named 'mesh' got '%s'.",
-                        meshes_node.nodeName().data())
+                    ERR("Expected an XML element node named 'mesh' got '{:s}'.",
+                        meshes_node.nodeName().toStdString());
                     return 0;
                 }
                 if (meshes_node.childNodes().count() != 1)
                 {
                     ERR("Expected an XML element node named 'mesh' to contain "
-                        "exactly one child node but it has %d children.",
+                        "exactly one child node but it has {:d} children.",
                         meshes_node.childNodes().count());
                     return 0;
                 }
@@ -389,7 +389,7 @@ bool XmlPrjInterface::write()
             geo_tag.appendChild(filename_text);
         }
         else
-            ERR("XmlGmlInterface::writeFile(): Error writing gml-file '%s'.",
+            ERR("XmlGmlInterface::writeFile(): Error writing gml-file '{:s}'.",
                 name.c_str());
     }
 
@@ -412,7 +412,7 @@ bool XmlPrjInterface::write()
             stn_tag.appendChild(filename_text);
         }
         else
-            ERR("XmlStnInterface::writeFile(): Error writing stn-file '%s'.",
+            ERR("XmlStnInterface::writeFile(): Error writing stn-file '{:s}'.",
                 name.c_str());
     }
 
diff --git a/Applications/InSituLib/Adaptor.cpp b/Applications/InSituLib/Adaptor.cpp
index 5e0669d1ac114b8814244180bee27dd218567d8d..8e487cc9fcd7f06b7967f90e0ca2409a33db9281 100644
--- a/Applications/InSituLib/Adaptor.cpp
+++ b/Applications/InSituLib/Adaptor.cpp
@@ -40,7 +40,7 @@ void Initialize(BaseLib::ConfigTree const& scripts_config,
     {
         //! \ogs_file_param{prj__insitu__scripts__script__name}
         auto scriptName = script_config.getConfigParameter<std::string>("name");
-        INFO("Initializing in-situ script: %s", scriptName.c_str());
+        INFO("Initializing in-situ script: {:s}", scriptName.c_str());
         std::stringstream ss;
         ss << path << scriptName;
         vtkNew<vtkCPPythonScriptPipeline> pipeline;
@@ -73,8 +73,8 @@ void CoProcess(MeshLib::Mesh const& mesh, double const time,
     }
     if (Processor->RequestDataDescription(dataDescription.GetPointer()) != 0)
     {
-        INFO("Start InSitu process: timestep #%d (t=%g, last=%d)", timeStep,
-             time, lastTimeStep);
+        INFO("Start InSitu process: timestep #{:d} (t={:g}, last={:d})",
+             timeStep, time, lastTimeStep);
         vtkNew<MeshLib::VtkMappedMeshSource> vtkSource;
         vtkSource->SetMesh(&mesh);
         vtkSource->Update();
diff --git a/Applications/Utils/FileConverter/ConvertSHPToGLI.cpp b/Applications/Utils/FileConverter/ConvertSHPToGLI.cpp
index b639f432ac6265ec59df1e108da32e5f728a4409..620b56983dfbec2c100b3e2fc589144d472ab24e 100644
--- a/Applications/Utils/FileConverter/ConvertSHPToGLI.cpp
+++ b/Applications/Utils/FileConverter/ConvertSHPToGLI.cpp
@@ -21,7 +21,6 @@
 // ShapeLib
 #include <shapefil.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "GeoLib/GEOObjects.h"
 #include "GeoLib/IO/XmlIO/Qt/XmlGmlInterface.h"
@@ -39,7 +38,7 @@ void convertPoints (DBFHandle dbf_handle,
                     bool station)
 {
     int n_records (DBFGetRecordCount (dbf_handle));
-    INFO("Reading %d records.", n_records);
+    INFO("Reading {:d} records.", n_records);
 
     auto points = std::make_unique<std::vector<GeoLib::Point*>>();
     points->reserve (n_records);
@@ -147,13 +146,11 @@ void printFieldInformationTable(DBFHandle const& dbf_handle, std::size_t n_field
     }
     delete[] field_name;
     out << "************************************************" << std::endl;
-    INFO("%s", out.str().c_str());
+    INFO("{:s}", out.str().c_str());
 }
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts points contained in shape file\n\n"
         "OpenGeoSys-6 software, version " +
@@ -183,17 +180,17 @@ int main (int argc, char* argv[])
                    nullptr /*padfMinBound*/, nullptr /*padfMinBound*/);
 
         if ((shape_type - 1) % 10 == 0)
-            INFO("Shape file contains %d points.", number_of_elements);
+            INFO("Shape file contains {:d} points.", number_of_elements);
         if ( ((shape_type - 3) % 10 == 0 || (shape_type - 5) % 10 == 0))
         {
-            ERR("Shape file contains %d polylines.", number_of_elements);
+            ERR("Shape file contains {:d} polylines.", number_of_elements);
             ERR("This programm only handles only files containing points.");
             SHPClose(hSHP);
             return EXIT_SUCCESS;
         }
         SHPClose(hSHP);
     } else {
-        ERR("Could not open shapefile %s.", fname.c_str());
+        ERR("Could not open shapefile {:s}.", fname.c_str());
     }
 
     DBFHandle dbf_handle = DBFOpen(fname.c_str(),"rb");
@@ -253,7 +250,7 @@ int main (int argc, char* argv[])
             fname += ".gml";
         }
 
-        INFO("Writing to %s.", fname.c_str());
+        INFO("Writing to {:s}.", fname.c_str());
         convertPoints(dbf_handle,
                       fname,
                       x_id,
diff --git a/Applications/Utils/FileConverter/FEFLOW2OGS.cpp b/Applications/Utils/FileConverter/FEFLOW2OGS.cpp
index d9bc214fe493074c8da969ddc555d9aa4fc73e0c..d8005ccc8329ed625ea29b4a4a4c300b98bcd1fc 100644
--- a/Applications/Utils/FileConverter/FEFLOW2OGS.cpp
+++ b/Applications/Utils/FileConverter/FEFLOW2OGS.cpp
@@ -13,8 +13,6 @@
 // ThirdParty
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 // BaseLib
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
@@ -33,8 +31,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converting a mesh in FEFLOW file format (ASCII, version 5.4) to a vtk "
         "unstructured grid file (new OGS file format) or to the old OGS file "
@@ -67,7 +63,7 @@ int main (int argc, char* argv[])
     cmd.parse(argc, argv);
 
     // *** read mesh
-    INFO("Reading %s.", feflow_mesh_arg.getValue().c_str());
+    INFO("Reading {:s}.", feflow_mesh_arg.getValue().c_str());
 #ifndef WIN32
     BaseLib::MemWatch mem_watch;
     unsigned long mem_without_mesh (mem_watch.getVirtMemUsage());
@@ -79,18 +75,21 @@ int main (int argc, char* argv[])
         feflowIO.readFEFLOWFile(feflow_mesh_arg.getValue()));
 
     if (mesh == nullptr) {
-        INFO("Could not read mesh from %s.", feflow_mesh_arg.getValue().c_str());
+        INFO("Could not read mesh from {:s}.",
+             feflow_mesh_arg.getValue().c_str());
         return EXIT_FAILURE;
     }
 #ifndef WIN32
     unsigned long mem_with_mesh (mem_watch.getVirtMemUsage());
-    INFO("Mem for mesh: %i MB", (mem_with_mesh - mem_without_mesh)/(1024*1024));
+    INFO("Mem for mesh: {:i} MB",
+         (mem_with_mesh - mem_without_mesh) / (1024 * 1024));
 #endif
-    INFO("Time for reading: %f seconds.", run_time.elapsed());
-    INFO("Read %d nodes and %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Time for reading: {:f} seconds.", run_time.elapsed());
+    INFO("Read {:d} nodes and {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     std::string ogs_mesh_fname(ogs_mesh_arg.getValue());
-    INFO("Writing %s.", ogs_mesh_fname.c_str());
+    INFO("Writing {:s}.", ogs_mesh_fname.c_str());
     MeshLib::IO::writeMeshToFile(*mesh, ogs_mesh_fname);
     INFO("\tDone.");
     return EXIT_SUCCESS;
diff --git a/Applications/Utils/FileConverter/GMSH2OGS.cpp b/Applications/Utils/FileConverter/GMSH2OGS.cpp
index 3dd943250bb4e4837773d2ad430cdd57cc353d4c..f1bbf5e256ba021cda272d97970175c7900dcfee 100644
--- a/Applications/Utils/FileConverter/GMSH2OGS.cpp
+++ b/Applications/Utils/FileConverter/GMSH2OGS.cpp
@@ -19,8 +19,6 @@
 // ThirdParty
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 // BaseLib
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
@@ -40,8 +38,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converting meshes in gmsh file format (ASCII, version 2.2) to a vtk "
         "unstructured grid file (new OGS file format) or to the old OGS file "
@@ -81,7 +77,7 @@ int main (int argc, char* argv[])
     cmd.parse(argc, argv);
 
     // *** read mesh
-    INFO("Reading %s.", gmsh_mesh_arg.getValue().c_str());
+    INFO("Reading {:s}.", gmsh_mesh_arg.getValue().c_str());
 #ifndef WIN32
     BaseLib::MemWatch mem_watch;
     unsigned long mem_without_mesh (mem_watch.getVirtMemUsage());
@@ -92,16 +88,18 @@ int main (int argc, char* argv[])
         FileIO::GMSH::readGMSHMesh(gmsh_mesh_arg.getValue()));
 
     if (mesh == nullptr) {
-        INFO("Could not read mesh from %s.", gmsh_mesh_arg.getValue().c_str());
+        INFO("Could not read mesh from {:s}.",
+             gmsh_mesh_arg.getValue().c_str());
         return -1;
     }
 #ifndef WIN32
-    INFO("Mem for mesh: %i MB",
+    INFO("Mem for mesh: {:i} MB",
          (mem_watch.getVirtMemUsage() - mem_without_mesh) / (1024 * 1024));
 #endif
 
-    INFO("Time for reading: %f seconds.", run_time.elapsed());
-    INFO("Read %d nodes and %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Time for reading: {:f} seconds.", run_time.elapsed());
+    INFO("Read {:d} nodes and {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     // *** remove line elements on request
     if (exclude_lines_arg.getValue()) {
@@ -109,7 +107,8 @@ int main (int argc, char* argv[])
         ex.searchByElementType(MeshLib::MeshElemType::LINE);
         auto m = MeshLib::removeElements(*mesh, ex.getSearchedElementIDs(), mesh->getName()+"-withoutLines");
         if (m != nullptr) {
-            INFO("Removed %d lines.", mesh->getNumberOfElements() - m->getNumberOfElements());
+            INFO("Removed {:d} lines.",
+                 mesh->getNumberOfElements() - m->getNumberOfElements());
             std::swap(m, mesh);
             delete m;
         } else {
@@ -129,11 +128,14 @@ int main (int argc, char* argv[])
     auto const minPt(aabb.getMinPoint());
     auto const maxPt(aabb.getMaxPoint());
     INFO("Node coordinates:");
-    INFO("\tx [%g, %g] (extent %g)", minPt[0], maxPt[0], maxPt[0] - minPt[0]);
-    INFO("\ty [%g, %g] (extent %g)", minPt[1], maxPt[1], maxPt[1] - minPt[1]);
-    INFO("\tz [%g, %g] (extent %g)", minPt[2], maxPt[2], maxPt[2] - minPt[2]);
-
-    INFO("Edge length: [%g, %g]", mesh->getMinEdgeLength(),
+    INFO("\tx [{:g}, {:g}] (extent {:g})", minPt[0], maxPt[0],
+         maxPt[0] - minPt[0]);
+    INFO("\ty [{:g}, {:g}] (extent {:g})", minPt[1], maxPt[1],
+         maxPt[1] - minPt[1]);
+    INFO("\tz [{:g}, {:g}] (extent {:g})", minPt[2], maxPt[2],
+         maxPt[2] - minPt[2]);
+
+    INFO("Edge length: [{:g}, {:g}]", mesh->getMinEdgeLength(),
          mesh->getMaxEdgeLength());
 
     // Element information
diff --git a/Applications/Utils/FileConverter/GocadSGridReader.cpp b/Applications/Utils/FileConverter/GocadSGridReader.cpp
index 340d200841b716955392fbba29618f30cff79d4b..5c8197056b5abbd008b7d1069a1cb7a6592fd8d8 100644
--- a/Applications/Utils/FileConverter/GocadSGridReader.cpp
+++ b/Applications/Utils/FileConverter/GocadSGridReader.cpp
@@ -7,18 +7,18 @@
  *              http://www.opengeosys.org/LICENSE.txt
  */
 
+#include "Applications/FileIO/GocadIO/GocadSGridReader.h"
+
+#include <spdlog/spdlog.h>
+#include <tclap/CmdLine.h>
+
 #include <fstream>
 #include <sstream>
 #include <string>
 
-#include <logog/include/logog.hpp>
-#include <tclap/CmdLine.h>
-
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/GocadIO/GenerateFaceSetMeshes.h"
-#include "Applications/FileIO/GocadIO/GocadSGridReader.h"
-#include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
+#include "InfoLib/GitInfo.h"
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/IO/writeMeshToFile.h"
 #include "MeshLib/Mesh.h"
@@ -26,8 +26,6 @@
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Reads a Gocad stratigraphic grid file (file ending sg) and writes the "
         "data in the vtk unstructured grid file format. The documentation is "
@@ -77,7 +75,7 @@ int main(int argc, char* argv[])
     auto property_names(mesh->getProperties().getPropertyVectorNames());
     for (auto const& property_name : property_names)
     {
-        INFO("- %s (#values: %d)", property_name.c_str(),
+        INFO("- {:s} (#values: {:d})", property_name.c_str(),
              mesh->getProperties()
                  .getPropertyVector<double>(property_name)
                  ->size());
@@ -88,10 +86,11 @@ int main(int argc, char* argv[])
                                 mesh->getProperties()
                                     .getPropertyVector<double>(property_name)
                                     ->cend()));
-        INFO("\tvalues in range [%e, %e].", *(bounds.first), *(bounds.second));
+        INFO("\tvalues in range [{:e}, {:e}].", *(bounds.first),
+             *(bounds.second));
     }
 
-    INFO("Writing mesh to '%s'.", mesh_output_arg.getValue().c_str());
+    INFO("Writing mesh to '{:s}'.", mesh_output_arg.getValue().c_str());
     MeshLib::IO::writeMeshToFile(*mesh, mesh_output_arg.getValue());
 
     return 0;
diff --git a/Applications/Utils/FileConverter/GocadTSurfaceReader.cpp b/Applications/Utils/FileConverter/GocadTSurfaceReader.cpp
index f86f6804872246d1d53b8b6f96d81d63668d147b..e402dbfd5dc48ead7241f72c21e798f9502006f1 100644
--- a/Applications/Utils/FileConverter/GocadTSurfaceReader.cpp
+++ b/Applications/Utils/FileConverter/GocadTSurfaceReader.cpp
@@ -12,7 +12,6 @@
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/Mesh.h"
 #include "MeshLib/IO/VtkIO/VtuInterface.h"
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/GocadIO/GocadAsciiReader.h"
 
 std::string getDelim(std::string const& str)
@@ -24,8 +23,6 @@ std::string getDelim(std::string const& str)
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Reads Gocad ascii files (*.ts, *.pl, *.mx) and writes TSurf- and PLine"
         "data into one or more VTU unstructured grids.\n\n"
@@ -86,7 +83,7 @@ int main(int argc, char* argv[])
         ERR("Error reading file.");
         return 1;
     }
-    INFO("%d meshes found.", meshes.size());
+    INFO("{:d} meshes found.", meshes.size());
     std::string const dir = output_arg.getValue();
     bool const write_binary = write_binary_arg.getValue();
     std::string const delim = getDelim(dir);
@@ -96,7 +93,7 @@ int main(int argc, char* argv[])
         {
             continue;
         }
-        INFO("Writing mesh \"%s\"", mesh->getName().c_str());
+        INFO("Writing mesh \"{:s}\"", mesh->getName().c_str());
         int data_mode = (write_binary) ? 2 : 0;
         bool compressed = (write_binary);
         MeshLib::IO::VtuInterface vtu(mesh.get(), data_mode, compressed);
diff --git a/Applications/Utils/FileConverter/Mesh2Raster.cpp b/Applications/Utils/FileConverter/Mesh2Raster.cpp
index dfc04a8e0104df0e77dcaa2abb4d46ee092ea6f6..d8506ed5c9aba29be8619735d959595aa88d72ae 100644
--- a/Applications/Utils/FileConverter/Mesh2Raster.cpp
+++ b/Applications/Utils/FileConverter/Mesh2Raster.cpp
@@ -8,24 +8,22 @@
  *              http://www.opengeosys.org/LICENSE.txt
  */
 
+#include <tclap/CmdLine.h>
+
+#include <fstream>
 #include <memory>
 #include <string>
 
-#include <tclap/CmdLine.h>
-
-#include "Applications/ApplicationsLib/LogogSetup.h"
-#include "InfoLib/GitInfo.h"
 #include "GeoLib/AABB.h"
+#include "InfoLib/GitInfo.h"
 #include "MeshLib/IO/readMeshFromFile.h"
 #include "MeshLib/Mesh.h"
+#include "MeshLib/MeshEditing/ProjectPointOnMesh.h"
 #include "MeshLib/MeshSearch/MeshElementGrid.h"
 #include "MeshLib/Node.h"
-#include "MeshLib/MeshEditing/ProjectPointOnMesh.h"
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Mesh to raster converter.\n"
         "Rasterises a 2D mesh, pixel values are set to the elevation of a "
@@ -67,7 +65,7 @@ int main(int argc, char* argv[])
 
     double const cellsize =
         (cell_arg.isSet()) ? cell_arg.getValue() : mesh->getMinEdgeLength();
-    INFO("Cellsize set to %f", cellsize);
+    INFO("Cellsize set to {:f}", cellsize);
 
     std::vector<MeshLib::Node*> const& nodes_vec(mesh->getNodes());
     GeoLib::AABB const bounding_box(nodes_vec.begin(), nodes_vec.end());
@@ -88,7 +86,7 @@ int main(int argc, char* argv[])
     out << std::fixed << "cellsize      " << cellsize << "\n";
     out << "NODATA_value  "
         << "-9999\n";
-    INFO("Writing raster with %d x %d pixels.", n_cols, n_rows);
+    INFO("Writing raster with {:d} x {:d} pixels.", n_cols, n_rows);
 
     MeshLib::MeshElementGrid const grid(*mesh);
     double const max_edge(mesh->getMaxEdgeLength() + cellsize);
@@ -153,6 +151,6 @@ int main(int argc, char* argv[])
         out << "\n";
     }
     out.close();
-    INFO("Result written to %s", output_arg.getValue().c_str());
+    INFO("Result written to {:s}", output_arg.getValue().c_str());
     return 0;
 }
diff --git a/Applications/Utils/FileConverter/Mesh2Shape.cpp b/Applications/Utils/FileConverter/Mesh2Shape.cpp
index 199a61d6f42923735f17d6436646f290bf66a7a8..a7b268dc6596618222088c8414cf2882ddf9106a 100644
--- a/Applications/Utils/FileConverter/Mesh2Shape.cpp
+++ b/Applications/Utils/FileConverter/Mesh2Shape.cpp
@@ -9,7 +9,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/SHPInterface.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -17,8 +16,6 @@
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts 2D mesh file into shapfile such that each element is "
         "represented by a polygon. Cell attributes are transferred onto shape "
diff --git a/Applications/Utils/FileConverter/NetCdfConverter.cpp b/Applications/Utils/FileConverter/NetCdfConverter.cpp
index 5f5995f49fad27d6f4497a7d0a93976df368e1c4..9f7ae02b9af1522b92331314d52f81b0046bec14 100644
--- a/Applications/Utils/FileConverter/NetCdfConverter.cpp
+++ b/Applications/Utils/FileConverter/NetCdfConverter.cpp
@@ -8,28 +8,25 @@
  */
 
 // STL
+#include <tclap/CmdLine.h>
+
 #include <cctype>
 #include <iostream>
 #include <limits>
 #include <memory>
+#include <netcdf>
 #include <numeric>
 #include <sstream>
 #include <string>
 #include <utility>
 
-#include <tclap/CmdLine.h>
-
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
-#include <netcdf>
-
 #include "BaseLib/FileTools.h"
-#include "BaseLib/LogogSimpleFormatter.h"
-#include "InfoLib/GitInfo.h"
+#include "BaseLib/Logging.h"
 #include "GeoLib/Raster.h"
+#include "InfoLib/GitInfo.h"
+#include "MeshLib/IO/VtkIO/VtuInterface.h"
 #include "MeshLib/Mesh.h"
 #include "MeshLib/MeshGenerators/RasterToMesh.h"
-#include "MeshLib/IO/VtkIO/VtuInterface.h"
 
 using namespace netCDF;
 
@@ -50,7 +47,7 @@ static void showErrorMessage(std::size_t const error_id,
     }
     else if (error_id == 1)
     {
-        ERR("Index not valid. Valid indices are in [0,%d].", max);
+        ERR("Index not valid. Valid indices are in [0,{:d}].", max);
     }
     else if (error_id == 2)
     {
@@ -363,9 +360,11 @@ static double getResolution(NcFile const& dataset, NcVar const& var)
     auto const bounds = (dim_var.isNull()) ? getDimLength(var, dim_idx)
                                            : getBoundaries(dim_var);
     std::size_t const dim_size = var.getDim(dim_idx).getSize();
-    std::string const err_msg("Dimension \"" + var.getDim(dim_idx).getName() +
-                              "\" has size 0. Aborting...");
-    if (dim_size == 0) return OGS_FATAL(err_msg.c_str());
+    if (dim_size == 0)
+    {
+        OGS_FATAL("Dimension '{:s}' has size 0. Aborting...",
+                  var.getDim(dim_idx).getName());
+    }
     return std::fabs(bounds.second - bounds.first) / static_cast<double>(dim_size);
 }
 
@@ -447,7 +446,8 @@ static bool assignDimParams(NcVar const& var,
     if (arg_dim_time.getValue() >= n_dims || arg_dim1.getValue() >= n_dims ||
         arg_dim2.getValue() >= n_dims || arg_dim3.getValue() >= n_dims)
     {
-        ERR("Maximum allowed dimension for variable \"%s\" is %d.", var.getName().c_str(), n_dims-1);
+        ERR("Maximum allowed dimension for variable \"{:s}\" is {:d}.",
+            var.getName().c_str(), n_dims - 1);
         return false;
     }
 
@@ -575,8 +575,6 @@ static bool convert(NcFile const& dataset, NcVar const& var,
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts NetCDF data into mesh file(s).\n\n "
         "OpenGeoSys-6 software, version " +
@@ -676,7 +674,8 @@ int main(int argc, char* argv[])
     NcVar const& var = dataset.getVar(var_name);
     if (var.isNull())
     {
-        ERR("Variable \"%s\" not found in file.", arg_varname.getValue().c_str());
+        ERR("Variable \"{:s}\" not found in file.",
+            arg_varname.getValue().c_str());
         return EXIT_FAILURE;
     }
 
diff --git a/Applications/Utils/FileConverter/OGS2VTK.cpp b/Applications/Utils/FileConverter/OGS2VTK.cpp
index 4554f99aaa12514525a64a5be499acc5b009c69e..8a9615f67547123008bf3977619e6b6baad1701e 100644
--- a/Applications/Utils/FileConverter/OGS2VTK.cpp
+++ b/Applications/Utils/FileConverter/OGS2VTK.cpp
@@ -16,7 +16,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/IO/VtkIO/VtuInterface.h"
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -24,8 +23,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts OGS mesh into VTK mesh.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -58,7 +55,7 @@ int main (int argc, char* argv[])
     {
         return EXIT_FAILURE;
     }
-    INFO("Mesh read: %d nodes, %d elements.", mesh->getNumberOfNodes(),
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
          mesh->getNumberOfElements());
 
     auto const data_mode =
diff --git a/Applications/Utils/FileConverter/TIN2VTK.cpp b/Applications/Utils/FileConverter/TIN2VTK.cpp
index 09d7a153705e79f1894892f16f3540e5b74f2533..e43dc754ca150958003ced4b9d43e682b0f1f7f0 100644
--- a/Applications/Utils/FileConverter/TIN2VTK.cpp
+++ b/Applications/Utils/FileConverter/TIN2VTK.cpp
@@ -13,8 +13,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 // BaseLib
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
@@ -34,8 +32,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts TIN file into VTU file.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -64,12 +60,13 @@ int main (int argc, char* argv[])
     {
         return EXIT_FAILURE;
     }
-    INFO("TIN read:  %d points, %d triangles", point_vec.size(),
+    INFO("TIN read:  {:d} points, {:d} triangles", point_vec.size(),
          sfc->getNumberOfTriangles());
 
     INFO("converting to mesh data");
     std::unique_ptr<MeshLib::Mesh> mesh(MeshLib::convertSurfaceToMesh(*sfc, BaseLib::extractBaseNameWithoutExtension(tinFileName), std::numeric_limits<double>::epsilon()));
-    INFO("Mesh created: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Mesh created: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     INFO("Write it into VTU");
     MeshLib::IO::VtuInterface writer(mesh.get());
diff --git a/Applications/Utils/FileConverter/TecPlotTools.cpp b/Applications/Utils/FileConverter/TecPlotTools.cpp
index c3f91655202571ba8244f61c8f63df053e40bbf3..2ac3c338a707e82fcd18ea9c0093acb6cb7599c7 100644
--- a/Applications/Utils/FileConverter/TecPlotTools.cpp
+++ b/Applications/Utils/FileConverter/TecPlotTools.cpp
@@ -14,8 +14,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include <Applications/ApplicationsLib/LogogSetup.h>
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/StringTools.h"
 
@@ -112,7 +110,8 @@ bool dataCountError(std::string const& name,
 {
     if (current != total)
     {
-        ERR("Data rows found do not fit specified dimensions for section '%s'.",
+        ERR("Data rows found do not fit specified dimensions for section "
+            "'{:s}'.",
             name.c_str());
         return true;
     }
@@ -163,7 +162,7 @@ void writeTecPlotSection(std::ofstream& out,
 
         val_count = 0;
         val_total = 0;
-        INFO("Writing section #%i", write_count);
+        INFO("Writing section #{:i}", write_count);
         out.close();
         out.open(base_name + std::to_string(write_count++) + extension);
     }
@@ -208,7 +207,7 @@ int writeDataToMesh(std::string const& file_name,
             vec_names[i], MeshLib::MeshItemType::Cell, 1);
         if (!prop)
         {
-            ERR("Error creating array '%s'.", vec_names[i].c_str());
+            ERR("Error creating array '{:s}'.", vec_names[i].c_str());
             return -5;
         }
         prop->reserve(scalars[i].size());
@@ -219,7 +218,7 @@ int writeDataToMesh(std::string const& file_name,
     std::string const base_name(file_name.substr(0, delim_pos + 1));
     std::string const extension(file_name.substr(delim_pos, std::string::npos));
 
-    INFO("Writing section #%i", write_count);
+    INFO("Writing section #{:i}", write_count);
     MeshLib::IO::VtuInterface vtu(mesh.get());
     vtu.writeToFile(base_name + std::to_string(write_count++) + extension);
     return 0;
@@ -292,7 +291,7 @@ int splitFile(std::ifstream& in, std::string file_name)
     {
         return -3;
     }
-    INFO("Writing time step #%i", write_count);
+    INFO("Writing time step #{:i}", write_count);
     out.close();
     INFO("Finished split.");
     return 0;
@@ -408,8 +407,6 @@ int convertFile(std::ifstream& in, std::string file_name)
  */
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "TecPlot Parser\n\n"
         "OpenGeoSys-6 software, version " +
@@ -447,7 +444,7 @@ int main(int argc, char* argv[])
     std::ifstream in(input_arg.getValue().c_str());
     if (!in.is_open())
     {
-        ERR("Could not open file %s.", input_arg.getValue().c_str());
+        ERR("Could not open file {:s}.", input_arg.getValue().c_str());
         return -2;
     }
 
diff --git a/Applications/Utils/FileConverter/VTK2OGS.cpp b/Applications/Utils/FileConverter/VTK2OGS.cpp
index 53766376e7ede923a094e6852283fd674c672504..9f3746bb484716e0252b64dfe56b14ae65814f18 100644
--- a/Applications/Utils/FileConverter/VTK2OGS.cpp
+++ b/Applications/Utils/FileConverter/VTK2OGS.cpp
@@ -16,7 +16,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/IO/Legacy/MeshIO.h"
 #include "MeshLib/IO/VtkIO/VtuInterface.h"
@@ -24,8 +23,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts VTK mesh into OGS mesh.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -45,7 +42,8 @@ int main (int argc, char* argv[])
     cmd.parse(argc, argv);
 
     MeshLib::Mesh* mesh (MeshLib::IO::VtuInterface::readVTUFile(mesh_in.getValue()));
-    INFO("Mesh read: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     MeshLib::IO::Legacy::MeshIO meshIO;
     meshIO.setMesh(mesh);
diff --git a/Applications/Utils/FileConverter/VTK2TIN.cpp b/Applications/Utils/FileConverter/VTK2TIN.cpp
index 31e8866342e988f438f6dca5fc0004fd35dec600..621558d2ca9da5c60e064483e976587670d80286 100644
--- a/Applications/Utils/FileConverter/VTK2TIN.cpp
+++ b/Applications/Utils/FileConverter/VTK2TIN.cpp
@@ -13,11 +13,9 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 // BaseLib
 #include "InfoLib/GitInfo.h"
-#include "BaseLib/LogogSimpleFormatter.h"
+#include "BaseLib/Logging.h"
 
 // GeoLib
 #include "GeoLib/GEOObjects.h"
@@ -35,8 +33,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts VTK mesh into TIN file.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -56,7 +52,8 @@ int main (int argc, char* argv[])
     cmd.parse(argc, argv);
 
     std::unique_ptr<MeshLib::Mesh> mesh (MeshLib::IO::VtuInterface::readVTUFile(mesh_in.getValue()));
-    INFO("Mesh read: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     INFO("Converting the mesh to TIN");
     GeoLib::GEOObjects geo_objects;
diff --git a/Applications/Utils/FileConverter/convertGEO.cpp b/Applications/Utils/FileConverter/convertGEO.cpp
index d56c25d8905edd7f43a359c0d95e15d8ad887367..0c59d694193eb9b496f28830db9807b48f172aeb 100644
--- a/Applications/Utils/FileConverter/convertGEO.cpp
+++ b/Applications/Utils/FileConverter/convertGEO.cpp
@@ -14,7 +14,6 @@
 
 #include "InfoLib/GitInfo.h"
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/readGeometryFromFile.h"
 #include "Applications/FileIO/writeGeometryToFile.h"
 #include "GeoLib/GEOObjects.h"
@@ -22,8 +21,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts OGS geometry file into another file format. "
         "Currently *.gml (OGS6 XML-based format) and *.gli (OGS5 format) "
diff --git a/Applications/Utils/FileConverter/generateMatPropsFromMatID.cpp b/Applications/Utils/FileConverter/generateMatPropsFromMatID.cpp
index 103fed5fcab3201c4e320ab42f1620334d8364fe..866430351beeb76d56bec40901561b5a2ae458c8 100644
--- a/Applications/Utils/FileConverter/generateMatPropsFromMatID.cpp
+++ b/Applications/Utils/FileConverter/generateMatPropsFromMatID.cpp
@@ -16,8 +16,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 
@@ -29,8 +27,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Creates a new file for material properties and sets the material ids "
         "in the msh-file to 0\n\n"
@@ -57,7 +53,7 @@ int main (int argc, char* argv[])
 
     if (!mesh)
     {
-        INFO("Could not read mesh from file '%s'.",
+        INFO("Could not read mesh from file '{:s}'.",
              mesh_arg.getValue().c_str());
         return EXIT_FAILURE;
     }
@@ -86,17 +82,17 @@ int main (int argc, char* argv[])
     }
     else
     {
-        ERR("Could not create property '%s' file.", new_matname.c_str());
+        ERR("Could not create property '{:s}' file.", new_matname.c_str());
         return EXIT_FAILURE;
     }
 
     mesh->getProperties().removePropertyVector("MaterialIDs");
 
     std::string const new_mshname(name + "_new.vtu");
-    INFO("Writing mesh to file '%s'.", new_mshname.c_str());
+    INFO("Writing mesh to file '{:s}'.", new_mshname.c_str());
     MeshLib::IO::writeMeshToFile(*mesh, new_mshname);
 
-    INFO("New files '%s' and '%s' written.", new_mshname.c_str(),
+    INFO("New files '{:s}' and '{:s}' written.", new_mshname.c_str(),
          new_matname.c_str());
 
     return EXIT_SUCCESS;
diff --git a/Applications/Utils/GeoTools/MoveGeometry.cpp b/Applications/Utils/GeoTools/MoveGeometry.cpp
index b393404865eb3e04cb769af35ae5da095a89997d..dadedf8a0eb1f32a1898465afadee58eb4ed5790 100644
--- a/Applications/Utils/GeoTools/MoveGeometry.cpp
+++ b/Applications/Utils/GeoTools/MoveGeometry.cpp
@@ -14,7 +14,6 @@
 // ThirdParty
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "GeoLib/GEOObjects.h"
 #include "GeoLib/IO/XmlIO/Qt/XmlGmlInterface.h"
@@ -26,8 +25,6 @@ int main(int argc, char *argv[])
 {
     QCoreApplication app(argc, argv);
 
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Moves the points of a geometry by a given displacement vector\n\n"
         "OpenGeoSys-6 software, version " +
@@ -64,8 +61,8 @@ int main(int argc, char *argv[])
     }
     catch (std::runtime_error const& err)
     {
-        ERR("Failed to read file `%s'.", geo_input_arg.getValue().c_str());
-        ERR("%s", err.what());
+        ERR("Failed to read file `{:s}'.", geo_input_arg.getValue().c_str());
+        ERR("{:s}", err.what());
         return EXIT_FAILURE;
     }
 
diff --git a/Applications/Utils/GeoTools/TriangulatePolyline.cpp b/Applications/Utils/GeoTools/TriangulatePolyline.cpp
index ad8a991468f2f5ff3d1a4184ebad50b8b898bf28..7d0870dac1ec1bafc8f5e2185e68526216469856 100644
--- a/Applications/Utils/GeoTools/TriangulatePolyline.cpp
+++ b/Applications/Utils/GeoTools/TriangulatePolyline.cpp
@@ -15,7 +15,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/Legacy/createSurface.h"
 
 #include "InfoLib/GitInfo.h"
@@ -40,8 +39,6 @@ int main(int argc, char *argv[])
 {
     QCoreApplication app(argc, argv, false);
 
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Triangulates the specified polyline in the given geometry file.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -77,8 +74,8 @@ int main(int argc, char *argv[])
     }
     catch (std::runtime_error const& err)
     {
-        ERR("Failed to read file `%s'.", file_name.c_str());
-        ERR("%s", err.what());
+        ERR("Failed to read file `{:s}'.", file_name.c_str());
+        ERR("{:s}", err.what());
         return EXIT_FAILURE;
     }
 
@@ -90,7 +87,7 @@ int main(int argc, char *argv[])
     // check if line exists
     if (line == nullptr)
     {
-        ERR("No polyline found with name '%s'. Aborting...",
+        ERR("No polyline found with name '{:s}'. Aborting...",
             polyline_name.c_str());
         return EXIT_FAILURE;
     }
diff --git a/Applications/Utils/MeshEdit/AddTopLayer.cpp b/Applications/Utils/MeshEdit/AddTopLayer.cpp
index ade20901240b2e23b8ec77c9c2c7c1c3b991f29a..b16ad59223e62db4b1e495e7490d7e9f7e2a6113 100644
--- a/Applications/Utils/MeshEdit/AddTopLayer.cpp
+++ b/Applications/Utils/MeshEdit/AddTopLayer.cpp
@@ -13,7 +13,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -23,8 +22,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Adds a top layer to an existing mesh"
         "The documentation is available at "
@@ -51,11 +48,11 @@ int main (int argc, char* argv[])
 
     cmd.parse(argc, argv);
 
-    INFO("Reading mesh '%s' ... ", mesh_arg.getValue().c_str());
+    INFO("Reading mesh '{:s}' ... ", mesh_arg.getValue().c_str());
     auto subsfc_mesh = std::unique_ptr<MeshLib::Mesh>(
         MeshLib::IO::readMeshFromFile(mesh_arg.getValue()));
     if (!subsfc_mesh) {
-        ERR("Error reading mesh '%s'.", mesh_arg.getValue().c_str());
+        ERR("Error reading mesh '{:s}'.", mesh_arg.getValue().c_str());
         return EXIT_FAILURE;
     }
     INFO("done.");
@@ -67,7 +64,7 @@ int main (int argc, char* argv[])
         return EXIT_FAILURE;
     }
 
-    INFO("Writing mesh '%s' ... ", mesh_out_arg.getValue().c_str());
+    INFO("Writing mesh '{:s}' ... ", mesh_out_arg.getValue().c_str());
     MeshLib::IO::writeMeshToFile(*result, mesh_out_arg.getValue());
     INFO("done.");
 
diff --git a/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp b/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp
index 1c2adee65de58fe884f843eaebc1701fc9eca737..7cb24fa42a772224263881d5ab9b78e7d55db61f 100644
--- a/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp
+++ b/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp
@@ -16,7 +16,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/readGeometryFromFile.h"
 #include "Applications/FileIO/writeGeometryToFile.h"
 
@@ -90,7 +89,7 @@ void writeBCsAndGeometry(GeoLib::GEOObjects& geometry_sets,
                          std::string const& bc_type, bool write_gml)
 {
     if (write_gml) {
-        INFO("write points to '%s.gml'.", geo_name.c_str());
+        INFO("write points to '{:s}.gml'.", geo_name.c_str());
         FileIO::writeGeometryToFile(geo_name, geometry_sets, out_fname+".gml");
     }
     FileIO::writeGeometryToFile(geo_name, geometry_sets, out_fname+".gli");
@@ -123,8 +122,6 @@ void writeBCsAndGeometry(GeoLib::GEOObjects& geometry_sets,
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Creates boundary conditions for mesh nodes along polylines."
         "The documentation is available at "
@@ -178,11 +175,11 @@ int main (int argc, char* argv[])
     cmd.parse(argc, argv);
 
     // *** read mesh
-    INFO("Reading mesh '%s' ... ", mesh_arg.getValue().c_str());
+    INFO("Reading mesh '{:s}' ... ", mesh_arg.getValue().c_str());
     std::unique_ptr<MeshLib::Mesh> subsurface_mesh(
         MeshLib::IO::readMeshFromFile(mesh_arg.getValue()));
     INFO("done.");
-    INFO("Extracting top surface of mesh '%s' ... ",
+    INFO("Extracting top surface of mesh '{:s}' ... ",
          mesh_arg.getValue().c_str());
     const MathLib::Vector3 dir(0,0,-1);
     double const angle(90);
@@ -208,7 +205,7 @@ int main (int argc, char* argv[])
     // *** get vector of polylines
     std::vector<GeoLib::Polyline*> const* plys(geometries.getPolylineVec(geo_name));
     if (!plys) {
-        ERR("Could not get vector of polylines out of geometry '%s'.",
+        ERR("Could not get vector of polylines out of geometry '{:s}'.",
             geo_name.c_str());
         return EXIT_FAILURE;
     }
diff --git a/Applications/Utils/MeshEdit/ExtractBoundary.cpp b/Applications/Utils/MeshEdit/ExtractBoundary.cpp
index 93011e9d35235d70afa9f333981041ccd0be25ce..a8124a6bb60e99eef383c4b3816385b8c3398ac4 100644
--- a/Applications/Utils/MeshEdit/ExtractBoundary.cpp
+++ b/Applications/Utils/MeshEdit/ExtractBoundary.cpp
@@ -16,7 +16,6 @@
 #include <string>
 #include <vector>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
 #include "InfoLib/GitInfo.h"
@@ -31,8 +30,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Tool extracts the boundary of the given mesh. The documentation is "
         "available at "
@@ -89,7 +86,7 @@ int main (int argc, char* argv[])
         return EXIT_FAILURE;
     }
 
-    INFO("Mesh read: %u nodes, %u elements.", mesh->getNumberOfNodes(),
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
          mesh->getNumberOfElements());
 
     // extract surface
@@ -98,7 +95,7 @@ int main (int argc, char* argv[])
             *mesh, node_prop_name.getValue(), element_prop_name.getValue(),
             face_prop_name.getValue()));
 
-    INFO("Created surface mesh: %u nodes, %u elements.",
+    INFO("Created surface mesh: {:d} nodes, {:d} elements.",
          surface_mesh->getNumberOfNodes(), surface_mesh->getNumberOfElements());
 
     std::string out_fname(mesh_out.getValue());
diff --git a/Applications/Utils/MeshEdit/ExtractSurface.cpp b/Applications/Utils/MeshEdit/ExtractSurface.cpp
index 78d7501540dab4edb272bb74b1c429c69fa1b5e1..3b7ffac05ce4fbc51281413db0c625d28b6ecb9a 100644
--- a/Applications/Utils/MeshEdit/ExtractSurface.cpp
+++ b/Applications/Utils/MeshEdit/ExtractSurface.cpp
@@ -15,8 +15,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -32,8 +30,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Tool extracts the surface of the given mesh. The documentation is "
         "available at "
@@ -104,7 +100,7 @@ int main (int argc, char* argv[])
         return EXIT_FAILURE;
     }
 
-    INFO("Mesh read: %u nodes, %u elements.", mesh->getNumberOfNodes(),
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
          mesh->getNumberOfElements());
 
     // extract surface
diff --git a/Applications/Utils/MeshEdit/MapGeometryToMeshSurface.cpp b/Applications/Utils/MeshEdit/MapGeometryToMeshSurface.cpp
index 6a50ea9daf87dd0345ab7948fdc9a99d4857e267..1da6f421b44bbc18ae8bfe2c177e2a872d9fbd32 100644
--- a/Applications/Utils/MeshEdit/MapGeometryToMeshSurface.cpp
+++ b/Applications/Utils/MeshEdit/MapGeometryToMeshSurface.cpp
@@ -14,7 +14,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "GeoLib/GEOObjects.h"
 #include "GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.h"
@@ -24,8 +23,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Maps geometric objects to the surface of a given mesh."
         "The documentation is available at "
@@ -61,7 +58,7 @@ int main (int argc, char* argv[])
     {
         GeoLib::IO::BoostXmlGmlInterface xml_io(geometries);
         if (xml_io.readFile(input_geometry_fname.getValue())) {
-            INFO("Read geometry from file '%s'.",
+            INFO("Read geometry from file '{:s}'.",
                  input_geometry_fname.getValue().c_str());
         } else {
             return EXIT_FAILURE;
diff --git a/Applications/Utils/MeshEdit/MoveMesh.cpp b/Applications/Utils/MeshEdit/MoveMesh.cpp
index 32fb54f1739b4ee8520aa9ed3e28048826c9a455..22b86853355b6c3cce019bde5cb234a565ed3fb9 100644
--- a/Applications/Utils/MeshEdit/MoveMesh.cpp
+++ b/Applications/Utils/MeshEdit/MoveMesh.cpp
@@ -12,7 +12,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -26,8 +25,6 @@
 
 int main(int argc, char *argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Moves the mesh nodes using the given displacement vector or if no "
         "displacement vector is given, moves the mesh nodes such that the "
@@ -64,7 +61,7 @@ int main(int argc, char *argv[])
     std::unique_ptr<MeshLib::Mesh> mesh(MeshLib::IO::readMeshFromFile(fname));
 
     if (!mesh) {
-        ERR("Could not read mesh from file '%s'.", fname.c_str());
+        ERR("Could not read mesh from file '{:s}'.", fname.c_str());
         return EXIT_FAILURE;
     }
 
@@ -82,7 +79,7 @@ int main(int argc, char *argv[])
         displacement[2] = z_arg.getValue();
     }
 
-    INFO("translate model (%f, %f, %f).",
+    INFO("translate model ({:f}, {:f}, {:f}).",
          displacement[0],
          displacement[1],
          displacement[2]);
diff --git a/Applications/Utils/MeshEdit/NodeReordering.cpp b/Applications/Utils/MeshEdit/NodeReordering.cpp
index ee5b1df5525584334c41d9676931b74d5dea22d3..f0661ca207a2d0e39b3e3323569a0b8ea647ffdc 100644
--- a/Applications/Utils/MeshEdit/NodeReordering.cpp
+++ b/Applications/Utils/MeshEdit/NodeReordering.cpp
@@ -16,7 +16,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "BaseLib/Algorithm.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/Elements/Element.h"
@@ -77,7 +76,7 @@ void reorderNodes(std::vector<MeshLib::Element*> &elements)
         }
     }
 
-    INFO("Corrected %d elements.", n_corrected_elements);
+    INFO("Corrected {:d} elements.", n_corrected_elements);
 }
 
 /// Re-ordering prism elements to correct OGS6 meshes with and without InSitu-Lib
@@ -143,8 +142,6 @@ void reorderNonlinearNodes(MeshLib::Mesh &mesh)
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logo_setup;
-
     TCLAP::CmdLine cmd(
         "Reordering of mesh nodes to make OGS Data Explorer 5 meshes "
         "compatible with OGS6.\n"
diff --git a/Applications/Utils/MeshEdit/RemoveGhostData.cpp b/Applications/Utils/MeshEdit/RemoveGhostData.cpp
index 9685a16cda23eb63fe5a1ddb4bc15039ad93074a..602cc6809ff1306997b16dd0cad5581ee9215bb2 100644
--- a/Applications/Utils/MeshEdit/RemoveGhostData.cpp
+++ b/Applications/Utils/MeshEdit/RemoveGhostData.cpp
@@ -9,12 +9,6 @@
  */
 
 #include <tclap/CmdLine.h>
-
-#include "Applications/ApplicationsLib/LogogSetup.h"
-#include "InfoLib/GitInfo.h"
-
-#include "MeshLib/IO/writeMeshToFile.h"
-
 #include <vtkCleanUnstructuredGrid.h>
 #include <vtkRemoveGhosts.h>
 #include <vtkSmartPointer.h>
@@ -22,10 +16,11 @@
 #include <vtkXMLPUnstructuredGridReader.h>
 #include <vtkXMLUnstructuredGridWriter.h>
 
+#include "InfoLib/GitInfo.h"
+#include "MeshLib/IO/writeMeshToFile.h"
+
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Reads a VTK partitioned unstructured grid (*.pvtu), cleans the ghost "
         "information and saves the data as as a regular, connected mesh file."
diff --git a/Applications/Utils/MeshEdit/ResetPropertiesInPolygonalRegion.cpp b/Applications/Utils/MeshEdit/ResetPropertiesInPolygonalRegion.cpp
index 53e8f8ccac22c20eb8140d8b2a3c39af7542e0eb..40e0bec8ec41fe594e055efabc86c7eeac10f123 100644
--- a/Applications/Utils/MeshEdit/ResetPropertiesInPolygonalRegion.cpp
+++ b/Applications/Utils/MeshEdit/ResetPropertiesInPolygonalRegion.cpp
@@ -15,7 +15,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/readGeometryFromFile.h"
 #include "InfoLib/GitInfo.h"
 #include "GeoLib/GEOObjects.h"
@@ -27,8 +26,6 @@
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Sets the property value of a mesh element to a given new value iff at "
         "least one node of the element is within a polygonal region that is "
@@ -106,7 +103,7 @@ int main(int argc, char* argv[])
     GeoLib::PolylineVec const* plys(geometries.getPolylineVecObj(geo_name));
     if (!plys)
     {
-        ERR("Could not get vector of polylines out of geometry '%s'.",
+        ERR("Could not get vector of polylines out of geometry '{:s}'.",
             geo_name.c_str());
         return EXIT_FAILURE;
     }
@@ -116,7 +113,7 @@ int main(int argc, char* argv[])
         plys->getElementByName(polygon_name_arg.getValue()));
     if (!ply)
     {
-        ERR("Polyline '%s' not found.", polygon_name_arg.getValue().c_str());
+        ERR("Polyline '{:s}' not found.", polygon_name_arg.getValue().c_str());
         return EXIT_FAILURE;
     }
 
@@ -124,7 +121,7 @@ int main(int argc, char* argv[])
     bool closed(ply->isClosed());
     if (!closed)
     {
-        ERR("Polyline '%s' is not closed, i.e. does not describe a region.",
+        ERR("Polyline '{:s}' is not closed, i.e. does not describe a region.",
             polygon_name_arg.getValue().c_str());
         return EXIT_FAILURE;
     }
@@ -164,10 +161,10 @@ int main(int argc, char* argv[])
 
     std::vector<std::string> property_names(
         mesh->getProperties().getPropertyVectorNames());
-    INFO("Mesh contains %d property vectors:", property_names.size());
+    INFO("Mesh contains {:d} property vectors:", property_names.size());
     for (const auto& name : property_names)
     {
-        INFO("- %s", name.c_str());
+        INFO("- {:s}", name.c_str());
     }
 
     MeshLib::IO::writeMeshToFile(*mesh, mesh_out.getValue());
diff --git a/Applications/Utils/MeshEdit/UnityPreprocessing.cpp b/Applications/Utils/MeshEdit/UnityPreprocessing.cpp
index 612e85f6c2cdbce0d897a6b40cfe58624ed37924..ca4b31aeefe022e89dab1b0224a77e8f00760a66 100644
--- a/Applications/Utils/MeshEdit/UnityPreprocessing.cpp
+++ b/Applications/Utils/MeshEdit/UnityPreprocessing.cpp
@@ -11,7 +11,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/Elements/Hex.h"
 #include "MeshLib/Elements/Line.h"
@@ -66,7 +65,7 @@ bool fillPropVec(MeshLib::Properties const& props,
     MeshLib::PropertyVector<T> const*const vec = props.getPropertyVector<T>(name);
     if (vec->getNumberOfComponents() != 1)
     {
-        INFO("Ignoring array '%s' (more than one component).", name.c_str());
+        INFO("Ignoring array '{:s}' (more than one component).", name.c_str());
         return false;
     }
 
@@ -75,7 +74,7 @@ bool fillPropVec(MeshLib::Properties const& props,
     new_vec->resize(total_nodes);
     if (vec->getMeshItemType() == MeshLib::MeshItemType::Node)
     {
-        INFO("Migrating node array '%s' to new mesh structure...",
+        INFO("Migrating node array '{:s}' to new mesh structure...",
              name.c_str());
         std::size_t const n_nodes (node_map.size());
         for (std::size_t i = 0; i<n_nodes; ++i)
@@ -89,7 +88,7 @@ bool fillPropVec(MeshLib::Properties const& props,
     }
     else if (vec->getMeshItemType() == MeshLib::MeshItemType::Cell)
     {
-        INFO("Transforming cell array '%s' into node array...", name.c_str());
+        INFO("Transforming cell array '{:s}' into node array...", name.c_str());
         std::size_t const n_elems (vec->size());
         for (std::size_t i = 0; i<n_elems; ++i)
         {
@@ -181,8 +180,6 @@ MeshLib::Mesh* constructMesh(MeshLib::Mesh const& mesh)
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Prepares OGS-meshes for use in Unity.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -204,7 +201,7 @@ int main (int argc, char* argv[])
 
     cmd.parse(argc, argv);
 
-    INFO("Reading mesh '%s' ... ", mesh_arg.getValue().c_str());
+    INFO("Reading mesh '{:s}' ... ", mesh_arg.getValue().c_str());
     std::unique_ptr<MeshLib::Mesh> mesh {MeshLib::IO::readMeshFromFile(mesh_arg.getValue())};
     if (!mesh)
     {
@@ -231,7 +228,7 @@ int main (int argc, char* argv[])
         MeshLib::ElementSearch searcher(*mesh);
         std::size_t const n_rem_elems = searcher.searchByElementType(MeshLib::MeshElemType::LINE);
         result.reset(MeshLib::removeElements(*mesh, searcher.getSearchedElementIDs(), "temp mesh"));
-        INFO ("%d line elements found and removed.\n", n_rem_elems);
+        INFO("{:d} line elements found and removed.\n", n_rem_elems);
     }
 
     INFO("Checking for cell-arrays...");
@@ -242,7 +239,7 @@ int main (int argc, char* argv[])
     else
         INFO("No cell arrays found, keeping mesh structure.\n");
 
-    INFO("Writing mesh '%s' ... ", mesh_out_arg.getValue().c_str());
+    INFO("Writing mesh '{:s}' ... ", mesh_out_arg.getValue().c_str());
     MeshLib::IO::VtuInterface writer(result.get(), vtkXMLWriter::Ascii, false);
     writer.writeToFile(mesh_out_arg.getValue());
     INFO("done.");
diff --git a/Applications/Utils/MeshEdit/Vtu2Grid.cpp b/Applications/Utils/MeshEdit/Vtu2Grid.cpp
index 37baa463bf749e79e69113d5dc8ab5cd018f89e9..3e60d23c74b420e629de95f35a066873a2e1290b 100644
--- a/Applications/Utils/MeshEdit/Vtu2Grid.cpp
+++ b/Applications/Utils/MeshEdit/Vtu2Grid.cpp
@@ -10,7 +10,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 
 #include "MeshLib/IO/writeMeshToFile.h"
@@ -131,14 +130,13 @@ void mapMeshArraysOntoGrid(vtkSmartPointer<vtkUnstructuredGrid> const& mesh,
             mapArray<int, vtkSmartPointer<vtkIntArray>>(*grid, int_arr, name);
             continue;
         }
-        WARN("Ignoring array '%s', array type not implemented...", name.c_str());
+        WARN("Ignoring array '{:s}', array type not implemented...",
+             name.c_str());
     }
 }
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Reads a 3D unstructured mesh and samples it onto a structured grid of "
         "the same extent. Cell properties are mapped onto the grid (sampled at "
diff --git a/Applications/Utils/MeshEdit/appendLinesAlongPolyline.cpp b/Applications/Utils/MeshEdit/appendLinesAlongPolyline.cpp
index dca08d361a0a6c896a62df64196f784212a94835..84a9ee0c7297d5526ad6a0015d07790debb3b18f 100644
--- a/Applications/Utils/MeshEdit/appendLinesAlongPolyline.cpp
+++ b/Applications/Utils/MeshEdit/appendLinesAlongPolyline.cpp
@@ -8,7 +8,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/readGeometryFromFile.h"
 
 #include "InfoLib/GitInfo.h"
@@ -25,8 +24,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Append line elements into a mesh.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -70,7 +67,7 @@ int main (int argc, char* argv[])
     const GeoLib::PolylineVec* ply_vec (geo_objs.getPolylineVecObj(geo_names[0]));
     if (!ply_vec)
     {
-        ERR("Could not find polylines in geometry '%s'.",
+        ERR("Could not find polylines in geometry '{:s}'.",
             geo_names.front().c_str());
         return EXIT_FAILURE;
     }
@@ -79,15 +76,17 @@ int main (int argc, char* argv[])
     MeshLib::Mesh const*const mesh (MeshLib::IO::readMeshFromFile(mesh_in.getValue()));
     if (!mesh)
     {
-        ERR("Mesh file '%s' not found", mesh_in.getValue().c_str());
+        ERR("Mesh file '{:s}' not found", mesh_in.getValue().c_str());
         return EXIT_FAILURE;
     }
-    INFO("Mesh read: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     // add line elements
     std::unique_ptr<MeshLib::Mesh> new_mesh =
         MeshGeoToolsLib::appendLinesAlongPolylines(*mesh, *ply_vec);
-    INFO("Mesh created: %d nodes, %d elements.", new_mesh->getNumberOfNodes(), new_mesh->getNumberOfElements());
+    INFO("Mesh created: {:d} nodes, {:d} elements.",
+         new_mesh->getNumberOfNodes(), new_mesh->getNumberOfElements());
 
     MeshLib::IO::writeMeshToFile(*new_mesh, mesh_out.getValue());
 
diff --git a/Applications/Utils/MeshEdit/checkMesh.cpp b/Applications/Utils/MeshEdit/checkMesh.cpp
index fa65f8245880bb45cff90a58b748429cf02c229a..39c80b155640ebe76d68df80d2d02c7a65dd93d7 100644
--- a/Applications/Utils/MeshEdit/checkMesh.cpp
+++ b/Applications/Utils/MeshEdit/checkMesh.cpp
@@ -11,8 +11,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/StringTools.h"
 #include "BaseLib/MemWatch.h"
@@ -31,8 +29,6 @@
 
 int main(int argc, char *argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Checks mesh properties.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -65,21 +61,26 @@ int main(int argc, char *argv[])
     const unsigned long mem_with_mesh (mem_watch.getVirtMemUsage());
     if (mem_with_mesh>0)
     {
-        INFO ("Memory size: %i MB", (mem_with_mesh - mem_without_mesh)/(1024*1024));
+        INFO("Memory size: {:i} MB",
+             (mem_with_mesh - mem_without_mesh) / (1024 * 1024));
         (void)mem_with_mesh;
     }
-    INFO ("Time for reading: %g s", run_time.elapsed());
+    INFO("Time for reading: {:g} s", run_time.elapsed());
 
     // Geometric information
     const GeoLib::AABB aabb(MeshLib::MeshInformation::getBoundingBox(*mesh));
     auto minPt(aabb.getMinPoint());
     auto maxPt(aabb.getMaxPoint());
     INFO("Node coordinates:");
-    INFO("\tx [%g, %g] (extent %g)", minPt[0], maxPt[0], maxPt[0]-minPt[0]);
-    INFO("\ty [%g, %g] (extent %g)", minPt[1], maxPt[1], maxPt[1]-minPt[1]);
-    INFO("\tz [%g, %g] (extent %g)", minPt[2], maxPt[2], maxPt[2]-minPt[2]);
-
-    INFO("Edge length: [%g, %g]", mesh->getMinEdgeLength(), mesh->getMaxEdgeLength());
+    INFO("\tx [{:g}, {:g}] (extent {:g})", minPt[0], maxPt[0],
+         maxPt[0] - minPt[0]);
+    INFO("\ty [{:g}, {:g}] (extent {:g})", minPt[1], maxPt[1],
+         maxPt[1] - minPt[1]);
+    INFO("\tz [{:g}, {:g}] (extent {:g})", minPt[2], maxPt[2],
+         maxPt[2] - minPt[2]);
+
+    INFO("Edge length: [{:g}, {:g}]", mesh->getMinEdgeLength(),
+         mesh->getMaxEdgeLength());
 
     // Element information
 
diff --git a/Applications/Utils/MeshEdit/convertToLinearMesh.cpp b/Applications/Utils/MeshEdit/convertToLinearMesh.cpp
index a8361b9e1197dbec5d496da00906a76bff6b6a9a..85af3caaf5dc290c310deb27c2192dbcd41cd653 100644
--- a/Applications/Utils/MeshEdit/convertToLinearMesh.cpp
+++ b/Applications/Utils/MeshEdit/convertToLinearMesh.cpp
@@ -12,8 +12,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 
 #include "MeshLib/Mesh.h"
@@ -25,8 +23,6 @@
 
 int main(int argc, char *argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Convert a non-linear mesh to a linear mesh.\n\n"
         "OpenGeoSys-6 software, version " +
diff --git a/Applications/Utils/MeshEdit/createLayeredMeshFromRasters.cpp b/Applications/Utils/MeshEdit/createLayeredMeshFromRasters.cpp
index fe64c7d4f00c35ecb70787ee0a0e772db4679738..43149b3518dc6eb6f8591d2101721f7b0cace76d 100644
--- a/Applications/Utils/MeshEdit/createLayeredMeshFromRasters.cpp
+++ b/Applications/Utils/MeshEdit/createLayeredMeshFromRasters.cpp
@@ -18,8 +18,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 
@@ -35,7 +33,7 @@ int readRasterPaths(std::string const& raster_list_file, std::vector<std::string
     std::ifstream in (raster_list_file.c_str());
     if (in.fail())
     {
-        ERR ("Could not open file %s.", raster_list_file.c_str());
+        ERR("Could not open file {:s}.", raster_list_file.c_str());
         return -1;
     }
     std::string line;
@@ -58,8 +56,6 @@ int readRasterPaths(std::string const& raster_list_file, std::vector<std::string
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Creates a layered 3D OGS mesh from an existing 2D OGS mesh and raster "
         "files representing subsurface layers. Supported raster formats are "
@@ -117,12 +113,12 @@ int main (int argc, char* argv[])
         }
     }
 
-    INFO("Reading mesh '%s' ... ", mesh_arg.getValue().c_str());
+    INFO("Reading mesh '{:s}' ... ", mesh_arg.getValue().c_str());
     std::unique_ptr<MeshLib::Mesh> const sfc_mesh(
         MeshLib::IO::readMeshFromFile(mesh_arg.getValue()));
     if (!sfc_mesh)
     {
-        ERR("Error reading mesh '%s'.", mesh_arg.getValue().c_str());
+        ERR("Error reading mesh '{:s}'.", mesh_arg.getValue().c_str());
         return EXIT_FAILURE;
     }
     if (sfc_mesh->getDimension() != 2)
@@ -157,7 +153,7 @@ int main (int argc, char* argv[])
         output_name.append(".vtu");
     }
 
-    INFO("Writing mesh '%s' ... ", output_name.c_str());
+    INFO("Writing mesh '{:s}' ... ", output_name.c_str());
     auto result_mesh = std::make_unique<MeshLib::Mesh>(
         *(mapper.getMesh("SubsurfaceMesh").release()));
 
diff --git a/Applications/Utils/MeshEdit/createQuadraticMesh.cpp b/Applications/Utils/MeshEdit/createQuadraticMesh.cpp
index a6954475d713870605c92cac007410b5320dc0f4..4dca46dadf4203b4a0a35a7c7b4c6b5eb73470db 100644
--- a/Applications/Utils/MeshEdit/createQuadraticMesh.cpp
+++ b/Applications/Utils/MeshEdit/createQuadraticMesh.cpp
@@ -12,8 +12,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 
 #include "MeshLib/Mesh.h"
@@ -25,8 +23,6 @@
 
 int main(int argc, char *argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Create quadratic order mesh.\n\n"
         "OpenGeoSys-6 software, version " +
diff --git a/Applications/Utils/MeshEdit/editMaterialID.cpp b/Applications/Utils/MeshEdit/editMaterialID.cpp
index c87484215de863a35862958b0549dd1fc37af387..823d3aab86a89cb76e304e063420f7118ca310e8 100644
--- a/Applications/Utils/MeshEdit/editMaterialID.cpp
+++ b/Applications/Utils/MeshEdit/editMaterialID.cpp
@@ -10,7 +10,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -20,8 +19,6 @@
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Edit material IDs of mesh elements.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -84,7 +81,8 @@ int main (int argc, char* argv[])
 
     std::unique_ptr<MeshLib::Mesh> mesh(
         MeshLib::IO::readMeshFromFile(mesh_in.getValue()));
-    INFO("Mesh read: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     if (condenseArg.isSet()) {
         INFO("Condensing material ID...");
@@ -94,7 +92,7 @@ int main (int argc, char* argv[])
         const auto vecOldID = matIDArg.getValue();
         const unsigned newID = newIDArg.getValue();
         for (auto oldID : vecOldID) {
-            INFO("%d -> %d", oldID, newID);
+            INFO("{:d} -> {:d}", oldID, newID);
             MeshLib::ElementValueModification::replace(*mesh, oldID, newID, true);
         }
     } else if (specifyArg.isSet()) {
@@ -103,7 +101,7 @@ int main (int argc, char* argv[])
         const MeshLib::MeshElemType eleType = MeshLib::String2MeshElemType(eleTypeName);
         const unsigned newID = newIDArg.getValue();
         unsigned cnt = MeshLib::ElementValueModification::setByElementType(*mesh, eleType, newID);
-        INFO("updated %d elements", cnt);
+        INFO("updated {:d} elements", cnt);
     }
 
     MeshLib::IO::writeMeshToFile(*mesh, mesh_out.getValue());
diff --git a/Applications/Utils/MeshEdit/moveMeshNodes.cpp b/Applications/Utils/MeshEdit/moveMeshNodes.cpp
index 7ff5d75349b312fd1a0a2b32eadd0b11e5d5380d..9946c7307897df4a63d56cd4799bbe50887eb7f8 100644
--- a/Applications/Utils/MeshEdit/moveMeshNodes.cpp
+++ b/Applications/Utils/MeshEdit/moveMeshNodes.cpp
@@ -12,7 +12,6 @@
 #include <memory>
 #include <string>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 #include "GeoLib/AABB.h"
@@ -45,8 +44,6 @@ double getClosestPointElevation(MeshLib::Node const& p,
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     std::vector<std::string> keywords;
     keywords.emplace_back("-ALL");
     keywords.emplace_back("-MESH");
@@ -57,7 +54,7 @@ int main (int argc, char* argv[])
         INFO(
             "Moves mesh nodes and connected elements either by a given value "
             "or based on a list.\n");
-        INFO("Usage: %s <msh-file.msh> <keyword> [<value1>] [<value2>]",
+        INFO("Usage: {:s} <msh-file.msh> <keyword> [<value1>] [<value2>]",
              argv[0]);
         INFO("Available keywords:");
         INFO(
@@ -78,7 +75,7 @@ int main (int argc, char* argv[])
     if (!(ext == "msh" || ext == "vtu"))
     {
         ERR("Error: Parameter 1 must be a mesh-file (*.msh / *.vtu).");
-        INFO("Usage: %s <msh-file.gml> <keyword> <value>", argv[0]);
+        INFO("Usage: {:s} <msh-file.gml> <keyword> <value>", argv[0]);
         return EXIT_FAILURE;
     }
 
@@ -96,7 +93,7 @@ int main (int argc, char* argv[])
     {
         ERR("Keyword not recognised. Available keywords:");
         for (auto const& keyword : keywords)
-            INFO("\t%s", keyword.c_str());
+            INFO("\t{:s}", keyword.c_str());
         return EXIT_FAILURE;
     }
 
@@ -120,8 +117,8 @@ int main (int argc, char* argv[])
         const std::string dir(argv[3]);
         unsigned idx = (dir == "x") ? 0 : (dir == "y") ? 1 : 2;
         const double value(strtod(argv[4],0));
-        INFO("Moving all mesh nodes by %g in direction %d (%s)...", value, idx,
-             dir.c_str());
+        INFO("Moving all mesh nodes by {:g} in direction {:d} ({:s})...", value,
+             idx, dir.c_str());
         //double value(-10);
         const std::size_t nNodes(mesh->getNumberOfNodes());
         std::vector<MeshLib::Node*> nodes (mesh->getNodes());
diff --git a/Applications/Utils/MeshEdit/queryMesh.cpp b/Applications/Utils/MeshEdit/queryMesh.cpp
index 321112d272fab5e32be1fec70ba669addc903176..bb81f98f0de971038a7db7b77a28efeced9bfd29 100644
--- a/Applications/Utils/MeshEdit/queryMesh.cpp
+++ b/Applications/Utils/MeshEdit/queryMesh.cpp
@@ -13,8 +13,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/StringTools.h"
 #include "BaseLib/FileTools.h"
@@ -26,8 +24,6 @@
 
 int main(int argc, char *argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Query mesh information.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -104,7 +100,7 @@ int main(int argc, char *argv[])
             }
         }
         out << std::endl;
-        INFO("%s", out.str().c_str());
+        INFO("{:s}", out.str().c_str());
     }
 
     for (auto node_id : selected_node_ids)
@@ -128,6 +124,6 @@ int main(int argc, char *argv[])
             out << nd->getID() << " ";
         }
         out << std::endl;
-        INFO("%s", out.str().c_str());
+        INFO("{:s}", out.str().c_str());
     }
 }
diff --git a/Applications/Utils/MeshEdit/removeMeshElements.cpp b/Applications/Utils/MeshEdit/removeMeshElements.cpp
index 2e57af6173a33c7e8c4b09cd0b2957edb2857112..ce366d7a0a2b59f2e863f6f8967e0d2823ca5fb6 100644
--- a/Applications/Utils/MeshEdit/removeMeshElements.cpp
+++ b/Applications/Utils/MeshEdit/removeMeshElements.cpp
@@ -15,7 +15,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -41,7 +40,7 @@ void searchByPropertyValue(std::string const& property_name,
                 property_name, property_value);
         }
 
-        INFO("%d elements with property value %s found.", n_marked_elements,
+        INFO("{:d} elements with property value {:s} found.", n_marked_elements,
              std::to_string(property_value).c_str());
     }
 }
@@ -63,14 +62,12 @@ void searchByPropertyRange(std::string const& property_name,
 
     // add checks for other data types here (if n_marked_elements remains 0)
 
-    INFO("%d elements in range [%s, %s] found.", n_marked_elements,
+    INFO("{:d} elements in range [{:s}, {:s}] found.", n_marked_elements,
          std::to_string(min_value).c_str(), std::to_string(max_value).c_str());
 }
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Removes mesh elements based on element type, element volume, scalar "
         "arrays, or bounding box . The documentation is available at "
@@ -153,12 +150,13 @@ int main (int argc, char* argv[])
         return EXIT_FAILURE;
     }
 
-    INFO("Mesh read: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
     MeshLib::ElementSearch searcher(*mesh);
 
     // search elements IDs to be removed
     if (zveArg.isSet()) {
-        INFO("%d zero volume elements found.", searcher.searchByContent());
+        INFO("{:d} zero volume elements found.", searcher.searchByContent());
     }
     if (eleTypeArg.isSet()) {
         const std::vector<std::string> eleTypeNames = eleTypeArg.getValue();
@@ -168,8 +166,8 @@ int main (int argc, char* argv[])
             {
                 continue;
             }
-            INFO("%d %s elements found.", searcher.searchByElementType(type),
-                 typeName.c_str());
+            INFO("{:d} {:s} elements found.",
+                 searcher.searchByElementType(type), typeName.c_str());
         }
     }
 
@@ -248,8 +246,9 @@ int main (int argc, char* argv[])
                 ySmallArg.getValue(), zSmallArg.getValue()}}),
             MathLib::Point3d(std::array<double,3>{{xLargeArg.getValue(),
                 yLargeArg.getValue(), zLargeArg.getValue()}})}});
-        INFO("%d elements found.",
-             searcher.searchByBoundingBox(GeoLib::AABB(extent.begin(), extent.end())));
+        INFO("{:d} elements found.",
+             searcher.searchByBoundingBox(
+                 GeoLib::AABB(extent.begin(), extent.end())));
     }
 
     // remove the elements and create a new mesh object.
diff --git a/Applications/Utils/MeshEdit/reviseMesh.cpp b/Applications/Utils/MeshEdit/reviseMesh.cpp
index 545c2018b9bb5a2cd4d5811d06b7829871361060..3d72c0146bbf0928dbf155a6d4344ed7771be12d 100644
--- a/Applications/Utils/MeshEdit/reviseMesh.cpp
+++ b/Applications/Utils/MeshEdit/reviseMesh.cpp
@@ -13,8 +13,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/StringTools.h"
 #include "BaseLib/FileTools.h"
@@ -29,8 +27,6 @@
 
 int main(int argc, char *argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Mesh revision tool.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -60,7 +56,8 @@ int main(int argc, char *argv[])
     {
         return EXIT_FAILURE;
     }
-    INFO("Mesh read: %d nodes, %d elements.", org_mesh->getNumberOfNodes(), org_mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.", org_mesh->getNumberOfNodes(),
+         org_mesh->getNumberOfElements());
 
     // revise the mesh
     std::unique_ptr<MeshLib::Mesh> new_mesh;
@@ -74,7 +71,8 @@ int main(int argc, char *argv[])
 
     // write into a file
     if (new_mesh) {
-        INFO("Revised mesh: %d nodes, %d elements.", new_mesh->getNumberOfNodes(), new_mesh->getNumberOfElements());
+        INFO("Revised mesh: {:d} nodes, {:d} elements.",
+             new_mesh->getNumberOfNodes(), new_mesh->getNumberOfElements());
         MeshLib::IO::writeMeshToFile(*new_mesh, output_arg.getValue());
     }
 
diff --git a/Applications/Utils/MeshEdit/swapNodeCoordinateAxes.cpp b/Applications/Utils/MeshEdit/swapNodeCoordinateAxes.cpp
index c2864214218e16993370f69fbd99de296ac3bcc0..8a63fdb52b132a1e5df62636fc2167065ff8bfa8 100644
--- a/Applications/Utils/MeshEdit/swapNodeCoordinateAxes.cpp
+++ b/Applications/Utils/MeshEdit/swapNodeCoordinateAxes.cpp
@@ -13,9 +13,8 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Mesh.h"
 #include "MeshLib/Node.h"
@@ -90,8 +89,6 @@ static bool parseNewOrder(std::string const& str_order, std::array<int, 3> &new_
 
 int main(int argc, char *argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Swap node coordinate values.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -131,7 +128,8 @@ int main(int argc, char *argv[])
         WARN("Swapping coordinate values of 3D elements can result in incorrect node-ordering.");
     }
 
-    INFO("Exchange node coordinates from xyz to %s", new_order_arg.getValue().data());
+    INFO("Exchange node coordinates from xyz to {:s}",
+         new_order_arg.getValue().data());
     swapNodeCoordinateAxes(*mesh, new_order);
 
     INFO("Save the new mesh into a file");
diff --git a/Applications/Utils/MeshGeoTools/computeSurfaceNodeIDsInPolygonalRegion.cpp b/Applications/Utils/MeshGeoTools/computeSurfaceNodeIDsInPolygonalRegion.cpp
index 7d4dc1753c0893b3fd382eb6dafff86e0a25cf50..bc496bf000a6aa6a0b26187d0a0db07ffefec56a 100644
--- a/Applications/Utils/MeshGeoTools/computeSurfaceNodeIDsInPolygonalRegion.cpp
+++ b/Applications/Utils/MeshGeoTools/computeSurfaceNodeIDsInPolygonalRegion.cpp
@@ -17,7 +17,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/readGeometryFromFile.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/Error.h"
@@ -36,12 +35,12 @@ void writeToFile(std::string const& id_area_fname, std::string const& csv_fname,
 {
     std::ofstream ids_and_area_out(id_area_fname);
     if (!ids_and_area_out) {
-        OGS_FATAL("Unable to open the file '%s' - aborting.",
+        OGS_FATAL("Unable to open the file '{:s}' - aborting.",
                   id_area_fname.c_str());
     }
     std::ofstream csv_out(csv_fname);
     if (!csv_out) {
-        OGS_FATAL("Unable to open the file '%s' - aborting.",
+        OGS_FATAL("Unable to open the file '{:s}' - aborting.",
                   csv_fname.c_str());
     }
 
@@ -64,8 +63,6 @@ void writeToFile(std::string const& id_area_fname, std::string const& csv_fname,
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Computes ids of mesh nodes that are in polygonal regions and resides "
         "on the top surface. The polygonal regions have to be given in a gml- "
@@ -95,14 +92,15 @@ int main (int argc, char* argv[])
     cmd.parse(argc, argv);
 
     std::unique_ptr<MeshLib::Mesh const> mesh(MeshLib::IO::readMeshFromFile(mesh_in.getValue()));
-    INFO("Mesh read: %u nodes, %u elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.", mesh->getNumberOfNodes(),
+         mesh->getNumberOfElements());
 
     GeoLib::GEOObjects geo_objs;
     FileIO::readGeometryFromFile(geo_in.getValue(), geo_objs,
                                  gmsh_path_arg.getValue());
     std::vector<std::string> geo_names;
     geo_objs.getGeometryNames(geo_names);
-    INFO("Geometry '%s' read: %u points, %u polylines.",
+    INFO("Geometry '{:s}' read: {:d} points, {:d} polylines.",
          geo_names[0].c_str(),
          geo_objs.getPointVec(geo_names[0])->size(),
          geo_objs.getPolylineVec(geo_names[0])->size());
@@ -154,7 +152,7 @@ int main (int argc, char* argv[])
             }
         }
         if (ids_and_areas.empty()) {
-            ERR("Polygonal part of surface '%s' doesn't contains nodes. No "
+            ERR("Polygonal part of surface '{:s}' doesn't contains nodes. No "
                 "output will be generated.",
                 polygon_name.c_str());
             continue;
@@ -166,8 +164,8 @@ int main (int argc, char* argv[])
         id_and_area_fname += std::to_string(j) + ".txt";
         csv_fname += std::to_string(j) + ".csv";
         INFO(
-            "Polygonal part of surface '%s' contains %ul nodes. Writting to"
-            " files '%s' and '%s'.",
+            "Polygonal part of surface '{:s}' contains %{ul} nodes. Writting to"
+            " files '{:s}' and '{:s}'.",
             polygon_name.c_str(),
             ids_and_areas.size(),
             id_and_area_fname.c_str(),
diff --git a/Applications/Utils/MeshGeoTools/constructMeshesFromGeometry.cpp b/Applications/Utils/MeshGeoTools/constructMeshesFromGeometry.cpp
index 55d4a77cf974c63dc8f6b6a479405ddc60319a06..b85795c864f75c6f65cf90c0d597cf2543974971 100644
--- a/Applications/Utils/MeshGeoTools/constructMeshesFromGeometry.cpp
+++ b/Applications/Utils/MeshGeoTools/constructMeshesFromGeometry.cpp
@@ -9,7 +9,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "GeoLib/GEOObjects.h"
 #include "GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.h"
@@ -24,15 +23,13 @@ std::unique_ptr<GeoLib::GEOObjects> readGeometry(std::string const& filename)
     auto geo_objects = std::make_unique<GeoLib::GEOObjects>();
     GeoLib::IO::BoostXmlGmlInterface gml_reader(*geo_objects);
 
-    DBUG("Reading geometry file '%s'.", filename.c_str());
+    DBUG("Reading geometry file '{:s}'.", filename.c_str());
     gml_reader.readFile(filename);
     return geo_objects;
 }
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logo_setup;
-
     TCLAP::CmdLine cmd(
         "Converts a geometry defined on a given mesh to distinct meshes. The "
         "documentation is available at "
@@ -107,7 +104,7 @@ int main(int argc, char* argv[])
         if (m_ptr->getNodes().empty())
         {
             WARN(
-                "The created mesh '%s' hasn't any nodes or elements and thus "
+                "The created mesh '{:s}' hasn't any nodes or elements and thus "
                 "it isn't written to file.",
                 m_ptr->getName().c_str());
             continue;
diff --git a/Applications/Utils/MeshGeoTools/createIntermediateRasters.cpp b/Applications/Utils/MeshGeoTools/createIntermediateRasters.cpp
index 3b660c78b7fe52663a0b434e4f4d0e4012d3e6f1..907329ccdbc82ed3a2a72c5c89655fcbf5798d03 100644
--- a/Applications/Utils/MeshGeoTools/createIntermediateRasters.cpp
+++ b/Applications/Utils/MeshGeoTools/createIntermediateRasters.cpp
@@ -15,14 +15,11 @@
 
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/AsciiRasterInterface.h"
 #include "GeoLib/Raster.h"
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Takes two DEMs located at the exact same spatial position (but at "
         "different elevation) and calculates n raster DEMs located at "
@@ -145,7 +142,7 @@ int main(int argc, char* argv[])
 
         GeoLib::Raster r(h1, raster[i].begin(), raster[i].end());
         FileIO::AsciiRasterInterface::writeRasterAsASC(r, basename + std::to_string(i) + "." + ext);
-        INFO("Layer %d written.", i+1);
+        INFO("Layer {:d} written.", i + 1);
     }
     return EXIT_SUCCESS;
 }
diff --git a/Applications/Utils/MeshGeoTools/identifySubdomains.cpp b/Applications/Utils/MeshGeoTools/identifySubdomains.cpp
index 6dc2fb59a8370113b18ee6d88c83b5abedbc7209..cabcd263bb176563edabd37d6a0afb313d5faa52 100644
--- a/Applications/Utils/MeshGeoTools/identifySubdomains.cpp
+++ b/Applications/Utils/MeshGeoTools/identifySubdomains.cpp
@@ -9,7 +9,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshGeoToolsLib/IdentifySubdomainMesh.h"
 #include "MeshGeoToolsLib/MeshNodeSearcher.h"
@@ -29,7 +28,8 @@ std::vector<std::unique_ptr<MeshLib::Mesh>> readMeshes(
         auto mesh = MeshLib::IO::readMeshFromFile(filename);
         if (mesh == nullptr)
         {
-            OGS_FATAL("Could not read mesh from '%s' file.", filename.c_str());
+            OGS_FATAL("Could not read mesh from '{:s}' file.",
+                      filename.c_str());
         }
         meshes.emplace_back(mesh);
     }
@@ -42,8 +42,6 @@ std::vector<std::unique_ptr<MeshLib::Mesh>> readMeshes(
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Checks if the subdomain meshes are part of the bulk mesh and writes "
         "the 'bulk_node_ids' and the 'bulk_element_ids' in each of them. The "
@@ -105,7 +103,7 @@ int main(int argc, char* argv[])
         MeshLib::IO::readMeshFromFile(bulk_mesh_arg.getValue())};
     if (bulk_mesh == nullptr)
     {
-        OGS_FATAL("Could not read bulk mesh from '%s'",
+        OGS_FATAL("Could not read bulk mesh from '{:s}'",
                   bulk_mesh_arg.getValue().c_str());
     }
 
diff --git a/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp b/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp
index 011cedc793d0a2de0e6254791cbe0968d81752c9..1e8e43fe1a14604b22a3cb783f5af0f29cb1d4f5 100644
--- a/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp
+++ b/Applications/Utils/ModelPreparation/ComputeNodeAreasFromSurfaceMesh.cpp
@@ -16,7 +16,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/Error.h"
 #include "BaseLib/FileTools.h"
@@ -32,12 +31,12 @@ void writeToFile(std::string const& id_area_fname, std::string const& csv_fname,
 {
     std::ofstream ids_and_area_out(id_area_fname);
     if (!ids_and_area_out) {
-        OGS_FATAL("Unable to open the file '%s' - aborting.",
+        OGS_FATAL("Unable to open the file '{:s}' - aborting.",
                   id_area_fname.c_str());
     }
     std::ofstream csv_out(csv_fname);
     if (!csv_out) {
-        OGS_FATAL("Unable to open the file '%s' - aborting.",
+        OGS_FATAL("Unable to open the file '{:s}' - aborting.",
                   csv_fname.c_str());
     }
 
@@ -57,8 +56,6 @@ void writeToFile(std::string const& id_area_fname, std::string const& csv_fname,
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "The tool computes the area per node of the surface mesh and writes "
         "the information as txt and csv data.\n\n"
@@ -86,8 +83,8 @@ int main (int argc, char* argv[])
 
     std::unique_ptr<MeshLib::Mesh> surface_mesh(
         MeshLib::IO::readMeshFromFile(mesh_in.getValue()));
-    INFO("Mesh read: %u nodes, %u elements.", surface_mesh->getNumberOfNodes(),
-         surface_mesh->getNumberOfElements());
+    INFO("Mesh read: {:d} nodes, {:d} elements.",
+         surface_mesh->getNumberOfNodes(), surface_mesh->getNumberOfElements());
     // ToDo check if mesh is read correct and if the mesh is a surface mesh
 
     MeshLib::PropertyVector<std::size_t>* orig_node_ids(nullptr);
diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/Metis.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/Metis.cpp
index 0534837886c57c8c454f598934640185c9352c7c..d6163759c3980c9a3010349e6d128ba5e55858a7 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/Metis.cpp
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/Metis.cpp
@@ -9,7 +9,7 @@
  *
  */
 
-#include <iostream>
+#include <fstream>
 
 #include "BaseLib/Error.h"
 #include "MeshLib/Elements/Element.h"
@@ -22,12 +22,12 @@ void writeMETIS(std::vector<MeshLib::Element*> const& elements,
     std::ofstream os(file_name, std::ios::trunc);
     if (!os.is_open())
     {
-        OGS_FATAL("Error: cannot open file %s.", file_name.data());
+        OGS_FATAL("Error: cannot open file {:s}.", file_name.data());
     }
 
     if (!os.good())
     {
-        OGS_FATAL("Error: Cannot write in file %s.", file_name.data());
+        OGS_FATAL("Error: Cannot write in file {:s}.", file_name.data());
     }
 
     os << elements.size() << " \n";
@@ -56,7 +56,7 @@ std::vector<std::size_t> readMetisData(const std::string& file_name_base,
     if (!npart_in.is_open())
     {
         OGS_FATAL(
-            "Error: cannot open file %s. It may not exist!\n"
+            "Error: cannot open file {:s}. It may not exist!\n"
             "Run mpmetis beforehand or use option -m",
             fname_parts.data());
     }
@@ -76,12 +76,12 @@ std::vector<std::size_t> readMetisData(const std::string& file_name_base,
 
     if (npart_in.bad())
     {
-        OGS_FATAL("Error while reading file %s.", fname_parts.data());
+        OGS_FATAL("Error while reading file {:s}.", fname_parts.data());
     }
 
     if (counter != number_of_nodes)
     {
-        OGS_FATAL("Error: data in %s are less than expected.",
+        OGS_FATAL("Error: data in {:s} are less than expected.",
                   fname_parts.data());
     }
 
diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
index 6a40ea79f668deb586cf70e2e65a161c0cb0c3d7..ef0ee9fbe9a0d0ceb10ce66f25328461d2ea41f4 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
@@ -18,11 +18,10 @@
 #include <numeric>
 #include <unordered_map>
 
-#include <logog/include/logog.hpp>
-
 #include "BaseLib/Error.h"
+#include "BaseLib/FileTools.h"
+#include "BaseLib/Logging.h"
 #include "BaseLib/Stream.h"
-
 #include "MeshLib/IO/VtkIO/VtuInterface.h"
 
 namespace ApplicationUtils
@@ -403,7 +402,7 @@ bool copyPropertyVector(MeshLib::Properties const& original_properties,
                                                 *partitioned_pv);
         }
         OGS_FATAL(
-            "Copying of property vector values for mesh item type %s is "
+            "Copying of property vector values for mesh item type {:s} is "
             "not implemented.",
             pv->getMeshItemType());
     };
@@ -438,7 +437,7 @@ void applyToPropertyVectors(std::vector<std::string> const& property_names,
             f(static_cast<unsigned long>(0), name) || f(std::size_t{}, name);
         if (!success)
         {
-            OGS_FATAL("Could not apply function to PropertyVector '%s'.",
+            OGS_FATAL("Could not apply function to PropertyVector '{:s}'.",
                       name.c_str());
         }
     }
@@ -456,8 +455,8 @@ void processProperties(MeshLib::Properties const& properties,
                         });
 
     DBUG(
-        "total number of tuples define on mesh item type '%s' after "
-        "partitioning: %d ",
+        "total number of tuples define on mesh item type '{:s}' after "
+        "partitioning: {:d} ",
         toString(mesh_item_type), total_number_of_tuples);
 
     // 1 create new PV
@@ -488,7 +487,7 @@ void NodeWiseMeshPartitioner::partitionByMETIS(
 {
     for (std::size_t part_id = 0; part_id < _partitions.size(); part_id++)
     {
-        INFO("Processing partition: %d", part_id);
+        INFO("Processing partition: {:d}", part_id);
         processPartition(part_id, is_mixed_high_order_linear_elems);
     }
 
@@ -608,7 +607,7 @@ std::vector<Partition> NodeWiseMeshPartitioner::partitionOtherMesh(
     for (std::size_t part_id = 0; part_id < _partitions.size(); part_id++)
     {
         auto& partition = partitions[part_id];
-        INFO("Processing partition: %d", part_id);
+        INFO("Processing partition: {:d}", part_id);
         // Set the node numbers of base and all mesh nodes.
         partition.number_of_mesh_base_nodes = mesh.getNumberOfBaseNodes();
         partition.number_of_mesh_all_nodes = mesh.getNumberOfNodes();
@@ -741,7 +740,7 @@ void writePropertiesBinary(const std::string& file_name_base,
     std::ofstream out(file_name_cfg, std::ios::binary);
     if (!out)
     {
-        OGS_FATAL("Could not open file '%s' for output.",
+        OGS_FATAL("Could not open file '{:s}' for output.",
                   file_name_cfg.c_str());
     }
 
@@ -751,7 +750,7 @@ void writePropertiesBinary(const std::string& file_name_base,
     std::ofstream out_val(file_name_val, std::ios::binary);
     if (!out_val)
     {
-        OGS_FATAL("Could not open file '%s' for output.",
+        OGS_FATAL("Could not open file '{:s}' for output.",
                   file_name_val.c_str());
     }
 
@@ -771,8 +770,9 @@ void writePropertiesBinary(const std::string& file_name_base,
             offset, static_cast<unsigned long>(
                         partition.numberOfMeshItems(mesh_item_type))};
         DBUG(
-            "Write meta data for node-based PropertyVector: global offset %d, "
-            "number of tuples %d",
+            "Write meta data for node-based PropertyVector: global offset "
+            "{:d}, "
+            "number of tuples {:d}",
             pvpmd.offset, pvpmd.number_of_tuples);
         MeshLib::IO::writePropertyVectorPartitionMetaData(out, pvpmd);
         offset += pvpmd.number_of_tuples;
@@ -845,7 +845,7 @@ std::tuple<std::vector<long>, std::vector<long>> writeConfigDataBinary(
     std::ofstream of_bin_cfg(file_name_cfg, std::ios::binary);
     if (!of_bin_cfg)
     {
-        OGS_FATAL("Could not open file '%s' for output.",
+        OGS_FATAL("Could not open file '{:s}' for output.",
                   file_name_cfg.c_str());
     }
 
@@ -929,7 +929,7 @@ void writeElementsBinary(std::string const& file_name_base,
     std::ofstream element_info_os(file_name_ele, std::ios::binary);
     if (!element_info_os)
     {
-        OGS_FATAL("Could not open file '%s' for output.",
+        OGS_FATAL("Could not open file '{:s}' for output.",
                   file_name_ele.c_str());
     }
 
@@ -938,7 +938,7 @@ void writeElementsBinary(std::string const& file_name_base,
     std::ofstream ghost_element_info_os(file_name_ele_g, std::ios::binary);
     if (!ghost_element_info_os)
     {
-        OGS_FATAL("Could not open file '%s' for output.",
+        OGS_FATAL("Could not open file '{:s}' for output.",
                   file_name_ele_g.c_str());
     }
 
@@ -997,7 +997,7 @@ void writeNodesBinary(const std::string& file_name_base,
     std::ofstream os(file_name, std::ios::binary);
     if (!os)
     {
-        OGS_FATAL("Could not open file '%s' for output.", file_name.c_str());
+        OGS_FATAL("Could not open file '{:s}' for output.", file_name.c_str());
     }
 
     for (const auto& partition : partitions)
diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/PartitionMesh.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/PartitionMesh.cpp
index 6a755caa1109cd69cb0d0b1aaf8525244da7c460..9068d19cbc83113c526ce078343e1dbbeb86426e 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/PartitionMesh.cpp
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/PartitionMesh.cpp
@@ -14,7 +14,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/CPUTime.h"
 #include "BaseLib/FileTools.h"
@@ -28,8 +27,6 @@ using namespace ApplicationUtils;
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Partition a mesh for parallel computing."
         "The tasks of this tool are in twofold:\n"
@@ -95,7 +92,7 @@ int main(int argc, char* argv[])
         BaseLib::dropFileExtension(mesh_input.getValue());
     std::unique_ptr<MeshLib::Mesh> mesh_ptr(
         MeshLib::IO::readMeshFromFile(input_file_name_wo_extension + ".vtu"));
-    INFO("Mesh '%s' read: %d nodes, %d elements.",
+    INFO("Mesh '{:s}' read: {:d} nodes, {:d} elements.",
          mesh_ptr->getName().c_str(),
          mesh_ptr->getNumberOfNodes(),
          mesh_ptr->getNumberOfElements());
@@ -105,8 +102,8 @@ int main(int argc, char* argv[])
         INFO("Write the mesh into METIS input file.");
         ApplicationUtils::writeMETIS(mesh_ptr->getElements(),
                                      input_file_name_wo_extension + ".mesh");
-        INFO("Total runtime: %g s.", run_timer.elapsed());
-        INFO("Total CPU time: %g s.", CPU_timer.elapsed());
+        INFO("Total runtime: {:g} s.", run_timer.elapsed());
+        INFO("Total CPU time: {:g} s.", CPU_timer.elapsed());
 
         return EXIT_SUCCESS;
     }
@@ -138,7 +135,7 @@ int main(int argc, char* argv[])
         INFO("METIS is running ...");
         const std::string exe_name = argv[0];
         const std::string exe_path = BaseLib::extractPath(exe_name);
-        INFO("Path to mpmetis is: \n\t%s", exe_path.c_str());
+        INFO("Path to mpmetis is: \n\t{:s}", exe_path.c_str());
 
         const std::string mpmetis_com =
             BaseLib::joinPaths(exe_path, "mpmetis") + " -gtype=nodal " + "'" +
@@ -149,7 +146,7 @@ int main(int argc, char* argv[])
         if (status != 0)
         {
             INFO("Failed in system calling.");
-            INFO("Return value of system call %d ", status);
+            INFO("Return value of system call {:d} ", status);
             return EXIT_FAILURE;
         }
     }
@@ -168,7 +165,7 @@ int main(int argc, char* argv[])
     {
         std::unique_ptr<MeshLib::Mesh> mesh(
             MeshLib::IO::readMeshFromFile(filename));
-        INFO("Mesh '%s' from file '%s' read: %d nodes, %d elements.",
+        INFO("Mesh '{:s}' from file '{:s}' read: {:d} nodes, {:d} elements.",
              mesh->getName().c_str(), filename.c_str(),
              mesh->getNumberOfNodes(), mesh->getNumberOfElements());
 
@@ -205,8 +202,8 @@ int main(int argc, char* argv[])
         mesh_partitioner.writeBinary(output_file_name_wo_extension);
     }
 
-    INFO("Total runtime: %g s.", run_timer.elapsed());
-    INFO("Total CPU time: %g s.", CPU_timer.elapsed());
+    INFO("Total runtime: {:g} s.", run_timer.elapsed());
+    INFO("Total CPU time: {:g} s.", CPU_timer.elapsed());
 
     return EXIT_SUCCESS;
 }
diff --git a/Applications/Utils/ModelPreparation/convertVtkDataArrayToVtkDataArray.cpp b/Applications/Utils/ModelPreparation/convertVtkDataArrayToVtkDataArray.cpp
index 86f7babd067654b3075f231ac0ff8ed70b39f18f..3353c2838da9fcc9a6baf71af1bd4b2780fc1102 100644
--- a/Applications/Utils/ModelPreparation/convertVtkDataArrayToVtkDataArray.cpp
+++ b/Applications/Utils/ModelPreparation/convertVtkDataArrayToVtkDataArray.cpp
@@ -15,8 +15,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -56,8 +54,6 @@ std::pair<bool, std::string> castPropertyVectorToPropertyVector(
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Converts a double or floating point cell data array of a vtk "
         "unstructured grid into a int or double cell data array.\n\n"
@@ -156,7 +152,7 @@ int main(int argc, char* argv[])
 
     if (!success)
     {
-        ERR("%s", err_msg.c_str());
+        ERR("{:s}", err_msg.c_str());
         return -1;
     }
 
diff --git a/Applications/Utils/ModelPreparation/createNeumannBc.cpp b/Applications/Utils/ModelPreparation/createNeumannBc.cpp
index 8fbc92b3bad2e213b5bfef704ea75efef68f5041..d1d00e853d93b3f5353d494af1c9d9460d0b16fe 100644
--- a/Applications/Utils/ModelPreparation/createNeumannBc.cpp
+++ b/Applications/Utils/ModelPreparation/createNeumannBc.cpp
@@ -10,7 +10,6 @@
 #include <fstream>
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -40,7 +39,7 @@ std::vector<double> getSurfaceIntegratedValuesForNodes(
 
     if (!mesh.getProperties().existsPropertyVector<double>(prop_name))
     {
-        ERR("Need element property, but the property '%s' is not "
+        ERR("Need element property, but the property '{:s}' is not "
             "available.",
             prop_name.c_str());
         return std::vector<double>();
@@ -67,15 +66,13 @@ std::vector<double> getSurfaceIntegratedValuesForNodes(
         integrated_node_area_vec.push_back(integrated_node_area);
     }
 
-    INFO ("Total surface area: %g", total_area);
+    INFO("Total surface area: {:g}", total_area);
 
     return integrated_node_area_vec;
 }
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logo_setup;
-
     TCLAP::CmdLine cmd(
         "Integrates the given element property and outputs an OGS-5 direct "
         "Neumann boundary condition. The mesh has to contain a property "
@@ -142,7 +139,7 @@ int main(int argc, char* argv[])
         }
         catch (std::runtime_error const& e)
         {
-            WARN("%s", e.what());
+            WARN("{:s}", e.what());
             return nullptr;
         }
     }();
diff --git a/Applications/Utils/ModelPreparation/scaleProperty.cpp b/Applications/Utils/ModelPreparation/scaleProperty.cpp
index 3f271338bdacafb83c3e766dcd41b4c8ff840f1d..50dd95f0a4c1209ffcaa7a73d7a5cf109e3c0d11 100644
--- a/Applications/Utils/ModelPreparation/scaleProperty.cpp
+++ b/Applications/Utils/ModelPreparation/scaleProperty.cpp
@@ -15,7 +15,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "MeshLib/IO/readMeshFromFile.h"
 #include "MeshLib/IO/writeMeshToFile.h"
@@ -23,8 +22,6 @@
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logo_setup;
-
     TCLAP::CmdLine cmd(
         "Scales a property of a mesh.\n\n"
         "OpenGeoSys-6 software, version " +
diff --git a/Applications/Utils/OGSFileConverter/main.cpp b/Applications/Utils/OGSFileConverter/main.cpp
index cba8f51a3728045c1810c744a066ae2422c87b4f..e24dfec5ec127aab5dc877f2cc0fbacd88340a54 100644
--- a/Applications/Utils/OGSFileConverter/main.cpp
+++ b/Applications/Utils/OGSFileConverter/main.cpp
@@ -10,19 +10,14 @@
 #include "OGSFileConverter.h"
 
 #include <clocale>
-
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
-
 #include <QApplication>
 
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "A conversion tool for ogs5 and ogs6 files.\n\n"
         "OpenGeoSys-6 software, version " +
diff --git a/Applications/Utils/PostProcessing/postLIE.cpp b/Applications/Utils/PostProcessing/postLIE.cpp
index 4c043b9ca31025d3125575c3930327e2c55fc740..6befe24640c001ca249d98cd078e1d21123fa9c4 100644
--- a/Applications/Utils/PostProcessing/postLIE.cpp
+++ b/Applications/Utils/PostProcessing/postLIE.cpp
@@ -15,7 +15,6 @@
 #include <boost/property_tree/ptree.hpp>
 #include <boost/property_tree/xml_parser.hpp>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 #include "MeshLib/IO/readMeshFromFile.h"
@@ -61,7 +60,7 @@ void postVTU(std::string const& int_vtu_filename,
                                           vec_junction_nodeID_matIDs);
 
     // create a new VTU file
-    INFO("create %s", out_vtu_filename.c_str());
+    INFO("create {:s}", out_vtu_filename.c_str());
     MeshLib::IO::writeMeshToFile(post.getOutputMesh(), out_vtu_filename);
 }
 
@@ -70,7 +69,7 @@ void postPVD(std::string const& in_pvd_filename,
 {
     auto const in_pvd_file_dir = BaseLib::extractPath(in_pvd_filename);
     auto const out_pvd_file_dir = BaseLib::extractPath(out_pvd_filename);
-    INFO("start reading the PVD file %s", in_pvd_filename.c_str());
+    INFO("start reading the PVD file {:s}", in_pvd_filename.c_str());
     boost::property_tree::ptree pt;
     read_xml(in_pvd_filename, pt,
              boost::property_tree::xml_parser::trim_whitespace);
@@ -94,7 +93,7 @@ void postPVD(std::string const& in_pvd_filename,
         }
         auto const org_vtu_filepath =
             BaseLib::joinPaths(org_vtu_dir, org_vtu_filebasename);
-        INFO("processing %s...", org_vtu_filepath.c_str());
+        INFO("processing {:s}...", org_vtu_filepath.c_str());
 
         // post-process the VTU and save into the new file
         auto const dest_vtu_filename = "post_" + org_vtu_filebasename;
@@ -107,7 +106,7 @@ void postPVD(std::string const& in_pvd_filename,
     }
 
     // save into the new PVD file
-    INFO("save into the new PVD file %s", out_pvd_filename.c_str());
+    INFO("save into the new PVD file {:s}", out_pvd_filename.c_str());
     boost::property_tree::xml_writer_settings<std::string> settings('\t', 1);
     write_xml(out_pvd_filename, pt, std::locale(), settings);
 }
@@ -116,8 +115,6 @@ void postPVD(std::string const& in_pvd_filename,
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Post-process results of the LIE approach.\n\n"
         "OpenGeoSys-6 software, version " +
@@ -148,7 +145,7 @@ int main(int argc, char* argv[])
     }
     else
     {
-        OGS_FATAL("The given file type (%s) is not supported.",
+        OGS_FATAL("The given file type ({:s}) is not supported.",
                   in_file_ext.c_str());
     }
 
diff --git a/Applications/Utils/SWMMConverter/SWMMConverter.cpp b/Applications/Utils/SWMMConverter/SWMMConverter.cpp
index e6a3ff4270d5a81b020e54107586362736436ad3..d1f4cf4c0366eed03f0e5d6da5b69ae6137239bc 100644
--- a/Applications/Utils/SWMMConverter/SWMMConverter.cpp
+++ b/Applications/Utils/SWMMConverter/SWMMConverter.cpp
@@ -10,8 +10,6 @@
 
 #include "Applications/FileIO/SWMM/SWMMInterface.h"
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -83,7 +81,7 @@ int writeMeshOutput(std::string const& input_file,
     std::string const extension =
         std::string("." + BaseLib::getFileExtension(output_file));
     std::size_t const n_time_steps(swmm->getNumberOfTimeSteps());
-    INFO("Number of simulation time steps: %d", n_time_steps);
+    INFO("Number of simulation time steps: {:d}", n_time_steps);
     for (std::size_t i = 0; i < n_time_steps; i++)
     {
         if (node_args)
@@ -166,8 +164,6 @@ int writeCsvOutput(std::string input_file,
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup setup;
-
     TCLAP::CmdLine cmd(
         "Read files for the Storm Water Management Model (SWMM) and converts "
         "them into OGS data structures.\n\n"
diff --git a/Applications/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp b/Applications/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp
index 1b05df5ba3a091f7f18ef74078be9a7d01d57319..3a103ca06e6bc1ab406f6d18d34f623391dae6fa 100644
--- a/Applications/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp
+++ b/Applications/Utils/SimpleMeshCreation/createMeshElemPropertiesFromASCRaster.cpp
@@ -16,7 +16,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/FileIO/AsciiRasterInterface.h"
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/FileTools.h"
@@ -34,8 +33,6 @@
 
 int main(int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logo_setup;
-
     TCLAP::CmdLine cmd(
         "Generates properties for mesh elements of an input mesh deploying a "
         "ASC raster file.\n\n"
diff --git a/Applications/Utils/SimpleMeshCreation/generateStructuredMesh.cpp b/Applications/Utils/SimpleMeshCreation/generateStructuredMesh.cpp
index e2dd122cbfe731f3acd97dc48b03640579ae25c1..f9495fadf000e2fa884c266af467e1f15a281bfb 100644
--- a/Applications/Utils/SimpleMeshCreation/generateStructuredMesh.cpp
+++ b/Applications/Utils/SimpleMeshCreation/generateStructuredMesh.cpp
@@ -13,8 +13,6 @@
 
 #include <tclap/CmdLine.h>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
-
 #include "InfoLib/GitInfo.h"
 #include "BaseLib/Error.h"
 #include "BaseLib/Subdivision.h"
@@ -59,8 +57,6 @@ unsigned getDimension(MeshLib::MeshElemType eleType)
 
 int main (int argc, char* argv[])
 {
-    ApplicationsLib::LogogSetup logog_setup;
-
     TCLAP::CmdLine cmd(
         "Structured mesh generator.\n"
         "The documentation is available at "
@@ -165,7 +161,7 @@ int main (int argc, char* argv[])
     {
         if (dim_used[i] && !vec_lengthArg[i]->isSet())
         {
-            ERR("Missing input: Length for dimension [%d] is required but "
+            ERR("Missing input: Length for dimension [{:d}] is required but "
                 "missing.",
                 i);
             return EXIT_FAILURE;
@@ -235,7 +231,8 @@ int main (int argc, char* argv[])
 
     if (mesh)
     {
-        INFO("Mesh created: %d nodes, %d elements.", mesh->getNumberOfNodes(), mesh->getNumberOfElements());
+        INFO("Mesh created: {:d} nodes, {:d} elements.",
+             mesh->getNumberOfNodes(), mesh->getNumberOfElements());
 
         // write into a file
         MeshLib::IO::writeMeshToFile(*(mesh.get()), mesh_out.getValue());
diff --git a/BaseLib/Algorithm.h b/BaseLib/Algorithm.h
index 84d867bc065dbc09075b779944ed32d1c10b94f5..38461a984ccb67928d67026f848e8e4021a45d98 100644
--- a/BaseLib/Algorithm.h
+++ b/BaseLib/Algorithm.h
@@ -15,7 +15,9 @@
 #include <cassert>
 #include <typeindex>
 #include <typeinfo>
+
 #include "Error.h"
+#include "StringTools.h"
 
 namespace BaseLib
 {
@@ -72,7 +74,7 @@ typename std::iterator_traits<InputIt>::reference findElementOrError(
     auto it = std::find_if(begin, end, predicate);
     if (it == end)
     {
-        OGS_FATAL("Element not found in the input range; %s", error.c_str());
+        OGS_FATAL("Element not found in the input range; {:s}", error.c_str());
     }
     return *it;
 }
@@ -91,7 +93,7 @@ void insertIfTypeIndexKeyUniqueElseError(Map& map, Key const& key,
     auto const inserted = map.emplace(key, std::forward<Value>(value));
     if (!inserted.second)
     {  // insertion failed, i.e., key already exists
-        OGS_FATAL("%s Key `%s' already exists.", error_message.c_str(),
+        OGS_FATAL("{:s} Key `{:s}' already exists.", error_message.c_str(),
                   tostring(key.hash_code()).c_str());
     }
 }
@@ -108,7 +110,7 @@ void insertIfKeyUniqueElseError(Map& map, Key const& key, Value&& value,
     auto const inserted = map.emplace(key, std::forward<Value>(value));
     if (!inserted.second)
     {  // insertion failed, i.e., key already exists
-        OGS_FATAL("%s Key `%s' already exists.", error_message.c_str(),
+        OGS_FATAL("{:s} Key `{:s}' already exists.", error_message.c_str(),
                   tostring(key).c_str());
     }
 }
@@ -127,14 +129,14 @@ void insertIfKeyValueUniqueElseError(Map& map, Key const& key, Value&& value,
 
     if (std::find_if(map.cbegin(), map.cend(), value_compare) != map.cend())
     {
-        OGS_FATAL("%s Value `%s' already exists.", error_message.c_str(),
+        OGS_FATAL("{:s} Value `{:s}' already exists.", error_message.c_str(),
                   tostring(value).c_str());
     }
 
     auto const inserted = map.emplace(key, std::forward<Value>(value));
     if (!inserted.second)
     {  // insertion failed, i.e., key already exists
-        OGS_FATAL("%s Key `%s' already exists.", error_message.c_str(),
+        OGS_FATAL("{:s} Key `{:s}' already exists.", error_message.c_str(),
                   tostring(key).c_str());
     }
 }
@@ -151,7 +153,7 @@ typename Map::mapped_type& getOrError(Map& map, Key const& key,
     auto it = map.find(key);
     if (it == map.end())
     {
-        OGS_FATAL("%s Key `%s' does not exist.", error_message.c_str(),
+        OGS_FATAL("{:s} Key `{:s}' does not exist.", error_message.c_str(),
                   tostring(key).c_str());
     }
 
@@ -165,7 +167,7 @@ typename Map::mapped_type const& getOrError(Map const& map, Key const& key,
     auto it = map.find(key);
     if (it == map.end())
     {
-        OGS_FATAL("%s Key `%s' does not exist.", error_message.c_str(),
+        OGS_FATAL("{:s} Key `{:s}' does not exist.", error_message.c_str(),
                   tostring(key).c_str());
     }
 
@@ -184,7 +186,7 @@ typename Container::value_type const& getIfOrError(
     auto it = std::find_if(begin(container), end(container), predicate);
     if (it == end(container))
     {
-        OGS_FATAL("Could not find element matching the predicate: %s",
+        OGS_FATAL("Could not find element matching the predicate: {:s}",
                   error_message.c_str());
     }
     return *it;
diff --git a/BaseLib/CMakeLists.txt b/BaseLib/CMakeLists.txt
index 390520d234a74081c506cc959b4b382fb42376d6..3e2485215a2c67598048e5f1588440fd83c3da47 100644
--- a/BaseLib/CMakeLists.txt
+++ b/BaseLib/CMakeLists.txt
@@ -8,7 +8,9 @@ endif()
 # Create the library
 ogs_add_library(BaseLib ${SOURCES})
 
-target_link_libraries(BaseLib PUBLIC logog Boost::boost)
+target_link_libraries(
+    BaseLib
+    PUBLIC Boost::boost spdlog::spdlog)
 
 if(MSVC)
     target_link_libraries(BaseLib PUBLIC WinMM) # needed for timeGetTime
diff --git a/BaseLib/ConfigTree.cpp b/BaseLib/ConfigTree.cpp
index a678b9da581e670c40b8ffb67d5f286b9ebceed5..a5c52150ca6c394095eb48f1ebd7d9fb8545bad2 100644
--- a/BaseLib/ConfigTree.cpp
+++ b/BaseLib/ConfigTree.cpp
@@ -11,8 +11,8 @@
 #include "ConfigTree.h"
 
 #include <forward_list>
-#include <logog/include/logog.hpp>
 #include <utility>
+#include "Logging.h"
 
 #include "Error.h"
 
@@ -85,7 +85,7 @@ ConfigTree::~ConfigTree()
     try {
         checkAndInvalidate();
     } catch (std::exception& e) {
-        ERR("%s", e.what());
+        ERR("{:s}", e.what());
         configtree_destructor_error_messages.push_front(e.what());
     }
 }
@@ -232,15 +232,15 @@ void ConfigTree::warning(const std::string& message) const
 void ConfigTree::onerror(const std::string& filename, const std::string& path,
                             const std::string& message)
 {
-    OGS_FATAL("ConfigTree: In file `%s' at path <%s>: %s",
-        filename.c_str(), path.c_str(), message.c_str());
+    OGS_FATAL("ConfigTree: In file `{:s}' at path <{:s}>: {:s}",
+              filename.c_str(), path.c_str(), message.c_str());
 }
 
 void ConfigTree::onwarning(const std::string& filename, const std::string& path,
                               const std::string& message)
 {
-    WARN("ConfigTree: In file `%s' at path <%s>: %s",
-         filename.c_str(), path.c_str(), message.c_str());
+    WARN("ConfigTree: In file `{:s}' at path <{:s}>: {:s}", filename.c_str(),
+         path.c_str(), message.c_str());
 }
 
 void ConfigTree::assertNoSwallowedErrors()
@@ -254,7 +254,7 @@ void ConfigTree::assertNoSwallowedErrors()
         "file(s):");
 
     for (auto const& msg : configtree_destructor_error_messages) {
-        ERR("%s", msg.c_str());
+        ERR("{:s}", msg.c_str());
     }
 
     OGS_FATAL("There have been errors when parsing the configuration file(s).");
diff --git a/BaseLib/ConfigTreeUtil.cpp b/BaseLib/ConfigTreeUtil.cpp
index 6a6d060bc4bdb10119d9d04485cb45dd8fc4ef99..3e41ee6fb251afb9978651c90a82789b5d60353e 100644
--- a/BaseLib/ConfigTreeUtil.cpp
+++ b/BaseLib/ConfigTreeUtil.cpp
@@ -11,7 +11,7 @@
 #include "ConfigTreeUtil.h"
 
 #include <boost/property_tree/xml_parser.hpp>
-#include <logog/include/logog.hpp>
+#include "Logging.h"
 
 #include "Error.h"
 
@@ -63,17 +63,17 @@ makeConfigTree(const std::string& filepath, const bool be_ruthless,
     }
     catch (boost::property_tree::xml_parser_error const& e)
     {
-        OGS_FATAL("Error while parsing XML file `%s' at line %lu: %s.",
+        OGS_FATAL("Error while parsing XML file `{:s}' at line {:d}: {:s}.",
                   e.filename().c_str(), e.line(), e.message().c_str());
     }
 
-    DBUG("Project configuration from file '%s' read.", filepath.c_str());
+    DBUG("Project configuration from file '{:s}' read.", filepath.c_str());
 
     if (auto child = ptree.get_child_optional(toplevel_tag)) {
         return ConfigTreeTopLevel(filepath, be_ruthless, std::move(*child));
     }
-    OGS_FATAL("Tag <%s> has not been found in file `%s'.", toplevel_tag.c_str(),
-              filepath.c_str());
+    OGS_FATAL("Tag <{:s}> has not been found in file `{:s}'.",
+              toplevel_tag.c_str(), filepath.c_str());
 }
 
 }  // namespace BaseLib
diff --git a/BaseLib/DateTools.cpp b/BaseLib/DateTools.cpp
index 16be485ee3a932cc30625ccfcf065cba7ccc627d..973244a4307776fae32c6389661930f296259dae 100644
--- a/BaseLib/DateTools.cpp
+++ b/BaseLib/DateTools.cpp
@@ -19,7 +19,7 @@
 #include <ctime>
 #include <sstream>
 
-#include <logog/include/logog.hpp>
+#include "Logging.h"
 
 namespace BaseLib
 {
diff --git a/BaseLib/Error.h b/BaseLib/Error.h
index e10b793ac1f3388c3c57359039dc6e3cef875ea4..e4fce46b5754f0ec2bc3b47b3f0a60047d1b4c7c 100644
--- a/BaseLib/Error.h
+++ b/BaseLib/Error.h
@@ -10,57 +10,23 @@
 
 #pragma once
 
-#ifdef OGS_FATAL_ABORT
-
 #include <cstdlib>
-#include <logog/include/logog.hpp>
-
-namespace BaseLib
-{
-namespace detail
-{
-template <typename Msg>
-[[noreturn]]
-    bool error_impl(Msg&& msg)
-{
-    ERR("%s", msg.data());
-    std::abort();
-}
-
-}  // namespace detail
-
-}  // namespace BaseLib
+#include "Logging.h"
 
+#ifdef OGS_FATAL_ABORT
+#define OGS_FATAL(...)                                                      \
+    {                                                                       \
+        BaseLib::console->critical("{}:{} {}() ", __FILE__, __LINE__,       \
+                                   __FUNCTION__, fmt::format(__VA_ARGS__)); \
+        std::abort();                                                       \
+    }
 #else  // OGS_FATAL_ABORT
-
 #include <stdexcept>
-
-namespace BaseLib
-{
-namespace detail
-{
-template <typename Msg>
-[[noreturn]]
-    bool error_impl(Msg&& msg)
-{
-    throw std::runtime_error(std::forward<Msg>(msg));
-}
-
-}  // namespace detail
-
-}  // namespace BaseLib
-
+#define OGS_FATAL(...)                                                      \
+    {                                                                       \
+        BaseLib::console->critical("{}:{} {}() ", __FILE__, __LINE__,       \
+                                   __FUNCTION__, fmt::format(__VA_ARGS__)); \
+        throw std::runtime_error(fmt::format(__VA_ARGS__));                 \
+    }
 #endif  // OGS_FATAL_ABORT
 
-#include "FileTools.h"
-#include "StringTools.h"
-
-#define OGS_STR(x) #x
-#define OGS_STRINGIFY(x) OGS_STR(x)
-#define OGS_LOCATION                               \
-    (" at " + BaseLib::extractBaseName(__FILE__) + \
-     ", line " OGS_STRINGIFY(__LINE__))
-
-#define OGS_FATAL(fmt, ...)                                           \
-    BaseLib::detail::error_impl(BaseLib::format(fmt, ##__VA_ARGS__) + \
-                                OGS_LOCATION)
diff --git a/BaseLib/FileFinder.cpp b/BaseLib/FileFinder.cpp
index bfcd7ca812a972bc990a6abc0499069620d3887d..fb697517306ef6ef0e03890faeaa194a67f24699 100644
--- a/BaseLib/FileFinder.cpp
+++ b/BaseLib/FileFinder.cpp
@@ -16,8 +16,7 @@
 
 #include <fstream>
 
-#include <logog/include/logog.hpp>
-
+#include "Logging.h"
 
 namespace BaseLib
 {
diff --git a/BaseLib/FileTools.cpp b/BaseLib/FileTools.cpp
index 835635b1996cf87d95a03b0448701a3696450bbd..3f881e8c30291d5dc82bf7542e4e2afa64a95bf5 100644
--- a/BaseLib/FileTools.cpp
+++ b/BaseLib/FileTools.cpp
@@ -228,7 +228,7 @@ void removeFiles(std::vector<std::string> const& files)
         int const success = std::remove(file.c_str());
         if (success == 0)
         {
-            DBUG("Removed '%s'", file.c_str());
+            DBUG("Removed '{:s}'", file.c_str());
         }
         else
         {
@@ -236,7 +236,7 @@ void removeFiles(std::vector<std::string> const& files)
             {
                 continue;
             }
-            ERR("Removing file '%s' failed with error %d.", file.c_str(),
+            ERR("Removing file '{:s}' failed with error {:d}.", file.c_str(),
                 errno);
             std::perror("Error: ");
             OGS_FATAL("Unrecoverable error happened while removing a file.");
diff --git a/BaseLib/FileTools.h b/BaseLib/FileTools.h
index 33ce35c9af98196e042f5c4e0432178f66b03a82..008d40ac399bea5ba45ba7486f7ba1a77e0e66d4 100644
--- a/BaseLib/FileTools.h
+++ b/BaseLib/FileTools.h
@@ -18,7 +18,7 @@
 #include <string>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "Logging.h"
 
 namespace BaseLib
 {
@@ -75,9 +75,9 @@ std::vector<T> readBinaryArray(std::string const& filename, std::size_t const n)
 {
     std::ifstream in(filename.c_str());
     if (!in) {
-        ERR("readBinaryArray(): Error while reading from file '%s'.",
+        ERR("readBinaryArray(): Error while reading from file '{:s}'.",
             filename.c_str());
-        ERR("Could not open file '%s' for input.", filename.c_str());
+        ERR("Could not open file '{:s}' for input.", filename.c_str());
         in.close();
         return std::vector<T>();
     }
@@ -95,9 +95,11 @@ std::vector<T> readBinaryArray(std::string const& filename, std::size_t const n)
         return result;
     }
 
-    ERR("readBinaryArray(): Error while reading from file '%s'.",
+    ERR("readBinaryArray(): Error while reading from file '{:s}'.",
         filename.c_str());
-    ERR("Read different number of values. Expected %d, got %d.", n, result.size());
+    ERR("Read different number of values. Expected {:d}, got {:d}.",
+        n,
+        result.size());
 
     if (!in.eof())
         ERR("EOF reached.\n");
diff --git a/BaseLib/Histogram.h b/BaseLib/Histogram.h
index 0ee8c81a8166255da97c41bebd76096436f7c737..10666050f2eae4607fafdd4518c3a8d91cef691e 100644
--- a/BaseLib/Histogram.h
+++ b/BaseLib/Histogram.h
@@ -20,8 +20,7 @@
 #include <utility>
 #include <vector>
 
-#include <logog/include/logog.hpp>
-
+#include "Logging.h"
 
 namespace BaseLib
 {
diff --git a/BaseLib/IO/Writer.cpp b/BaseLib/IO/Writer.cpp
index 7c5c375c6e359326b2d2ec11aaf15e473a45324b..bd597a1e367d965623c0ad331da98ddcec48d436 100644
--- a/BaseLib/IO/Writer.cpp
+++ b/BaseLib/IO/Writer.cpp
@@ -17,7 +17,7 @@
 #include <fstream>
 #include <limits>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 namespace BaseLib
 {
@@ -54,7 +54,7 @@ int Writer::writeToFile(std::string const& filename)
         // check file stream
         if (!fileStream)
         {
-            ERR("Could not open file '%s'!", filename.c_str());
+            ERR("Could not open file '{:s}'!", filename.c_str());
             return 0;
         }
 
diff --git a/BaseLib/IO/XmlIO/Qt/XMLQtInterface.cpp b/BaseLib/IO/XmlIO/Qt/XMLQtInterface.cpp
index 1208448c2dbccb11e2b58c22a297303e81109cf3..f9b4a3b10fff958fcd5f6260736fb52de225f1a6 100644
--- a/BaseLib/IO/XmlIO/Qt/XMLQtInterface.cpp
+++ b/BaseLib/IO/XmlIO/Qt/XMLQtInterface.cpp
@@ -13,8 +13,6 @@
 
 #include "XMLQtInterface.h"
 
-#include <fstream>
-
 #include <QByteArray>
 #include <QCoreApplication>
 #include <QCryptographicHash>
@@ -23,10 +21,11 @@
 #include <QXmlSchema>
 #include <QXmlSchemaValidator>
 #include <QXmlStreamReader>
-
-#include <logog/include/logog.hpp>
+#include <fstream>
 #include <utility>
 
+#include "BaseLib/Logging.h"
+
 namespace BaseLib
 {
 namespace IO
@@ -41,7 +40,8 @@ int XMLQtInterface::readFile(const QString &fileName)
     QFile file(fileName);
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
     {
-        ERR("XMLQtInterface::readFile(): Can't open xml-file %s.", fileName.toStdString().c_str());
+        ERR("XMLQtInterface::readFile(): Can't open xml-file {:s}.",
+            fileName.toStdString().c_str());
         return 0;
     }
     _fileData = file.readAll();
@@ -73,8 +73,8 @@ int XMLQtInterface::isValid() const
         }
 
         INFO(
-            "XMLQtInterface::isValid(): XML file %s is invalid (in reference "
-            "to schema %s).",
+            "XMLQtInterface::isValid(): XML file {:s} is invalid (in reference "
+            "to schema {:s}).",
             _fileName.toStdString().c_str(), _schemaFile.toStdString().c_str());
     }
     else
@@ -88,7 +88,7 @@ int XMLQtInterface::isValid() const
         }
 
         INFO(
-            "XMLQtInterface::isValid(): XML file %s is invalid (in reference "
+            "XMLQtInterface::isValid(): XML file {:s} is invalid (in reference "
             "to its schema).",
             _fileName.toStdString().c_str());
     }
diff --git a/BaseLib/Logging.cpp b/BaseLib/Logging.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..82e505757cc680f0ac49a82f1ccb67b434599fdf
--- /dev/null
+++ b/BaseLib/Logging.cpp
@@ -0,0 +1,50 @@
+/**
+ * \file
+ *
+ * \copyright
+ * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#include "Logging.h"
+
+#include <spdlog/spdlog.h>
+#include <spdlog/sinks/stdout_color_sinks.h>
+
+#include <map>
+
+#ifdef USE_PETSC
+#include <mpi.h>
+#include <petscsys.h>
+#endif
+
+#include "Error.h"
+
+namespace BaseLib
+{
+#ifdef USE_PETSC
+std::shared_ptr<spdlog::logger> console = spdlog::stdout_color_mt("ogs");
+#else   // USE_PETSC
+std::shared_ptr<spdlog::logger> console = spdlog::stdout_color_st("ogs");
+#endif  // USE_PETSC
+
+void setConsoleLogLevel(std::string const& level_string)
+{
+    using namespace spdlog::level;
+    std::map<std::string, level_enum> string_to_log_level = {
+        {"none", off},  {"critical", critical}, {"error", err}, {"warn", warn},
+        {"info", info}, {"debug", debug},       {"all", trace}};
+
+    auto const level = string_to_log_level.find(level_string);
+    if (level == string_to_log_level.end())
+    {
+        ERR("'{:s}' is not a valid log level!", level_string);
+        OGS_FATAL("Wrong log level string.");
+    }
+    console->set_level(level->second);
+    spdlog::set_default_logger(console);
+}
+}  // namespace BaseLib
diff --git a/BaseLib/Logging.h b/BaseLib/Logging.h
new file mode 100644
index 0000000000000000000000000000000000000000..04fcd295e2c6bee72ace61b1ea13c44664899911
--- /dev/null
+++ b/BaseLib/Logging.h
@@ -0,0 +1,50 @@
+/**
+ * \file
+ *
+ * \copyright
+ * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#pragma once
+
+#include <spdlog/logger.h>
+
+#include <memory>
+#include <string>
+
+namespace BaseLib
+{
+extern std::shared_ptr<spdlog::logger> console;
+void setConsoleLogLevel(std::string const& level_string);
+
+}  // namespace BaseLib
+
+template <typename... Args>
+void DBUG(char const* fmt, Args const&... args)
+{
+    BaseLib::console->debug(fmt, args...);
+}
+template <typename... Args>
+void INFO(char const* fmt, Args const&... args)
+{
+    BaseLib::console->info(fmt, args...);
+}
+template <typename... Args>
+void WARN(char const* fmt, Args const&... args)
+{
+    BaseLib::console->warn(fmt, args...);
+}
+template <typename... Args>
+void ERR(char const* fmt, Args const&... args)
+{
+    BaseLib::console->error(fmt, args...);
+}
+template <typename... Args>
+void CRITICAL(char const* fmt, Args const&... args)
+{
+    BaseLib::console->critical(fmt, args...);
+}
diff --git a/BaseLib/LogogCustomCout.h b/BaseLib/LogogCustomCout.h
deleted file mode 100644
index 9bf7b8022c07d435d8d00f20440e8bb047f4d0bc..0000000000000000000000000000000000000000
--- a/BaseLib/LogogCustomCout.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * \file
- * \copyright
- * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
- *            Distributed under a Modified BSD License.
- *              See accompanying file LICENSE.txt or
- *              http://www.opengeosys.org/project/license
- *
- */
-
-#pragma once
-
-#include <iostream>
-
-#include <logog/include/logog.hpp>
-
-#ifdef USE_MPI
-#include <mpi.h>
-#endif
-
-namespace BaseLib
-{
-
-/// Custom target for logog output
-class LogogCustomCout : public logog::Target
-{
-public:
-#ifdef USE_MPI
-    /**
-     * Constructor when MPI is involved
-     *
-     * @param all_rank_output_level  Minimum level to output messages from all MPI processes
-     * @param mpi_comm               MPI communicator
-     */
-    LogogCustomCout(LOGOG_LEVEL_TYPE all_rank_output_level = LOGOG_LEVEL_INFO, MPI_Comm mpi_comm = MPI_COMM_WORLD)
-    : _all_rank_output_level(all_rank_output_level), _is_rank0 (getRank(mpi_comm)==0)
-    {}
-#endif
-
-    virtual int Receive( const logog::Topic &topic )
-    {
-#ifdef USE_MPI
-        if (topic.Level() > _all_rank_output_level && !_is_rank0)
-            return 0;
-#endif
-        return logog::Target::Receive(topic);
-    }
-
-    virtual int Output( const LOGOG_STRING &data )
-    {
-        LOGOG_COUT << (const LOGOG_CHAR *)data << std::flush;
-        return 0;
-    }
-
-private:
-#ifdef USE_MPI
-    int getRank(MPI_Comm mpi_comm) const
-    {
-        int rank = 0;
-        MPI_Comm_rank(mpi_comm, &rank);
-        return rank;
-    }
-
-    const LOGOG_LEVEL_TYPE _all_rank_output_level;
-    const bool _is_rank0;
-#endif
-};
-
-} // namespace BaseLib
diff --git a/BaseLib/LogogSimpleFormatter.h b/BaseLib/LogogSimpleFormatter.h
deleted file mode 100644
index 1bde2a5b43ec758ef339e9297f374f2659bd45fc..0000000000000000000000000000000000000000
--- a/BaseLib/LogogSimpleFormatter.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * \file
- * \author Lars Bilke
- * \date   2012-09-13
- * \brief  Definition of the LogogSimpleFormatter class.
- *
- * \copyright
- * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
- *            Distributed under a Modified BSD License.
- *              See accompanying file LICENSE.txt or
- *              http://www.opengeosys.org/project/license
- *
- */
-
-#pragma once
-
-#include <logog/include/logog.hpp>
-
-namespace BaseLib
-{
-/**
- * \brief LogogSimpleFormatter strips file name and line number from logog
- * output.
- * See http://johnwbyrd.github.com/logog/customformatting.html for details.
- **/
-class LogogSimpleFormatter : public logog::FormatterMSVC
-{
-    TOPIC_FLAGS GetTopicFlags(const logog::Topic& topic) override
-    {
-        return (logog::Formatter::GetTopicFlags(topic) &
-                ~(TOPIC_FILE_NAME_FLAG | TOPIC_LINE_NUMBER_FLAG));
-    }
-};
-
-}  // namespace BaseLib
diff --git a/BaseLib/StringTools.cpp b/BaseLib/StringTools.cpp
index 4faa7ee99099187b88bf4a2c7f7d1c624073c021..d420900d1407bbee2ff467c8746face319cb5164 100644
--- a/BaseLib/StringTools.cpp
+++ b/BaseLib/StringTools.cpp
@@ -21,8 +21,8 @@
 #include <cstdarg>
 #include <cstdio>
 #include <iomanip>
-#include <logog/include/logog.hpp>
 #include <random>
+#include "Logging.h"
 
 namespace BaseLib
 {
@@ -125,4 +125,4 @@ std::string randomString(std::size_t const length)
     return s;
 }
 
-} // end namespace BaseLib
+}  // end namespace BaseLib
diff --git a/BaseLib/StringTools.h b/BaseLib/StringTools.h
index ebaa82e523b920d6b4b67db9ccff7407bf834d2d..62f9c5600264d2d7a965899de09873da9807acfb 100644
--- a/BaseLib/StringTools.h
+++ b/BaseLib/StringTools.h
@@ -80,9 +80,6 @@ template<typename T> std::string tostring(T const& value)
 //! \overload
 std::string const& tostring(std::string const& value);
 
-//! returns printf-like formatted string
-std::string format(const char* format_string, ... );
-
 //! Returns a random string of the given length containing just a-z,A-Z,0-9
 std::string randomString(std::size_t length);
 
diff --git a/BaseLib/Subdivision.cpp b/BaseLib/Subdivision.cpp
index 7fb36ee5ba58739f7a988d8b35b2a9986cbbfa34..22284ee49441981db9c09de6ea5d83a8476afb1a 100644
--- a/BaseLib/Subdivision.cpp
+++ b/BaseLib/Subdivision.cpp
@@ -27,8 +27,8 @@ GradualSubdivision::GradualSubdivision(const double L,
     // Cf. geometric series formula.
     if (multiplier < 1.0 && dL0 / (1.0 - multiplier) < L) {
         OGS_FATAL(
-            "Using dL0=%g and multiplier=%g the generated subdivisions can not "
-            "sum up to a total length of %g.",
+            "Using dL0={:g} and multiplier={:g} the generated subdivisions can "
+            "not sum up to a total length of {:g}.",
             dL0,
             multiplier,
             L);
diff --git a/BaseLib/TemplateLogogFormatterSuppressedGCC-impl.h b/BaseLib/TemplateLogogFormatterSuppressedGCC-impl.h
deleted file mode 100644
index 9ddde3750419db9f65fa162841882103002be061..0000000000000000000000000000000000000000
--- a/BaseLib/TemplateLogogFormatterSuppressedGCC-impl.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * \file
- * \copyright
- * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
- *            Distributed under a Modified BSD License.
- *              See accompanying file LICENSE.txt or
- *              http://www.opengeosys.org/project/license
- *
- */
-
-namespace BaseLib {
-
-#ifdef USE_MPI
-template <int T_SUPPPRESS_TOPIC_FLAG>
-TemplateLogogFormatterSuppressedGCC<T_SUPPPRESS_TOPIC_FLAG>
-::TemplateLogogFormatterSuppressedGCC(MPI_Comm mpi_comm)
-{
-    int rank = 0;
-    MPI_Comm_rank(mpi_comm, &rank);
-    _str_mpi_rank = "[" + std::to_string(rank) + "] ";
-}
-#endif
-
-template <int T_SUPPPRESS_TOPIC_FLAG>
-LOGOG_STRING &
-TemplateLogogFormatterSuppressedGCC<T_SUPPPRESS_TOPIC_FLAG>
-::Format( const logog::Topic &topic, const logog::Target &target )
-{
-    TOPIC_FLAGS flags;
-    flags = GetTopicFlags( topic );
-
-    m_sMessageBuffer.clear();
-
-#ifdef USE_MPI
-    m_sMessageBuffer.append(_str_mpi_rank.c_str());
-#endif
-
-    if ( flags & TOPIC_FILE_NAME_FLAG )
-    {
-        m_sMessageBuffer.append( topic.FileName() );
-        m_sMessageBuffer.append( ':' );
-    }
-
-    if ( flags & TOPIC_LINE_NUMBER_FLAG )
-    {
-        m_sIntBuffer.assign( topic.LineNumber() );
-        m_sMessageBuffer.append( m_sIntBuffer );
-
-        m_sMessageBuffer.append( LOGOG_CONST_STRING(": "));
-    }
-
-    RenderTimeOfDay();
-
-    if ( flags & TOPIC_LEVEL_FLAG )
-    {
-        m_sMessageBuffer.append( ErrorDescription( topic.Level()));
-        m_sMessageBuffer.append( LOGOG_CONST_STRING(": "));
-    }
-
-    if ( flags & TOPIC_GROUP_FLAG )
-    {
-        m_sMessageBuffer.append( LOGOG_CONST_STRING("{") );
-        m_sMessageBuffer.append( topic.Group() );
-        m_sMessageBuffer.append( LOGOG_CONST_STRING("} ") );
-    }
-
-    if ( flags & TOPIC_CATEGORY_FLAG )
-    {
-        m_sMessageBuffer.append( LOGOG_CONST_STRING("["));
-        m_sMessageBuffer.append( topic.Category() );
-        m_sMessageBuffer.append( LOGOG_CONST_STRING("] "));
-    }
-
-    if ( flags & TOPIC_MESSAGE_FLAG )
-    {
-        m_sMessageBuffer.append( topic.Message() );
-        m_sMessageBuffer.append( (LOGOG_CHAR)'\n' );
-    }
-
-    if (target.GetNullTerminatesStrings())
-    {
-        m_sMessageBuffer.append((LOGOG_CHAR)'\0');
-    }
-
-    return m_sMessageBuffer;
-}
-
-} // namespace BaseLib
diff --git a/BaseLib/TemplateLogogFormatterSuppressedGCC.h b/BaseLib/TemplateLogogFormatterSuppressedGCC.h
deleted file mode 100644
index b3b9608b599e4cd39faf5cbbc28e887c29817273..0000000000000000000000000000000000000000
--- a/BaseLib/TemplateLogogFormatterSuppressedGCC.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * \file
- * \author Norihiro Watanabe
- * \date   2012-12-06
- * \brief  Definition of the TemplateLogogFormatterSuppressedGCC class.
- *
- * \copyright
- * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org)
- *            Distributed under a Modified BSD License.
- *              See accompanying file LICENSE.txt or
- *              http://www.opengeosys.org/project/license
- *
- */
-
-#pragma once
-
-#include <string>
-
-#include <logog/include/logog.hpp>
-#ifdef USE_MPI
-#include <mpi.h>
-#endif
-
-#include "StringTools.h"
-
-namespace BaseLib {
-
-/**
- * \brief TemplateLogogFormatterSuppressedGCC strips topics given as a template
- * parameter from logog::FormatterGCC.
- * See http://johnwbyrd.github.com/logog/customformatting.html for details.
- **/
-template <int T_SUPPPRESS_TOPIC_FLAG>
-class TemplateLogogFormatterSuppressedGCC : public logog::FormatterGCC
-{
-public:
-#ifdef USE_MPI
-    TemplateLogogFormatterSuppressedGCC(MPI_Comm mpi_comm = MPI_COMM_WORLD);
-#endif
-
-    TOPIC_FLAGS GetTopicFlags(const logog::Topic& topic) override
-    {
-    return ( logog::Formatter::GetTopicFlags( topic ) &
-        ~( T_SUPPPRESS_TOPIC_FLAG ));
-    }
-
-    LOGOG_STRING& Format(const logog::Topic& topic,
-                         const logog::Target& target) override;
-
-private:
-#ifdef USE_MPI
-    std::string _str_mpi_rank;
-#endif
-};
-
-} // namespace BaseLib
-
-#include "TemplateLogogFormatterSuppressedGCC-impl.h"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3356098886cbcbaee6bb967182d5c8bb2c43f1f5..9a996686f90cde6ab2e3860a8d36d43e1e41ed82 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -263,7 +263,8 @@ include_directories(
     ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/autocheck/include
     ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/tclap/include
     ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/json/include
-    ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/exprtk)
+    ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/exprtk
+    ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/spdlog/include)
 
 # vtkdiff
 if(EXISTS ${PROJECT_SOURCE_DIR}/ThirdParty/vtkdiff/CMakeLists.txt)
diff --git a/ChemistryLib/CMakeLists.txt b/ChemistryLib/CMakeLists.txt
index c9461b3baf5d5ba82546619c79a1da8898b5fec5..d55cdfa247fd7048a6f7f2824b4f06e8945bf4b6 100644
--- a/ChemistryLib/CMakeLists.txt
+++ b/ChemistryLib/CMakeLists.txt
@@ -10,6 +10,6 @@ ogs_add_library(ChemistryLib ${SOURCES})
 include(GenerateExportHeader)
 generate_export_header(ChemistryLib)
 
-target_link_libraries(ChemistryLib PUBLIC iphreeqc PRIVATE NumLib)
+target_link_libraries(ChemistryLib PUBLIC iphreeqc PRIVATE NumLib spdlog::spdlog)
 
 set_target_properties(ChemistryLib PROPERTIES CXX_STANDARD 14)
diff --git a/ChemistryLib/CreateChemicalSolverInterface.cpp b/ChemistryLib/CreateChemicalSolverInterface.cpp
index 8259f50d7e2185626eb5105b515093f9a5ef6ced..a69a5f0d481504dcc06a953ab81befd0d242ba31 100644
--- a/ChemistryLib/CreateChemicalSolverInterface.cpp
+++ b/ChemistryLib/CreateChemicalSolverInterface.cpp
@@ -9,6 +9,10 @@
  */
 
 #include "CreateChemicalSolverInterface.h"
+
+#include <iphreeqc/src/src/phreeqcpp/cxxKinetics.h>
+
+#include "BaseLib/FileTools.h"
 #include "Common/CreateReactionRate.h"
 #include "MeshLib/Mesh.h"
 #include "PhreeqcIO.h"
@@ -34,8 +38,6 @@
 #include "PhreeqcKernelData/CreateKineticReactant.h"
 #include "PhreeqcKernelData/ReactionRate.h"
 
-#include <iphreeqc/src/src/phreeqcpp/cxxKinetics.h>
-
 namespace
 {
 std::string parseDatabasePath(BaseLib::ConfigTree const& config)
@@ -48,11 +50,11 @@ std::string parseDatabasePath(BaseLib::ConfigTree const& config)
 
     if (!BaseLib::IsFileExisting(path_to_database))
     {
-        OGS_FATAL("Not found the specified thermodynamicdatabase: %s",
+        OGS_FATAL("Not found the specified thermodynamicdatabase: {:s}",
                   path_to_database.c_str());
     }
 
-    INFO("Found the specified thermodynamic database: %s",
+    INFO("Found the specified thermodynamic database: {:s}",
          path_to_database.c_str());
 
     return path_to_database;
@@ -83,7 +85,8 @@ createChemicalSolverInterface<ChemicalSolver::Phreeqc>(
         "Required mesh with name '" + mesh_name + "' not found.");
 
     assert(mesh.getID() != 0);
-    DBUG("Found mesh '%s' with id %d.", mesh.getName().c_str(), mesh.getID());
+    DBUG("Found mesh '{:s}' with id {:d}.", mesh.getName().c_str(),
+         mesh.getID());
 
     auto path_to_database = parseDatabasePath(config);
 
diff --git a/ChemistryLib/PhreeqcIO.cpp b/ChemistryLib/PhreeqcIO.cpp
index 4c9c9198b6139b1e7846bc63ef72e45650605e09..c196dc4238087b835f68ec144737b777439bbe5f 100644
--- a/ChemistryLib/PhreeqcIO.cpp
+++ b/ChemistryLib/PhreeqcIO.cpp
@@ -8,14 +8,17 @@
  *
  */
 
+#include "PhreeqcIO.h"
+
+#include <iphreeqc/src/src/IPhreeqc.h>
+
 #include <boost/algorithm/string.hpp>
 #include <cmath>
-#include <iostream>
+#include <fstream>
 
 #include "BaseLib/Algorithm.h"
 #include "BaseLib/ConfigTreeUtil.h"
 #include "MeshLib/Mesh.h"
-#include "PhreeqcIO.h"
 #include "PhreeqcIOData/AqueousSolution.h"
 #include "PhreeqcIOData/Dump.h"
 #include "PhreeqcIOData/EquilibriumReactant.h"
@@ -26,8 +29,6 @@
 #include "PhreeqcIOData/Surface.h"
 #include "PhreeqcIOData/UserPunch.h"
 
-#include <iphreeqc/src/src/IPhreeqc.h>
-
 namespace ChemistryLib
 {
 namespace PhreeqcIOData
@@ -84,14 +85,14 @@ PhreeqcIO::PhreeqcIO(std::string const project_file_name,
     {
         OGS_FATAL(
             "Failed in loading the specified thermodynamic database file: "
-            "%s.",
+            "{:s}.",
             _database.c_str());
     }
 
     if (SetSelectedOutputFileOn(phreeqc_instance_id, 1) != IPQ_OK)
     {
         OGS_FATAL(
-            "Failed to fly the flag for the specified file %s where phreeqc "
+            "Failed to fly the flag for the specified file {:s} where phreeqc "
             "will write output.",
             _output->basic_output_setups.output_file.c_str());
     }
@@ -229,7 +230,8 @@ void PhreeqcIO::setAqueousSolutionsPrevFromDumpFile()
     std::ifstream in(dump_file);
     if (!in)
     {
-        OGS_FATAL("Could not open phreeqc dump file '%s'.", dump_file.c_str());
+        OGS_FATAL("Could not open phreeqc dump file '{:s}'.",
+                  dump_file.c_str());
     }
 
     std::size_t const num_chemical_systems = _mesh.getNumberOfBaseNodes();
@@ -237,7 +239,7 @@ void PhreeqcIO::setAqueousSolutionsPrevFromDumpFile()
 
     if (!in)
     {
-        OGS_FATAL("Error when reading phreeqc dump file '%s'",
+        OGS_FATAL("Error when reading phreeqc dump file '{:s}'",
                   dump_file.c_str());
     }
 
@@ -246,12 +248,13 @@ void PhreeqcIO::setAqueousSolutionsPrevFromDumpFile()
 
 void PhreeqcIO::writeInputsToFile(double const dt)
 {
-    DBUG("Writing phreeqc inputs into file '%s'.", _phreeqc_input_file.c_str());
+    DBUG("Writing phreeqc inputs into file '{:s}'.",
+         _phreeqc_input_file.c_str());
     std::ofstream out(_phreeqc_input_file, std::ofstream::out);
 
     if (!out)
     {
-        OGS_FATAL("Could not open file '%s' for writing phreeqc inputs.",
+        OGS_FATAL("Could not open file '{:s}' for writing phreeqc inputs.",
                   _phreeqc_input_file.c_str());
     }
 
@@ -259,7 +262,7 @@ void PhreeqcIO::writeInputsToFile(double const dt)
 
     if (!out)
     {
-        OGS_FATAL("Failed in generating phreeqc input file '%s'.",
+        OGS_FATAL("Failed in generating phreeqc input file '{:s}'.",
                   _phreeqc_input_file.c_str());
     }
 
@@ -373,7 +376,7 @@ void PhreeqcIO::execute()
         OutputErrorString(phreeqc_instance_id);
         OGS_FATAL(
             "Failed in performing speciation calculation with the generated "
-            "phreeqc input file '%s'.",
+            "phreeqc input file '{:s}'.",
             _phreeqc_input_file.c_str());
     }
 }
@@ -382,13 +385,13 @@ void PhreeqcIO::readOutputsFromFile()
 {
     auto const& basic_output_setups = _output->basic_output_setups;
     auto const& phreeqc_result_file = basic_output_setups.output_file;
-    DBUG("Reading phreeqc results from file '%s'.",
+    DBUG("Reading phreeqc results from file '{:s}'.",
          phreeqc_result_file.c_str());
     std::ifstream in(phreeqc_result_file);
 
     if (!in)
     {
-        OGS_FATAL("Could not open phreeqc result file '%s'.",
+        OGS_FATAL("Could not open phreeqc result file '{:s}'.",
                   phreeqc_result_file.c_str());
     }
 
@@ -396,7 +399,7 @@ void PhreeqcIO::readOutputsFromFile()
 
     if (!in)
     {
-        OGS_FATAL("Error when reading phreeqc result file '%s'",
+        OGS_FATAL("Error when reading phreeqc result file '{:s}'",
                   phreeqc_result_file.c_str());
     }
 
@@ -436,7 +439,7 @@ std::istream& operator>>(std::istream& in, PhreeqcIO& phreeqc_io)
         if (!std::getline(in, line))
         {
             OGS_FATAL(
-                "Error when reading calculation result of Solution %u after "
+                "Error when reading calculation result of Solution {:d} after "
                 "the reaction.",
                 global_id);
         }
@@ -460,17 +463,20 @@ std::istream& operator>>(std::istream& in, PhreeqcIO& phreeqc_io)
                 catch (const std::invalid_argument& e)
                 {
                     OGS_FATAL(
-                        "Invalid argument. Could not convert string '%s' to "
-                        "double for chemical system %d, column %d. Exception "
-                        "'%s' was thrown.",
+                        "Invalid argument. Could not convert string '{:s}' to "
+                        "double for chemical system {:d}, column {:d}. "
+                        "Exception "
+                        "'{:s}' was thrown.",
                         items[item_id].c_str(), global_id, item_id, e.what());
                 }
                 catch (const std::out_of_range& e)
                 {
                     OGS_FATAL(
-                        "Out of range error. Could not convert string '%s' to "
-                        "double for chemical system %d, column %d. Exception "
-                        "'%s' was thrown.",
+                        "Out of range error. Could not convert string '{:s}' "
+                        "to "
+                        "double for chemical system {:d}, column {:d}. "
+                        "Exception "
+                        "'{:s}' was thrown.",
                         items[item_id].c_str(), global_id, item_id, e.what());
                 }
                 accepted_items.push_back(value);
diff --git a/ChemistryLib/PhreeqcIOData/CreateSolutionComponent.cpp b/ChemistryLib/PhreeqcIOData/CreateSolutionComponent.cpp
index 2801451193bf136b8fd5a1a54871fc0a4cbecd00..45b01d8e8696403e887ee6c5ef9e3e9022db3832 100644
--- a/ChemistryLib/PhreeqcIOData/CreateSolutionComponent.cpp
+++ b/ChemistryLib/PhreeqcIOData/CreateSolutionComponent.cpp
@@ -46,7 +46,8 @@ std::vector<Component> createSolutionComponents(
             process_id_to_component_name_map.end())
         {
             OGS_FATAL(
-                "Component %s given in <solution>/<components> is not found in "
+                "Component {:s} given in <solution>/<components> is not found "
+                "in "
                 "specified coupled processes (see "
                 "<process>/<process_variables>/<concentration>).",
                 component.name.c_str());
diff --git a/ChemistryLib/PhreeqcKernel.cpp b/ChemistryLib/PhreeqcKernel.cpp
index fe545e63c62beb48670d67f9d316b2051721dc3e..5648119467f8249c8a0d51fab6026b9d8bb4351d 100644
--- a/ChemistryLib/PhreeqcKernel.cpp
+++ b/ChemistryLib/PhreeqcKernel.cpp
@@ -131,7 +131,7 @@ void PhreeqcKernel::loadDatabase(std::string const& database)
     std::ifstream in(database);
     if (!in)
     {
-        OGS_FATAL("Unable to open database file '%s'.", database.c_str());
+        OGS_FATAL("Unable to open database file '{:s}'.", database.c_str());
     }
     assert(phrq_io->get_istream() == nullptr);
     phrq_io->push_istream(&in, false);
@@ -153,7 +153,7 @@ void PhreeqcKernel::reinitializeRates()
             malloc(sizeof(char) * reaction_rate.commands().size() + 1));
         if (rates[rate_id].commands == nullptr)
         {
-            OGS_FATAL("Could not allocate memory for rate[%d] commands.",
+            OGS_FATAL("Could not allocate memory for rate[{:d}] commands.",
                       rate_id);
         }
         reaction_rate.commands().copy(rates[rate_id].commands,
diff --git a/ChemistryLib/PhreeqcKernelData/CreateInitialAqueousSolution.cpp b/ChemistryLib/PhreeqcKernelData/CreateInitialAqueousSolution.cpp
index 8aa8d3e0778d96ac33ef1e3f91edf7d41cf96bd6..2afda65161f70ec86d64835f59065dee85c9f6aa 100644
--- a/ChemistryLib/PhreeqcKernelData/CreateInitialAqueousSolution.cpp
+++ b/ChemistryLib/PhreeqcKernelData/CreateInitialAqueousSolution.cpp
@@ -49,7 +49,8 @@ InitialAqueousSolution createInitialAqueousSolution(
             process_id_to_component_name_map.end())
         {
             OGS_FATAL(
-                "Component %s given in <solution>/<components> is not found in "
+                "Component {:s} given in <solution>/<components> is not found "
+                "in "
                 "specified coupled processes (see "
                 "<process>/<process_variables>/<concentration>).",
                 component.first.c_str());
diff --git a/GeoLib/AABB.h b/GeoLib/AABB.h
index 49676faa835517fb729f4843bd100beaa4f1c8bc..0327145144ba58c963546f0a45d5a2734060cda6 100644
--- a/GeoLib/AABB.h
+++ b/GeoLib/AABB.h
@@ -24,8 +24,6 @@
 #include <tuple>
 #include <vector>
 
-#include <logog/include/logog.hpp>
-
 #include "BaseLib/Error.h"
 #include "MathLib/Point3d.h"
 #include "MathLib/MathTools.h"
diff --git a/GeoLib/AnalyticalGeometry.cpp b/GeoLib/AnalyticalGeometry.cpp
index eb19bfb4b165366e65ae4361bb85e29dc2b227c1..51d13a3740753eda8887c344c716b7d9d96eec5a 100644
--- a/GeoLib/AnalyticalGeometry.cpp
+++ b/GeoLib/AnalyticalGeometry.cpp
@@ -18,7 +18,7 @@
 #include <cmath>
 #include <limits>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <Eigen/Dense>
 
@@ -440,7 +440,7 @@ std::vector<MathLib::Point3d> lineSegmentIntersect2d(
             err.precision(std::numeric_limits<double>::digits10);
             err << ab << " x " << cd;
             OGS_FATAL(
-                "The case of parallel line segments (%s) is not handled yet. "
+                "The case of parallel line segments ({:s}) is not handled yet. "
                 "Aborting.",
                 err.str().c_str());
         }
@@ -468,7 +468,7 @@ std::vector<MathLib::Point3d> lineSegmentIntersect2d(
             err.precision(std::numeric_limits<double>::digits10);
             err << ab << " x " << cd;
             OGS_FATAL(
-                "The case of parallel line segments (%s) "
+                "The case of parallel line segments ({:s}) "
                 "is not handled yet. Aborting.",
                 err.str().c_str());
         }
diff --git a/GeoLib/CMakeLists.txt b/GeoLib/CMakeLists.txt
index d6118a16d65d19235b175101d982d910da32c201..0168f1789fab5c8822dc56b4d524539cfa7844bb 100644
--- a/GeoLib/CMakeLists.txt
+++ b/GeoLib/CMakeLists.txt
@@ -12,7 +12,7 @@ endif()
 # Create the library
 ogs_add_library(GeoLib ${SOURCES})
 
-target_link_libraries(GeoLib PUBLIC BaseLib MathLib logog PRIVATE tet)
+target_link_libraries(GeoLib PUBLIC BaseLib MathLib PRIVATE tet spdlog::spdlog)
 
 if(OGS_BUILD_GUI)
     target_link_libraries(GeoLib PUBLIC Qt5::Xml Qt5::XmlPatterns)
diff --git a/GeoLib/DuplicateGeometry.cpp b/GeoLib/DuplicateGeometry.cpp
index c1ecc93560f89865d2c32c7306a250fbeffbf20f..85e1fd7db0450fdf914dd25efa8a53f19119b54f 100644
--- a/GeoLib/DuplicateGeometry.cpp
+++ b/GeoLib/DuplicateGeometry.cpp
@@ -10,8 +10,8 @@
 
 #include "DuplicateGeometry.h"
 
-#include <logog/include/logog.hpp>
 #include <utility>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/GEOObjects.h"
 #include "GeoLib/Point.h"
@@ -35,7 +35,7 @@ void DuplicateGeometry::duplicate(std::string const& input_name)
     std::vector<GeoLib::Point*> const*const pnts (_geo_objects.getPointVec(input_name));
     if (pnts == nullptr)
     {
-        ERR("Geometry '%s' not found.", input_name.c_str());
+        ERR("Geometry '{:s}' not found.", input_name.c_str());
         return;
     }
 
diff --git a/GeoLib/GEOObjects.cpp b/GeoLib/GEOObjects.cpp
index 9ff9a848c754c72e6eeab22b9eab0928c1642681..b9dc4335b3128f0b9dfc929f96ebcf3e6dbfda3c 100644
--- a/GeoLib/GEOObjects.cpp
+++ b/GeoLib/GEOObjects.cpp
@@ -15,7 +15,7 @@
 #include "GEOObjects.h"
 
 #include <fstream>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Triangle.h"
 
@@ -68,7 +68,7 @@ const std::vector<Point*>* GEOObjects::getPointVec(const std::string &name) cons
         return _pnt_vecs[idx]->getVector();
     }
 
-    DBUG("GEOObjects::getPointVec() - No entry found with name '%s'.",
+    DBUG("GEOObjects::getPointVec() - No entry found with name '{:s}'.",
          name.c_str());
     return nullptr;
 }
@@ -81,7 +81,7 @@ const PointVec* GEOObjects::getPointVecObj(const std::string &name) const
         return _pnt_vecs[idx];
     }
 
-    DBUG("GEOObjects::getPointVecObj() - No entry found with name '%s'.",
+    DBUG("GEOObjects::getPointVecObj() - No entry found with name '{:s}'.",
          name.c_str());
     return nullptr;
 }
@@ -104,7 +104,7 @@ bool GEOObjects::removePointVec(std::string const& name)
             return true;
         }
     }
-    DBUG("GEOObjects::removePointVec() - No entry found with name '%s'.",
+    DBUG("GEOObjects::removePointVec() - No entry found with name '{:s}'.",
          name.c_str());
     return false;
 }
@@ -129,7 +129,7 @@ const std::vector<GeoLib::Point*>* GEOObjects::getStationVec(
     {
         return (*it)->getVector();
     }
-    DBUG("GEOObjects::getStationVec() - No entry found with name '%s'.",
+    DBUG("GEOObjects::getStationVec() - No entry found with name '{:s}'.",
          name.c_str());
     return nullptr;
 }
@@ -205,7 +205,7 @@ const std::vector<Polyline*>* GEOObjects::getPolylineVec(const std::string &name
         }
     }
 
-    DBUG("GEOObjects::getPolylineVec() - No entry found with name '%s'.",
+    DBUG("GEOObjects::getPolylineVec() - No entry found with name '{:s}'.",
          name.c_str());
     return nullptr;
 }
@@ -221,7 +221,7 @@ const PolylineVec* GEOObjects::getPolylineVecObj(const std::string &name) const
         }
     }
 
-    DBUG("GEOObjects::getPolylineVecObj() - No entry found with name '%s'.",
+    DBUG("GEOObjects::getPolylineVecObj() - No entry found with name '{:s}'.",
          name.c_str());
     return nullptr;
 }
@@ -239,7 +239,7 @@ bool GEOObjects::removePolylineVec(std::string const& name)
         }
     }
 
-    DBUG("GEOObjects::removePolylineVec() - No entry found with name '%s'.",
+    DBUG("GEOObjects::removePolylineVec() - No entry found with name '{:s}'.",
          name.c_str());
     return false;
 }
@@ -300,7 +300,7 @@ const std::vector<Surface*>* GEOObjects::getSurfaceVec(const std::string &name)
             return _sfc_vecs[i]->getVector();
         }
     }
-    DBUG("GEOObjects::getSurfaceVec() - No entry found with name '%s'.",
+    DBUG("GEOObjects::getSurfaceVec() - No entry found with name '{:s}'.",
          name.c_str());
     return nullptr;
 }
@@ -318,7 +318,7 @@ bool GEOObjects::removeSurfaceVec(const std::string &name)
         }
     }
 
-    DBUG("GEOObjects::removeSurfaceVec() - No entry found with name '%s'.",
+    DBUG("GEOObjects::removeSurfaceVec() - No entry found with name '{:s}'.",
          name.c_str());
     return false;
 }
@@ -333,7 +333,7 @@ const SurfaceVec* GEOObjects::getSurfaceVecObj(const std::string &name) const
             return _sfc_vecs[i];
         }
     }
-    DBUG("GEOObjects::getSurfaceVecObj() - No entry found with name '%s'.",
+    DBUG("GEOObjects::getSurfaceVecObj() - No entry found with name '{:s}'.",
          name.c_str());
     return nullptr;
 }
@@ -667,13 +667,13 @@ int GEOObjects::geoPointsToStations(std::string const& geo_name,
     GeoLib::PointVec const* const pnt_obj(getPointVecObj(geo_name));
     if (pnt_obj == nullptr)
     {
-        ERR("Point vector %s not found.", geo_name.c_str());
+        ERR("Point vector {:s} not found.", geo_name.c_str());
         return -1;
     }
     std::vector<GeoLib::Point*> const& pnts = *pnt_obj->getVector();
     if (pnts.empty())
     {
-        ERR("Point vector %s is empty.", geo_name.c_str());
+        ERR("Point vector {:s} is empty.", geo_name.c_str());
         return -1;
     }
     std::size_t const n_pnts(pnts.size());
@@ -752,9 +752,11 @@ const GeoLib::GeoObject* GEOObjects::getGeoObject(
     };
 
     if (!geo_obj) {
-        DBUG("GEOObjects::getGeoObject(): Could not find %s '%s' in geometry.",
-             GeoLib::convertGeoTypeToString(type).c_str(),
-             geo_obj_name.c_str());
+        DBUG(
+            "GEOObjects::getGeoObject(): Could not find {:s} '{:s}' in "
+            "geometry.",
+            GeoLib::convertGeoTypeToString(type).c_str(),
+            geo_obj_name.c_str());
     }
     return geo_obj;
 }
@@ -780,8 +782,10 @@ GeoLib::GeoObject const* GEOObjects::getGeoObject(
     }
 
     if (!geo_obj) {
-        DBUG("GEOObjects::getGeoObject(): Could not find '%s' in geometry %s.",
-             geo_obj_name.c_str(), geo_name.c_str());
+        DBUG(
+            "GEOObjects::getGeoObject(): Could not find '{:s}' in geometry "
+            "{:s}.",
+            geo_obj_name.c_str(), geo_name.c_str());
     }
     return geo_obj;
 }
diff --git a/GeoLib/Grid.h b/GeoLib/Grid.h
index 8421aa96c44cc6e2054a443ec4c1eb46f2144b3d..8266d9efcae0f4c3fc5301249722b02bba6c6dc3 100644
--- a/GeoLib/Grid.h
+++ b/GeoLib/Grid.h
@@ -17,7 +17,7 @@
 #include <bitset>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 // GeoLib
 #include "AABB.h"
@@ -225,9 +225,10 @@ Grid<POINT>::Grid(InputIterator first, InputIterator last,
             std::size_t const pos(coords[0]+coords[1]*_n_steps[0]+coords[2]*n_plane);
             _grid_cell_nodes_map[pos].push_back(const_cast<POINT*>(copyOrAddress(*it)));
         } else {
-            ERR("Grid constructor: error computing indices [%d, %d, %d], "
-                "max indices [%d, %d, %d].", coords[0], coords[1], coords[2],
-                _n_steps[0], _n_steps[1], _n_steps[2]);
+            ERR("Grid constructor: error computing indices [{:d}, {:d}, {:d}], "
+                "max indices [{:d}, {:d}, {:d}].",
+                coords[0], coords[1], coords[2], _n_steps[0], _n_steps[1],
+                _n_steps[2]);
         }
         it++;
     }
diff --git a/GeoLib/IO/TINInterface.cpp b/GeoLib/IO/TINInterface.cpp
index 7e4e44e01f474dcfc96576ab92c78fcb55c6c63e..5b109b3f7277dbff392a1aa335440e073c8a2752 100644
--- a/GeoLib/IO/TINInterface.cpp
+++ b/GeoLib/IO/TINInterface.cpp
@@ -11,7 +11,7 @@
 #include <fstream>
 #include <limits>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -34,7 +34,7 @@ GeoLib::Surface* TINInterface::readTIN(std::string const& fname,
     // open file
     std::ifstream in(fname.c_str());
     if (!in) {
-        WARN("readTIN(): could not open stream from %s.", fname.c_str());
+        WARN("readTIN(): could not open stream from {:s}.", fname.c_str());
         if (errors)
         {
             errors->push_back("readTINFile error opening stream from " + fname);
@@ -66,7 +66,7 @@ GeoLib::Surface* TINInterface::readTIN(std::string const& fname,
         }
         // read first point
         if (!(input >> p0[0] >> p0[1] >> p0[2])) {
-            ERR("Could not read coords of 1st point of triangle %d.", id);
+            ERR("Could not read coords of 1st point of triangle {:d}.", id);
             if (errors)
             {
                 errors->push_back(
@@ -81,7 +81,7 @@ GeoLib::Surface* TINInterface::readTIN(std::string const& fname,
         }
         // read second point
         if (!(input >> p1[0] >> p1[1] >> p1[2])) {
-            ERR("Could not read coords of 2nd point of triangle %d.", id);
+            ERR("Could not read coords of 2nd point of triangle {:d}.", id);
             if (errors)
             {
                 errors->push_back(
@@ -96,7 +96,7 @@ GeoLib::Surface* TINInterface::readTIN(std::string const& fname,
         }
         // read third point
         if (!(input >> p2[0] >> p2[1] >> p2[2])) {
-            ERR("Could not read coords of 3rd point of triangle %d.", id);
+            ERR("Could not read coords of 3rd point of triangle {:d}.", id);
             if (errors)
             {
                 errors->push_back(
@@ -113,7 +113,7 @@ GeoLib::Surface* TINInterface::readTIN(std::string const& fname,
         // check area of triangle
         double const d_eps(std::numeric_limits<double>::epsilon());
         if (MathLib::calcTriangleArea(p0, p1, p2) < d_eps) {
-            ERR("readTIN: Triangle %d has zero area.", id);
+            ERR("readTIN: Triangle {:d} has zero area.", id);
             if (errors)
             {
                 errors->push_back(std::string("readTIN: Triangle ") +
@@ -156,7 +156,8 @@ void TINInterface::writeSurfaceAsTIN(GeoLib::Surface const& surface, std::string
 {
     std::ofstream os (file_name.c_str());
     if (!os) {
-        WARN("writeSurfaceAsTIN(): could not open stream to %s.", file_name.c_str());
+        WARN("writeSurfaceAsTIN(): could not open stream to {:s}.",
+             file_name.c_str());
         return;
     }
     os.precision(std::numeric_limits<double>::digits10);
diff --git a/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp b/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp
index 2dee219f70edccedb11510b1e0e4e1d10bc89b8b..b035188374e928f9f847943c0c5c8ba3975b64ba 100644
--- a/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp
+++ b/GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.cpp
@@ -15,7 +15,7 @@
 #include "BoostXmlGmlInterface.h"
 
 #include <boost/property_tree/xml_parser.hpp>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Algorithm.h"
 #include "BaseLib/ConfigTreeUtil.h"
@@ -169,7 +169,7 @@ void BoostXmlGmlInterface::readPolylines(
                 if (search == _idx_map.end())
                 {
                     OGS_FATAL(
-                        "Polyline `%s' contains the point id `%d', but the "
+                        "Polyline `{:s}' contains the point id `{:d}', but the "
                         "id is not in the point list.",
                         p_name->c_str(), pt_idx);
                 }
@@ -231,8 +231,9 @@ void BoostXmlGmlInterface::readSurfaces(
                     if (search == _idx_map.end())
                     {
                         OGS_FATAL(
-                            "The element list of the surface `%s' contains the "
-                            "invalid point id `%d'.",
+                            "The element list of the surface `{:s}' contains "
+                            "the "
+                            "invalid point id `{:d}'.",
                             s_name->c_str(), pt_idx);
                     }
                     return search->second;
@@ -262,7 +263,7 @@ bool BoostXmlGmlInterface::write()
     GeoLib::PointVec const*const pnt_vec(_geo_objects.getPointVecObj(_exportName));
     if (! pnt_vec) {
         ERR("BoostXmlGmlInterface::write(): No PointVec within the geometry "
-            "'%s'.",
+            "'{:s}'.",
             _exportName.c_str());
         return false;
     }
@@ -270,13 +271,13 @@ bool BoostXmlGmlInterface::write()
     std::vector<GeoLib::Point*> const*const pnts(pnt_vec->getVector());
     if (! pnts) {
         ERR("BoostXmlGmlInterface::write(): No vector of points within the "
-            "geometry '%s'.",
+            "geometry '{:s}'.",
             _exportName.c_str());
         return false;
     }
     if (pnts->empty()) {
         ERR("BoostXmlGmlInterface::write(): No points within the geometry "
-            "'%s'.",
+            "'{:s}'.",
             _exportName.c_str());
         return false;
     }
@@ -320,7 +321,7 @@ void BoostXmlGmlInterface::addSurfacesToPropertyTree(
     if (!sfc_vec) {
         INFO(
             "BoostXmlGmlInterface::addSurfacesToPropertyTree(): "
-            "No surfaces within the geometry '%s'.",
+            "No surfaces within the geometry '{:s}'.",
             _exportName.c_str());
         return;
     }
@@ -330,7 +331,7 @@ void BoostXmlGmlInterface::addSurfacesToPropertyTree(
     {
         INFO(
             "BoostXmlGmlInterface::addSurfacesToPropertyTree(): "
-            "No surfaces within the geometry '%s'.",
+            "No surfaces within the geometry '{:s}'.",
             _exportName.c_str());
         return;
     }
@@ -362,7 +363,7 @@ void BoostXmlGmlInterface::addPolylinesToPropertyTree(
     if (!vec) {
         INFO(
             "BoostXmlGmlInterface::addPolylinesToPropertyTree(): "
-            "No polylines within the geometry '%s'.",
+            "No polylines within the geometry '{:s}'.",
             _exportName.c_str());
         return;
     }
@@ -372,7 +373,7 @@ void BoostXmlGmlInterface::addPolylinesToPropertyTree(
     {
         INFO(
             "BoostXmlGmlInterface::addPolylinesToPropertyTree(): "
-            "No polylines within the geometry '%s'.",
+            "No polylines within the geometry '{:s}'.",
             _exportName.c_str());
         return;
     }
diff --git a/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp b/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp
index 319d5ff33bb16f0e3acc6e928ab20b9844b1317b..aff68e29f5a7d7299c4510f1065692eef7977bbb 100644
--- a/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp
+++ b/GeoLib/IO/XmlIO/Qt/XmlGmlInterface.cpp
@@ -18,7 +18,7 @@
 #include <QTextCodec>
 #include <QtXml/QDomDocument>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileFinder.h"
 #include "GeoLib/Triangle.h"
@@ -229,7 +229,7 @@ void XmlGmlInterface::readPolylines(
                 ply_names->insert(std::pair<std::string, std::size_t>(ply_name, idx));
             } else {
                 WARN(
-                    "Polyline '%s' exists already. Polyline %d will be "
+                    "Polyline '{:s}' exists already. Polyline {:d} will be "
                     "inserted without a name.",
                     ply_name.c_str(), idx);
             }
@@ -248,7 +248,7 @@ void XmlGmlInterface::readPolylines(
                             polyline.attribute("name").toStdString();
                     }
                     OGS_FATAL(
-                        "Polyline `%s' contains the point id `%d' which is "
+                        "Polyline `{:s}' contains the point id `{:d}' which is "
                         "not in the point list.",
                         polyline_name.c_str(), pt_idx);
                 }
@@ -295,7 +295,7 @@ void XmlGmlInterface::readSurfaces(
                         surface_name = surface.attribute("name").toStdString();
                     }
                     OGS_FATAL(
-                        "Surface `%s' contains the point id `%d', which is "
+                        "Surface `{:s}' contains the point id `{:d}', which is "
                         "not in the point list.",
                         surface_name.c_str(), pt_idx);
                 }
diff --git a/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp b/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp
index 4c03bf10b0b87f14d4f9df6f3382081b830a6d6a..bb8a33f9d517c6dc037a43af2be27027d060091c 100644
--- a/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp
+++ b/GeoLib/IO/XmlIO/Qt/XmlStnInterface.cpp
@@ -19,7 +19,7 @@
 #include <QFile>
 #include <QtXml/QDomDocument>
 #include <RapidXML/rapidxml.hpp>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/DateTools.h"
 #include "BaseLib/FileTools.h"
@@ -217,8 +217,8 @@ void XmlStnInterface::readStratigraphy( const QDomNode &stratRoot,
             }
             else
                 WARN(
-                    "XmlStnInterface::readStratigraphy(): Skipped layer '%s' "
-                    "in borehole '%s' because of thickness 0.0.",
+                    "XmlStnInterface::readStratigraphy(): Skipped layer '{:s}' "
+                    "in borehole '{:s}' because of thickness 0.0.",
                     horizonName.c_str(), borehole->getName().c_str());
         }
         else
diff --git a/GeoLib/PointVec.cpp b/GeoLib/PointVec.cpp
index 7b88a549f9c048ca0228061d2537a46ce4f65c50..f1292ff47f25aeef2ac1409b1d0cce91f60391c1 100644
--- a/GeoLib/PointVec.cpp
+++ b/GeoLib/PointVec.cpp
@@ -14,7 +14,7 @@
 
 #include <numeric>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "PointVec.h"
 
@@ -111,7 +111,7 @@ PointVec::PointVec(
     }
 
     if (number_of_all_input_pnts > _data_vec->size())
-        WARN("PointVec::PointVec(): there are %d double points.",
+        WARN("PointVec::PointVec(): there are {:d} double points.",
              number_of_all_input_pnts - _data_vec->size());
 
     correctNameIDMapping();
@@ -149,7 +149,7 @@ void PointVec::push_back(Point* pnt, std::string const* const name)
     if (it != _name_id_map->end())
     {
         _id_to_name_map.emplace_back("");
-        WARN("PointVec::push_back(): two points share the name %s.",
+        WARN("PointVec::push_back(): two points share the name {:s}.",
              name->c_str());
         return;
     }
diff --git a/GeoLib/Polygon.cpp b/GeoLib/Polygon.cpp
index 37690defb2e17b155bf9d0063713d67c6c082944..7c01731b3028f2ce061a786af8161befbea62cdd 100644
--- a/GeoLib/Polygon.cpp
+++ b/GeoLib/Polygon.cpp
@@ -14,7 +14,6 @@
 
 #include "Polygon.h"
 
-#include <logog/include/logog.hpp>
 #include <boost/math/constants/constants.hpp>
 
 #include "BaseLib/quicksort.h"
diff --git a/GeoLib/Polyline.cpp b/GeoLib/Polyline.cpp
index d73db8ba10274ee6c383c5207b9dbd6d6facb9f6..f8976916064158a6ed4aed9eec6d435519f4e146 100644
--- a/GeoLib/Polyline.cpp
+++ b/GeoLib/Polyline.cpp
@@ -15,9 +15,9 @@
 #include "Polyline.h"
 
 #include <algorithm>
-#include <logog/include/logog.hpp>
-#include "BaseLib/Error.h"
 #include "AnalyticalGeometry.h"
+#include "BaseLib/Error.h"
+#include "BaseLib/Logging.h"
 #include "MathLib/GeometricBasics.h"
 
 namespace GeoLib
@@ -230,7 +230,10 @@ bool Polyline::isCoplanar() const
     {
         if (!MathLib::isCoplanar(p0, p1, p2, *this->getPoint(i)))
         {
-            DBUG ("Point %d is not coplanar to the first three points of the line.", i);
+            DBUG(
+                "Point {:d} is not coplanar to the first three points of the "
+                "line.",
+                i);
             return false;
         }
     }
@@ -590,7 +593,7 @@ bool containsEdge (const Polyline& ply, std::size_t id0, std::size_t id1)
 {
     if (id0 == id1)
     {
-        ERR("no valid edge id0 == id1 == %d.", id0);
+        ERR("no valid edge id0 == id1 == {:d}.", id0);
         return false;
     }
     if (id0 > id1)
diff --git a/GeoLib/QuadTree.h b/GeoLib/QuadTree.h
index 58a9eb75b92a796ac8078472066f794a69fb0d28..0ae7fda4190074631b4275d562f984044ad5d5be 100644
--- a/GeoLib/QuadTree.h
+++ b/GeoLib/QuadTree.h
@@ -17,9 +17,10 @@
 #include <cassert>
 #include <limits>
 #include <list>
-#include <logog/include/logog.hpp>
 #include <utility>
 
+#include "BaseLib/Logging.h"
+
 namespace GeoLib
 {
 /**
@@ -74,7 +75,16 @@ public:
             _ur[0] = _ll[0] + _ur[1] - _ll[1];
         }
 
-        DBUG("QuadTree(): lower left: (%f,%f,%f), upper right: (%f,%f,%f), depth: %d", _ll[0], _ll[1], _ll[2], _ur[0], _ur[1], _ur[2], _depth);
+        DBUG(
+            "QuadTree(): lower left: ({:f},{:f},{:f}), upper right: "
+            "({:f},{:f},{:f}), depth: {:d}",
+            _ll[0],
+            _ll[1],
+            _ll[2],
+            _ur[0],
+            _ur[1],
+            _ur[2],
+            _depth);
     }
 
     /**
diff --git a/GeoLib/Raster.cpp b/GeoLib/Raster.cpp
index a589c62459eaeee51439ca0966a724ecd7cecae6..7cdd4653a028405f54c7364d53184597aeff5835 100644
--- a/GeoLib/Raster.cpp
+++ b/GeoLib/Raster.cpp
@@ -13,8 +13,6 @@
 
 #include <fstream>
 
-#include <logog/include/logog.hpp>
-
 #include "Raster.h"
 
 // BaseLib
diff --git a/GeoLib/SensorData.cpp b/GeoLib/SensorData.cpp
index 693e26ecbe42fe5744f4ba08e74e20cc00f06fda..e254f5cf21f1675406b1a097ea640281882191ee 100644
--- a/GeoLib/SensorData.cpp
+++ b/GeoLib/SensorData.cpp
@@ -17,7 +17,7 @@
 #include <cstdlib>
 #include <fstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/StringTools.h"
 #include "BaseLib/DateTools.h"
@@ -85,8 +85,8 @@ const std::vector<float>* SensorData::getTimeSeries(SensorDataType time_series_n
             return _data_vecs[i];
         }
     }
-    ERR("Error in SensorData::getTimeSeries() - Time series '%d' not found.",
-        time_series_name);
+    ERR("Error in SensorData::getTimeSeries() - Time series '{:s}' not found.",
+        convertSensorDataType2String(time_series_name));
     return nullptr;
 }
 
@@ -96,7 +96,8 @@ int SensorData::readDataFromFile(const std::string &file_name)
 
     if (!in.is_open())
     {
-        INFO("SensorData::readDataFromFile() - Could not open file %s.", file_name.c_str());
+        INFO("SensorData::readDataFromFile() - Could not open file {:s}.",
+             file_name.c_str());
         return 0;
     }
 
diff --git a/GeoLib/Station.cpp b/GeoLib/Station.cpp
index 6dc8a71c260220393f3047149991b83ed349e63f..09304564edbbe49bbb7fc7f3f0112f932e771a76 100644
--- a/GeoLib/Station.cpp
+++ b/GeoLib/Station.cpp
@@ -17,7 +17,7 @@
 #include <cstdlib>
 #include <utility>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/StringTools.h"
 
diff --git a/GeoLib/StationBorehole.cpp b/GeoLib/StationBorehole.cpp
index 8682faa678911e16e89f1e4a7ef550a6ab1b70bf..9d859c80f7de54a50ed999daae35d48905e8353e 100644
--- a/GeoLib/StationBorehole.cpp
+++ b/GeoLib/StationBorehole.cpp
@@ -19,7 +19,7 @@
 #include <cstdlib>
 #include <fstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/StringTools.h"
 #include "BaseLib/DateTools.h"
diff --git a/GeoLib/Surface.cpp b/GeoLib/Surface.cpp
index cf8e002b80483d04f02b5c2773c53afad40756a0..28b7638ddcc220e95f953442719e50e51f1caf00 100644
--- a/GeoLib/Surface.cpp
+++ b/GeoLib/Surface.cpp
@@ -9,8 +9,6 @@
 
 #include <list>
 
-#include <logog/include/logog.hpp>
-
 #include "Surface.h"
 
 // GeoLib
diff --git a/GeoLib/SurfaceGrid.cpp b/GeoLib/SurfaceGrid.cpp
index 48bbf28a9f251dad51dbc38112ec5cb13b716f1a..2118db1e9fc49c1decf3d87326304533bacf017b 100644
--- a/GeoLib/SurfaceGrid.cpp
+++ b/GeoLib/SurfaceGrid.cpp
@@ -14,7 +14,7 @@
 #include <algorithm>
 #include <bitset>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Error.h"
 
@@ -127,10 +127,11 @@ void SurfaceGrid::sortTrianglesInGridCells(Surface const*const sfc)
             Point const& p0(*((*sfc)[l]->getPoint(0)));
             Point const& p1(*((*sfc)[l]->getPoint(1)));
             Point const& p2(*((*sfc)[l]->getPoint(2)));
-            ERR("Sorting triangle %d [(%f,%f,%f), (%f,%f,%f), (%f,%f,%f) into "
+            ERR("Sorting triangle {:d} [({:f},{:f},{:f}), ({:f},{:f},{:f}), "
+                "({:f},{:f},{:f}) into "
                 "grid.",
-                l, p0[0], p0[1], p0[2], p1[0], p1[1], p1[2], p2[0], p2[1], p2[2]
-            );
+                l, p0[0], p0[1], p0[2], p1[0], p1[1], p1[2], p2[0], p2[1],
+                p2[2]);
             OGS_FATAL("");
         }
     }
@@ -190,8 +191,11 @@ SurfaceGrid::getGridCellCoordinates(MathLib::Point3d const& p) const
     }};
 
     if (coords[0]>=_n_steps[0] || coords[1]>=_n_steps[1] || coords[2]>=_n_steps[2]) {
-        DBUG("Computed indices (%d,%d,%d), max grid cell indices (%d,%d,%d)",
-            coords[0], coords[1], coords[2], _n_steps[0], _n_steps[1], _n_steps[2]);
+        DBUG(
+            "Computed indices ({:d},{:d},{:d}), max grid cell indices "
+            "({:d},{:d},{:d})",
+            coords[0], coords[1], coords[2], _n_steps[0], _n_steps[1],
+            _n_steps[2]);
         return boost::optional<std::array<std::size_t, 3>>();
     }
     return boost::optional<std::array<std::size_t, 3>>(coords);
diff --git a/GeoLib/TemplateVec.h b/GeoLib/TemplateVec.h
index 57c00822cee2db1e3823a7651bdcbfde3e579b16..0d29410f17ebbca6fa6f91772296a83e2815e590 100644
--- a/GeoLib/TemplateVec.h
+++ b/GeoLib/TemplateVec.h
@@ -22,7 +22,7 @@
 #include <utility>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Error.h"
 
@@ -204,7 +204,7 @@ public:
             _name_id_map->insert(NameIdPair(*name, _data_vec->size() - 1));
         } else {
             WARN(
-                "Name '%s' exists already. The object will be inserted "
+                "Name '{:s}' exists already. The object will be inserted "
                 "without a name",
                 name->c_str());
         }
diff --git a/MaterialLib/Adsorption/Adsorption.cpp b/MaterialLib/Adsorption/Adsorption.cpp
index 4461066a81af0dde7fd3cdf4ad936a4f22a93ec8..c7769841885bda55fe36b922c0eb586b4498bbf6 100644
--- a/MaterialLib/Adsorption/Adsorption.cpp
+++ b/MaterialLib/Adsorption/Adsorption.cpp
@@ -8,7 +8,7 @@
  */
 
 #include "Adsorption.h"
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 #include "MaterialLib/PhysicalConstant.h"
 
 namespace {
@@ -126,7 +126,8 @@ double AdsorptionReaction::getEntropy(const double T_Ads, const double A) const
 
     if (W_p <= 0.0 || W_m <= 0.0)
     {
-        ERR("characteristic curve in negative region (W-, W+): %g, %g", W_m, W_p);
+        ERR("characteristic curve in negative region (W-, W+): {:g}, {:g}", W_m,
+            W_p);
         return 0.0;
     }
 
diff --git a/MaterialLib/Adsorption/Reaction.cpp b/MaterialLib/Adsorption/Reaction.cpp
index 70bc4246d6e3c0b69230667e2bfe058dad3cb2b6..3ee1739c8923327ef78927950a4f6f92c18c4f66 100644
--- a/MaterialLib/Adsorption/Reaction.cpp
+++ b/MaterialLib/Adsorption/Reaction.cpp
@@ -7,7 +7,7 @@
  *              http://www.opengeosys.org/project/license
  */
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/StringTools.h"
 
@@ -82,7 +82,7 @@ newInstance(BaseLib::ConfigTree const& conf)
         return std::make_unique<ReactionCaOH2>(conf);
     }
 
-    OGS_FATAL("Unknown reactive system: %s.", type.c_str());
+    OGS_FATAL("Unknown reactive system: {:s}.", type.c_str());
 
     return nullptr;
 }
diff --git a/MaterialLib/Adsorption/ReactionCaOH2.cpp b/MaterialLib/Adsorption/ReactionCaOH2.cpp
index 9279cfd256df1f6d41a906e3e91ead94671619e2..9bd1f3564974319ae7a350bfe64b748a0ce60b62 100644
--- a/MaterialLib/Adsorption/ReactionCaOH2.cpp
+++ b/MaterialLib/Adsorption/ReactionCaOH2.cpp
@@ -9,10 +9,10 @@
 
 #include "ReactionCaOH2.h"
 #include <cassert>
-#include <logog/include/logog.hpp>
+#include "Adsorption.h"
 #include "BaseLib/Error.h"
+#include "BaseLib/Logging.h"
 #include "MaterialLib/PhysicalConstant.h"
-#include "Adsorption.h"
 
 namespace Adsorption
 {
diff --git a/MaterialLib/Adsorption/ReactionSinusoidal.h b/MaterialLib/Adsorption/ReactionSinusoidal.h
index 9ecd5ddeb1810da3eef4ad203efecb0ad30337b6..0282d81370a3ea50c529c7b32f7754bb518d369d 100644
--- a/MaterialLib/Adsorption/ReactionSinusoidal.h
+++ b/MaterialLib/Adsorption/ReactionSinusoidal.h
@@ -9,7 +9,7 @@
 
 #pragma once
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Reaction.h"
 #include "BaseLib/ConfigTree.h"
diff --git a/MaterialLib/CMakeLists.txt b/MaterialLib/CMakeLists.txt
index 69ba77725b8f775800327b4ac5c6083a3d7b6fcb..e52f9fda620cc2ff2a08e4b75084ecc2ffc8861f 100644
--- a/MaterialLib/CMakeLists.txt
+++ b/MaterialLib/CMakeLists.txt
@@ -40,7 +40,8 @@ include(GenerateExportHeader)
 generate_export_header(MaterialLib)
 target_include_directories(MaterialLib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
 
-target_link_libraries(MaterialLib PRIVATE MathLib MeshLib ParameterLib)
+target_link_libraries(MaterialLib PRIVATE MathLib MeshLib ParameterLib
+    spdlog::spdlog)
 
 if(OGS_USE_MFRONT)
     target_link_libraries(MaterialLib PUBLIC MaterialLib_SolidModels_MFront)
diff --git a/MaterialLib/Fluid/Density/CreateFluidDensityModel.cpp b/MaterialLib/Fluid/Density/CreateFluidDensityModel.cpp
index 762b09c196f710a32413f4218dcde539e31d462f..8d52f12c675d26322b62c8a75fbf5f53d99069df 100644
--- a/MaterialLib/Fluid/Density/CreateFluidDensityModel.cpp
+++ b/MaterialLib/Fluid/Density/CreateFluidDensityModel.cpp
@@ -168,7 +168,7 @@ std::unique_ptr<FluidProperty> createFluidDensityModel(
     }
 
     OGS_FATAL(
-        "The density type %s is unavailable.\n"
+        "The density type {:s} is unavailable.\n"
         "The available types are: \n\tConstant, \n\tLiquidDensity, "
         "\n\tTemperatureDependent, \n\tIdealGasLaw."
         "\n\tWaterDensityIAPWSIF97Region1\n",
diff --git a/MaterialLib/Fluid/SpecificHeatCapacity/CreateSpecificFluidHeatCapacityModel.cpp b/MaterialLib/Fluid/SpecificHeatCapacity/CreateSpecificFluidHeatCapacityModel.cpp
index 355a0fbeb982e54c72be2ce3cd0cfca205388211..289a011c9f8f610e466e48fdda9066ff9ee899f5 100644
--- a/MaterialLib/Fluid/SpecificHeatCapacity/CreateSpecificFluidHeatCapacityModel.cpp
+++ b/MaterialLib/Fluid/SpecificHeatCapacity/CreateSpecificFluidHeatCapacityModel.cpp
@@ -37,7 +37,7 @@ std::unique_ptr<FluidProperty> createSpecificFluidHeatCapacityModel(
     // TODO: add more models
 
     OGS_FATAL(
-        "The specific heat capacity type %s is unavailable.\n"
+        "The specific heat capacity type {:s} is unavailable.\n"
         "The available type is \n\tConstant\n",
         type.data());
 }
diff --git a/MaterialLib/Fluid/ThermalConductivity/CreateFluidThermalConductivityModel.cpp b/MaterialLib/Fluid/ThermalConductivity/CreateFluidThermalConductivityModel.cpp
index 4dbb1d33dd4c83384618e28460d77546a7b24b70..55a4e4c9ba99cb78e55c22a4578314fed9ac3e84 100644
--- a/MaterialLib/Fluid/ThermalConductivity/CreateFluidThermalConductivityModel.cpp
+++ b/MaterialLib/Fluid/ThermalConductivity/CreateFluidThermalConductivityModel.cpp
@@ -37,7 +37,7 @@ std::unique_ptr<FluidProperty> createFluidThermalConductivityModel(
     // TODO: add more models
 
     OGS_FATAL(
-        "The viscosity type %s is unavailable.\n"
+        "The viscosity type {:s} is unavailable.\n"
         "The available type is \n\tConstant\n",
         type.data());
 }
diff --git a/MaterialLib/Fluid/Viscosity/CreateViscosityModel.cpp b/MaterialLib/Fluid/Viscosity/CreateViscosityModel.cpp
index 9cfd71b9305b00118096d46b3a5805ae4d9b6768..7e1e1f916233356c5bb9ba163e3f3b44d4467ada 100644
--- a/MaterialLib/Fluid/Viscosity/CreateViscosityModel.cpp
+++ b/MaterialLib/Fluid/Viscosity/CreateViscosityModel.cpp
@@ -131,7 +131,7 @@ std::unique_ptr<FluidProperty> createViscosityModel(
         }
 
         OGS_FATAL(
-            "The fluid type %s for Vogels model is unavailable.\n"
+            "The fluid type {:s} for Vogels model is unavailable.\n"
             "The available fluid types are Water, CO2 and CH4\n",
             fluid_type.data());
     }
@@ -143,7 +143,7 @@ std::unique_ptr<FluidProperty> createViscosityModel(
     }
 
     OGS_FATAL(
-        "The viscosity type %s is unavailable.\n"
+        "The viscosity type {:s} is unavailable.\n"
         "The available types are \n\tConstant, \n\tLinearPressure "
         "\n\tTemperatureDependent, \n\tVogels\n",
         type.data());
diff --git a/MaterialLib/FractureModels/Coulomb.cpp b/MaterialLib/FractureModels/Coulomb.cpp
index 4db3b9e11f1db9f7e23703b8058d784b1627abf3..8b91ff246d5495ca5f88cf22cd4eddd314ae3214 100644
--- a/MaterialLib/FractureModels/Coulomb.cpp
+++ b/MaterialLib/FractureModels/Coulomb.cpp
@@ -171,7 +171,7 @@ void Coulomb<DisplacementDim>::computeConstitutiveRelation(
 
         auto const update_solution = [&](ResidualVectorType const& increment) {
             solution += increment;
-            /*DBUG("analytical = %g",
+            /*DBUG("analytical = {:g}",
                  Fs / (mat.Ks + mat.Kn * std::tan(mat.psi) * std::tan(mat.phi)))
                  */
             state.w_p = state.w_p_prev +
diff --git a/MaterialLib/FractureModels/Permeability/CreateConstantPermeability.cpp b/MaterialLib/FractureModels/Permeability/CreateConstantPermeability.cpp
index 31232955fea89f6fec9aacbbf68550d4878da608..50482028aa8407751920de673cf00ce1722078dd 100644
--- a/MaterialLib/FractureModels/Permeability/CreateConstantPermeability.cpp
+++ b/MaterialLib/FractureModels/Permeability/CreateConstantPermeability.cpp
@@ -28,7 +28,8 @@ std::unique_ptr<Permeability> createConstantPermeability(
     if (permeability < 0)
     {
         OGS_FATAL(
-            "The permeability parameter must be non-negative. Given value %g.",
+            "The permeability parameter must be non-negative. Given value "
+            "{:g}.",
             permeability);
     }
 
diff --git a/MaterialLib/FractureModels/Permeability/CreatePermeabilityModel.cpp b/MaterialLib/FractureModels/Permeability/CreatePermeabilityModel.cpp
index 0f5d5daae9cdf684001894e97f9aa37298f7f030..55b26532630a442f831f8871c9812c8aba63e6a0 100644
--- a/MaterialLib/FractureModels/Permeability/CreatePermeabilityModel.cpp
+++ b/MaterialLib/FractureModels/Permeability/CreatePermeabilityModel.cpp
@@ -32,7 +32,7 @@ std::unique_ptr<Permeability> createPermeabilityModel(
     {
         return MaterialLib::Fracture::Permeability::createCubicLaw(config);
     }
-    OGS_FATAL("Unknown fracture permeability model type \"%s\".",
+    OGS_FATAL("Unknown fracture permeability model type \"{:s}\".",
               permeability_model_type.c_str());
 }
 }  // namespace MaterialLib::Fracture::Permeability
diff --git a/MaterialLib/MPL/Component.h b/MaterialLib/MPL/Component.h
index 05aaca3c6dd6505e50595ad40946c3f4018bb363..3305b0facb836dd08f31d503a7b537d46ad6a712 100644
--- a/MaterialLib/MPL/Component.h
+++ b/MaterialLib/MPL/Component.h
@@ -93,7 +93,7 @@ void checkRequiredProperties(Component const& c,
     {
         if (!c.hasProperty(p))
         {
-            OGS_FATAL("The property '%s' is missing in the component '%s'.",
+            OGS_FATAL("The property '{:s}' is missing in the component '{:s}'.",
                       property_enum_to_string[p].c_str(), c.name.c_str());
         }
     }
diff --git a/MaterialLib/MPL/CreateComponent.cpp b/MaterialLib/MPL/CreateComponent.cpp
index 1014b57be6503f36023d40eaeb27e2db7530f195..e41d46f8db6ccc2963c9f2b58e101ab38c2c6231 100644
--- a/MaterialLib/MPL/CreateComponent.cpp
+++ b/MaterialLib/MPL/CreateComponent.cpp
@@ -97,8 +97,9 @@ std::vector<std::unique_ptr<Component>> createComponents(
                              return c->name == component_name;
                          }) != components.end())
         {
-            OGS_FATAL("Found duplicates with the same component name tag '%s'.",
-                      component->name.c_str());
+            OGS_FATAL(
+                "Found duplicates with the same component name tag '{:s}'.",
+                component->name.c_str());
         }
 
         components.push_back(std::move(component));
diff --git a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
index f4e31dc2700a401330c00cc47ec8a0f76bedc792..15e2b79efdfe83bb89614502270ed981a020f3bd 100644
--- a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
+++ b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
@@ -29,17 +29,19 @@ createMaterialSpatialDistributionMap(
     if (max_material_id > static_cast<int>(media.size() - 1))
     {
         WARN(
-            "The maximum value of MaterialIDs in mesh is %d. As the given "
-            "number of porous media definitions in the project file is %d, the "
-            "maximum value of MaterialIDs in mesh must be %d (index starts "
+            "The maximum value of MaterialIDs in mesh is {:d}. As the given "
+            "number of porous media definitions in the project file is {:d}, "
+            "the "
+            "maximum value of MaterialIDs in mesh must be {:d} (index starts "
             "with zero).",
             max_material_id, media.size(), max_material_id - 1);
     }
 
     if (max_material_id < static_cast<int>(media.size() - 1))
         WARN(
-            "There are %d porous medium definitions in the project file but "
-            "only %d different values in the MaterialIDs vector/data_array in "
+            "There are {:d} porous medium definitions in the project file but "
+            "only {:d} different values in the MaterialIDs vector/data_array "
+            "in "
             "the mesh.",
             media.size(), max_material_id - 1);
 
diff --git a/MaterialLib/MPL/CreatePhase.cpp b/MaterialLib/MPL/CreatePhase.cpp
index 234d85f1bea70d4948c4a45abd773e29f1a55ec5..2cb89190c327b2eba33d858b125bf1de98036553 100644
--- a/MaterialLib/MPL/CreatePhase.cpp
+++ b/MaterialLib/MPL/CreatePhase.cpp
@@ -56,7 +56,7 @@ std::unique_ptr<MaterialPropertyLib::Phase> createPhase(
         {
             ERR(type.c_str());
         }
-        OGS_FATAL("Wrong phase type '%s' given.", phase_type.c_str());
+        OGS_FATAL("Wrong phase type '{:s}' given.", phase_type.c_str());
     }
 
     // Parsing of optional components.
@@ -75,7 +75,7 @@ std::unique_ptr<MaterialPropertyLib::Phase> createPhase(
     {
         OGS_FATAL(
             "Neither tag <components> nor tag <properties> has been set for "
-            "the phase '%s'.",
+            "the phase '{:s}'.",
             phase_type.c_str());
     }
 
@@ -114,7 +114,7 @@ std::vector<std::unique_ptr<Phase>> createPhases(
                              return p->name == phase_name;
                          }) != phases.end())
         {
-            OGS_FATAL("Found duplicates with the same phase name tag '%s'.",
+            OGS_FATAL("Found duplicates with the same phase name tag '{:s}'.",
                       phase->name.c_str());
         }
 
diff --git a/MaterialLib/MPL/CreateProperty.cpp b/MaterialLib/MPL/CreateProperty.cpp
index 90d7d0b978b1efece4d9bf0a141df5397ec87670..85458e860943babf28e7f02147d1385bd448506d 100644
--- a/MaterialLib/MPL/CreateProperty.cpp
+++ b/MaterialLib/MPL/CreateProperty.cpp
@@ -135,7 +135,7 @@ std::unique_ptr<MaterialPropertyLib::Property> createProperty(
     }
 
     // If none of the above property types are found, OGS throws an error.
-    OGS_FATAL("The specified component property type '%s' was not recognized",
+    OGS_FATAL("The specified component property type '{:s}' was not recognized",
               property_type.c_str());
 }
 }  // namespace
diff --git a/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp b/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp
index f44b07644ffa1589b7385b71a05f0e1c63dd5049..7f122ceb1babdc3e4785edfa9fb61857cbf1e4b6 100644
--- a/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp
+++ b/MaterialLib/MPL/MaterialSpatialDistributionMap.cpp
@@ -38,9 +38,9 @@ void MaterialSpatialDistributionMap::checkElementHasMedium(std::size_t const ele
     if (_media.find(material_id) == _media.end())
     {
         OGS_FATAL(
-                "There is no medium definition for element %d with material "
-                "ID %d. Please define a medium for each material.",
-                element_id, material_id);
+            "There is no medium definition for element {:d} with material "
+            "ID {:d}. Please define a medium for each material.",
+            element_id, material_id);
     }
 }
 
diff --git a/MaterialLib/MPL/Medium.h b/MaterialLib/MPL/Medium.h
index f3defca3d60a1098ac4f41445d47637fd14c6681..58355279ce2745a34c47d51cd9e4bf001e207fd6 100644
--- a/MaterialLib/MPL/Medium.h
+++ b/MaterialLib/MPL/Medium.h
@@ -97,8 +97,9 @@ void checkRequiredProperties(Medium const& medium,
     {
         if (!medium.hasProperty(p))
         {
-            OGS_FATAL("The property '%s' is missing in the medium definition.",
-                      property_enum_to_string[p].c_str());
+            OGS_FATAL(
+                "The property '{:s}' is missing in the medium definition.",
+                property_enum_to_string[p].c_str());
         }
     }
 }
diff --git a/MaterialLib/MPL/Phase.h b/MaterialLib/MPL/Phase.h
index 140c42f672236258213da6d02551d5969985033c..feba1546d5f1579ae3342f0ab28d49a661933a80 100644
--- a/MaterialLib/MPL/Phase.h
+++ b/MaterialLib/MPL/Phase.h
@@ -72,7 +72,7 @@ void checkRequiredProperties(Phase const& phase, Container const& required_prope
     {
         if (!phase.hasProperty(p))
         {
-            OGS_FATAL("The property '%s' is missing in the %s phase.",
+            OGS_FATAL("The property '{:s}' is missing in the {:s} phase.",
                       property_enum_to_string[p].c_str(), phase.name.c_str());
         }
     }
diff --git a/MaterialLib/MPL/Properties/CapillaryPressureSaturation/SaturationVanGenuchten.cpp b/MaterialLib/MPL/Properties/CapillaryPressureSaturation/SaturationVanGenuchten.cpp
index e4e01bb5891a272b6cbf51c2b9be973ba2512163..4a2e23f8c8b12f3b2e85758e20b373916df5c5e6 100644
--- a/MaterialLib/MPL/Properties/CapillaryPressureSaturation/SaturationVanGenuchten.cpp
+++ b/MaterialLib/MPL/Properties/CapillaryPressureSaturation/SaturationVanGenuchten.cpp
@@ -30,7 +30,7 @@ SaturationVanGenuchten::SaturationVanGenuchten(
     if (!(_m > 0 && _m < 1))
     {
         OGS_FATAL(
-            "The exponent value m = %g of van Genuchten saturation model, is "
+            "The exponent value m = {:g} of van Genuchten saturation model, is "
             "out of its range of (0, 1)",
             _m);
     }
diff --git a/MaterialLib/MPL/Properties/CreateCurveProperty.cpp b/MaterialLib/MPL/Properties/CreateCurveProperty.cpp
index c22dbafa9d4942b9b1be7861bc15700122b311a0..337a22fba0a75980d279f142a1f6963a4ffad7f4 100644
--- a/MaterialLib/MPL/Properties/CreateCurveProperty.cpp
+++ b/MaterialLib/MPL/Properties/CreateCurveProperty.cpp
@@ -30,7 +30,7 @@ std::unique_ptr<CurveProperty> createCurveProperty(
 
     //! \ogs_file_param{properties__property__Curve__curve}
     auto curve_name = config.getConfigParameter<std::string>("curve");
-    DBUG("Using curve '%s'", curve_name.c_str());
+    DBUG("Using curve '{:s}'", curve_name.c_str());
 
     auto const& curve =
         *BaseLib::getOrError(curves, curve_name, "Could not find curve.");
@@ -38,7 +38,7 @@ std::unique_ptr<CurveProperty> createCurveProperty(
     auto const independent_variable_string =
         //! \ogs_file_param{properties__property__Curve__independent_variable}
         config.getConfigParameter<std::string>("independent_variable");
-    DBUG("Using independent_variable '%s'",
+    DBUG("Using independent_variable '{:s}'",
          independent_variable_string.c_str());
     auto const independent_variable =
         MaterialPropertyLib::convertStringToVariable(
diff --git a/MaterialLib/MPL/Properties/CreatePermeabilityOrthotropicPowerLaw.cpp b/MaterialLib/MPL/Properties/CreatePermeabilityOrthotropicPowerLaw.cpp
index 092d9b4f8b111ca26ee094e8758db6e090ad7736..9bd132b8b170672e36f6c4d53270b4f23cf3bd3f 100644
--- a/MaterialLib/MPL/Properties/CreatePermeabilityOrthotropicPowerLaw.cpp
+++ b/MaterialLib/MPL/Properties/CreatePermeabilityOrthotropicPowerLaw.cpp
@@ -31,7 +31,7 @@ std::unique_ptr<Property> createPermeabilityOrthotropicPowerLaw(
     {
         OGS_FATAL(
             "The number of intrinsic permeabilities must be two or three, but "
-            "%d were given.",
+            "{:d} were given.",
             intrinsic_permeabilities.size());
     }
 
@@ -42,7 +42,8 @@ std::unique_ptr<Property> createPermeabilityOrthotropicPowerLaw(
     if (exponents.size() != 3 && exponents.size() != 2)
     {
         OGS_FATAL(
-            "The number of exponents must be two or three, but %d were given.",
+            "The number of exponents must be two or three, but {:d} were "
+            "given.",
             exponents.size());
     }
 
@@ -50,7 +51,7 @@ std::unique_ptr<Property> createPermeabilityOrthotropicPowerLaw(
     {
         OGS_FATAL(
             "The number of intrinsic permeabilities and exponents must be "
-            "equal, but they are %d and %d, respectively.",
+            "equal, but they are {:d} and {:d}, respectively.",
             intrinsic_permeabilities.size(), exponents.size());
     }
 
diff --git a/MaterialLib/MPL/Properties/CreateSaturationDependentSwelling.cpp b/MaterialLib/MPL/Properties/CreateSaturationDependentSwelling.cpp
index d5395a5fa4475d3eaf4236daf2a7e2075e4293bb..f0226ae89bc61bdbb1495537f25a67bb57c5606f 100644
--- a/MaterialLib/MPL/Properties/CreateSaturationDependentSwelling.cpp
+++ b/MaterialLib/MPL/Properties/CreateSaturationDependentSwelling.cpp
@@ -28,7 +28,7 @@ std::unique_ptr<SaturationDependentSwelling> createSaturationDependentSwelling(
     if (swelling_pressures.size() != 3)
     {
         OGS_FATAL(
-            "The number of swelling pressures must be three, but %d were "
+            "The number of swelling pressures must be three, but {:d} were "
             "given.",
             swelling_pressures.size());
     }
@@ -39,7 +39,7 @@ std::unique_ptr<SaturationDependentSwelling> createSaturationDependentSwelling(
 
     if (exponents.size() != 3)
     {
-        OGS_FATAL("The number of exponents must be three, but %d were given.",
+        OGS_FATAL("The number of exponents must be three, but {:d} were given.",
                   exponents.size());
     }
 
@@ -47,7 +47,7 @@ std::unique_ptr<SaturationDependentSwelling> createSaturationDependentSwelling(
     {
         OGS_FATAL(
             "The number of swelling pressures and exponents must be equal, but "
-            "they are %d and %d, respectively.",
+            "they are {:d} and {:d}, respectively.",
             swelling_pressures.size(), exponents.size());
     }
 
diff --git a/MaterialLib/MPL/Properties/PermeabilityOrthotropicPowerLaw.cpp b/MaterialLib/MPL/Properties/PermeabilityOrthotropicPowerLaw.cpp
index 21cf8c38c4bdc5eb7ad1cfe00c29cf091c8059a1..25abb24255c9c96767b57d092f6bd6ae7576fe11 100644
--- a/MaterialLib/MPL/Properties/PermeabilityOrthotropicPowerLaw.cpp
+++ b/MaterialLib/MPL/Properties/PermeabilityOrthotropicPowerLaw.cpp
@@ -42,7 +42,7 @@ void PermeabilityOrthotropicPowerLaw<DisplacementDim>::setScale(
         {
             OGS_FATAL(
                 "The property 'PermeabilityOrthotropicPowerLaw' must be "
-                "given in the 'Solid' phase, not in '%s' phase.",
+                "given in the 'Solid' phase, not in '{:s}' phase.",
                 _phase->name.c_str());
         }
     }
diff --git a/MaterialLib/MPL/Properties/PorosityFromMassBalance.cpp b/MaterialLib/MPL/Properties/PorosityFromMassBalance.cpp
index d6889fdb435ca955389b7fc283cd06c4f65f4d44..4b7a31d83247b7d54afffa1440fcd8622f4c41a1 100644
--- a/MaterialLib/MPL/Properties/PorosityFromMassBalance.cpp
+++ b/MaterialLib/MPL/Properties/PorosityFromMassBalance.cpp
@@ -26,7 +26,7 @@ void PorosityFromMassBalance::setScale(
         {
             OGS_FATAL(
                 "The property 'PorosityFromMassBalance' must be "
-                "given in the 'Solid' phase, not in '%s' phase.",
+                "given in the 'Solid' phase, not in '{:s}' phase.",
                 _phase->name.c_str());
         }
     }
diff --git a/MaterialLib/MPL/Properties/RelativePermeability/RelPermVanGenuchten.cpp b/MaterialLib/MPL/Properties/RelativePermeability/RelPermVanGenuchten.cpp
index 9161df966dca9a829273878c37f8c080766835b5..7cc97329c940c8737a4d33a2cd7ea5050ff19478 100644
--- a/MaterialLib/MPL/Properties/RelativePermeability/RelPermVanGenuchten.cpp
+++ b/MaterialLib/MPL/Properties/RelativePermeability/RelPermVanGenuchten.cpp
@@ -30,8 +30,8 @@ RelPermVanGenuchten::RelPermVanGenuchten(
     if (!(_m > 0 && _m < 1))
     {
         OGS_FATAL(
-            "The exponent value m = %g of van Genuchten relative permeability "
-            "model, is out of its range of (0, 1)",
+            "The exponent value m = {:g} of van Genuchten relative "
+            "permeability model, is out of its range of (0, 1)",
             _m);
     }
 }
diff --git a/MaterialLib/MPL/Properties/SaturationDependentSwelling.cpp b/MaterialLib/MPL/Properties/SaturationDependentSwelling.cpp
index a36343200f8da5ade7b581aaa822cd2117af4615..3c89e83b674c606e32381f7418cd5d307bee631c 100644
--- a/MaterialLib/MPL/Properties/SaturationDependentSwelling.cpp
+++ b/MaterialLib/MPL/Properties/SaturationDependentSwelling.cpp
@@ -42,7 +42,7 @@ void SaturationDependentSwelling::setScale(
         {
             OGS_FATAL(
                 "The property 'SaturationDependentSwelling' must be "
-                "given in the 'Solid' phase, not in '%s' phase.",
+                "given in the 'Solid' phase, not in '{:s}' phase.",
                 _phase->name.c_str());
         }
     }
diff --git a/MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp b/MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp
index e15ee0ae0c12022b82ab31f3986ef598fda7c77b..25e06ce87cc20c00cf7466fd8640aaaf100e4642 100644
--- a/MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp
+++ b/MaterialLib/MPL/Properties/TransportPorosityFromMassBalance.cpp
@@ -26,7 +26,7 @@ void TransportPorosityFromMassBalance::setScale(
         {
             OGS_FATAL(
                 "The property 'TransportPorosityFromMassBalance' must be "
-                "given in the 'Solid' phase, not in '%s' phase.",
+                "given in the 'Solid' phase, not in '{:s}' phase.",
                 _phase->name.c_str());
         }
     }
diff --git a/MaterialLib/MPL/Property.cpp b/MaterialLib/MPL/Property.cpp
index 6e4e1aa9e16d6a7987ee641e4ffff3855820827f..829814d516f89b3ecd8a013cebd40b061cfe6a1e 100644
--- a/MaterialLib/MPL/Property.cpp
+++ b/MaterialLib/MPL/Property.cpp
@@ -51,7 +51,7 @@ PropertyDataType fromVector(std::vector<double> const& values)
         default:
         {
             OGS_FATAL(
-                "Conversion of a %d-vector to PropertyDataType is not "
+                "Conversion of a {:d}-vector to PropertyDataType is not "
                 "implemented.",
                 values.size());
         }
diff --git a/MaterialLib/MPL/PropertyType.h b/MaterialLib/MPL/PropertyType.h
index 61daf950eea0a54ab3c28905680cded1b63222d8..3b44b4c59182101648139173558e2d6c67cd09a0 100644
--- a/MaterialLib/MPL/PropertyType.h
+++ b/MaterialLib/MPL/PropertyType.h
@@ -270,7 +270,7 @@ inline PropertyType convertStringToProperty(std::string const& inString)
     }
 
     OGS_FATAL(
-        "The property name '%s' does not correspond to any known property",
+        "The property name '{:s}' does not correspond to any known property",
         inString.c_str());
 
     return PropertyType::number_of_properties;  // to avoid the 'no return'
diff --git a/MaterialLib/MPL/Utils/FormEigenTensor.cpp b/MaterialLib/MPL/Utils/FormEigenTensor.cpp
index 1628825b1284568de6019581c6dae0e46cc69c5d..4d90d3314994cdacc3db76a85e2f3b02de213ea4 100644
--- a/MaterialLib/MPL/Utils/FormEigenTensor.cpp
+++ b/MaterialLib/MPL/Utils/FormEigenTensor.cpp
@@ -31,7 +31,7 @@ struct FormEigenTensor
         {
             return values.asDiagonal();
         }
-        OGS_FATAL("Cannot convert 2d vector to %dx%d diagonal matrix.",
+        OGS_FATAL("Cannot convert 2d vector to {:d}x{:d} diagonal matrix.",
                   GlobalDim, GlobalDim);
     }
 
@@ -42,7 +42,7 @@ struct FormEigenTensor
         {
             return values.asDiagonal();
         }
-        OGS_FATAL("Cannot convert 3d vector to %dx%d diagonal matrix.",
+        OGS_FATAL("Cannot convert 3d vector to {:d}x{:d} diagonal matrix.",
                   GlobalDim, GlobalDim);
     }
 
@@ -52,7 +52,7 @@ struct FormEigenTensor
         if constexpr (GlobalDim == 2) {
             return values;
         }
-        OGS_FATAL("Cannot convert a 2d tensor to %dx%d matrix", GlobalDim,
+        OGS_FATAL("Cannot convert a 2d tensor to {:d}x{:d} matrix", GlobalDim,
                   GlobalDim);
     }
     Eigen::Matrix<double, GlobalDim, GlobalDim> operator()(
@@ -61,7 +61,7 @@ struct FormEigenTensor
         if constexpr (GlobalDim == 3) {
             return values;
         }
-        OGS_FATAL("Cannot convert a 3d tensor to %dx%d matrix", GlobalDim,
+        OGS_FATAL("Cannot convert a 3d tensor to {:d}x{:d} matrix", GlobalDim,
                   GlobalDim);
     }
 
@@ -92,7 +92,7 @@ struct FormEigenTensor
             return result;
         }
 
-        OGS_FATAL("Cannot convert a symmetric 3d tensor to %dx%d matrix",
+        OGS_FATAL("Cannot convert a symmetric 3d tensor to {:d}x{:d} matrix",
                   GlobalDim);
     }
 };
diff --git a/MaterialLib/MPL/VariableType.cpp b/MaterialLib/MPL/VariableType.cpp
index 4b048981c0330f04b179cca8f1336e43fdc52ebe..a93a464ef6cacef0e914769466186237ab4b0d43 100644
--- a/MaterialLib/MPL/VariableType.cpp
+++ b/MaterialLib/MPL/VariableType.cpp
@@ -46,7 +46,7 @@ Variable convertStringToVariable(std::string const& input)
     }
 
     OGS_FATAL(
-        "The variable name '%s' does not correspond to any known variable",
+        "The variable name '{:s}' does not correspond to any known variable",
         input.c_str());
 
     return Variable::number_of_variables;  // to avoid the 'no return' warning
diff --git a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
index bfbe3030d795ea9051e4f636e9fc182b939df2dc..2bbf1a2075654e8784b6f17f6fd2b46857c85cfc 100644
--- a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
+++ b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
@@ -84,17 +84,19 @@ PorousMediaProperties createPorousMediaProperties(
     if (max_material_id > static_cast<int>(mat_ids.size() - 1))
     {
         OGS_FATAL(
-            "The maximum value of MaterialIDs in mesh is %d. As the "
+            "The maximum value of MaterialIDs in mesh is {:d}. As the "
             "given number of porous media definitions in the project "
-            "file is %d, the maximum value of MaterialIDs in mesh must be %d "
+            "file is {:d}, the maximum value of MaterialIDs in mesh must be "
+            "{:d} "
             "(index starts with zero).",
             max_material_id, mat_ids.size(), max_material_id - 1);
     }
 
     if (max_material_id < static_cast<int>(mat_ids.size() - 1))
         WARN(
-            "There are %d porous medium definitions in the project file but "
-            "only %d different values in the MaterialIDs vector/data_array in "
+            "There are {:d} porous medium definitions in the project file but "
+            "only {:d} different values in the MaterialIDs vector/data_array "
+            "in "
             "the mesh.",
             mat_ids.size(), max_material_id - 1);
 
diff --git a/MaterialLib/PorousMedium/Permeability/Permeability.h b/MaterialLib/PorousMedium/Permeability/Permeability.h
index e3275f332d275edbfc35a30972ba7bbd7963c972..612e89bcd0928162ab74eee14cd22e9da62e4613 100644
--- a/MaterialLib/PorousMedium/Permeability/Permeability.h
+++ b/MaterialLib/PorousMedium/Permeability/Permeability.h
@@ -33,8 +33,8 @@ public:
             _dimension * _dimension)
         {
             OGS_FATAL(
-                "The given parameter has %d components, but the permeability "
-                "tensor is defined for a %d dimensional problem.",
+                "The given parameter has {:d} components, but the permeability "
+                "tensor is defined for a {:d} dimensional problem.",
                 permeability_parameter.getNumberOfComponents(), _dimension);
         }
     }
diff --git a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp
index 229570dfe709fbea377fee6ab575c85c78e89a92..88e116358651136c83e387ec2c06f0fb8fee598c 100644
--- a/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp
+++ b/MaterialLib/PorousMedium/Permeability/createPermeabilityModel.cpp
@@ -48,8 +48,8 @@ std::unique_ptr<Permeability> createPermeabilityModel(
             dimension * dimension)
         {
             OGS_FATAL(
-                "The given parameter has %d components, but the permeability "
-                "tensor is defined for a %d dimensional problem.",
+                "The given parameter has {:d} components, but the permeability "
+                "tensor is defined for a {:d} dimensional problem.",
                 permeability_parameter.getNumberOfComponents(), dimension);
         }
 
@@ -71,15 +71,15 @@ std::unique_ptr<Permeability> createPermeabilityModel(
             dimension * dimension)
         {
             OGS_FATAL(
-                "The given parameter has %d components, but the permeability "
-                "tensor is defined for a %d dimensional problem.",
+                "The given parameter has {:d} components, but the permeability "
+                "tensor is defined for a {:d} dimensional problem.",
                 permeability_parameter.getNumberOfComponents(), dimension);
         }
 
         return std::make_unique<DupuitPermeability>(permeability_parameter,
                                                     dimension);
     }
-    OGS_FATAL("The permeability type '%s' is unavailable.\n",
+    OGS_FATAL("The permeability type '{:s}' is unavailable.\n",
               "The available types are \n\tConstant.",
               type.data());
 }
diff --git a/MaterialLib/PorousMedium/Porosity/createPorosityModel.cpp b/MaterialLib/PorousMedium/Porosity/createPorosityModel.cpp
index 4f2f86d644bce39b9606781bf9b647a77867c64f..7edcbccaf8ab63a19cf19bfb72997b3d1b3b4ec8 100644
--- a/MaterialLib/PorousMedium/Porosity/createPorosityModel.cpp
+++ b/MaterialLib/PorousMedium/Porosity/createPorosityModel.cpp
@@ -39,7 +39,7 @@ std::unique_ptr<Porosity> createPorosityModel(
         return std::make_unique<Porosity>(constant_porosity);
     }
 
-    OGS_FATAL("The porosity type %s is unavailable.\n",
+    OGS_FATAL("The porosity type {:s} is unavailable.\n",
               "The available type is Constant.",
               type.data());
 }
diff --git a/MaterialLib/PorousMedium/Storage/createStorageModel.cpp b/MaterialLib/PorousMedium/Storage/createStorageModel.cpp
index 9e3fa67e75f5f5300e03cc372a47cd5eaa9dcdf2..18371ac9113bf884d915cd687654f049dc21da80 100644
--- a/MaterialLib/PorousMedium/Storage/createStorageModel.cpp
+++ b/MaterialLib/PorousMedium/Storage/createStorageModel.cpp
@@ -34,7 +34,7 @@ std::unique_ptr<Storage> createStorageModel(BaseLib::ConfigTree const& config)
             config.getConfigParameter<double>("value"));
     }
 
-    OGS_FATAL("The storage type %s is unavailable.\n", type.data(),
+    OGS_FATAL("The storage type {:s} is unavailable.\n", type.data(),
               "The available type is Constant.");
 }
 
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CreateCapillaryPressureModel.cpp b/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CreateCapillaryPressureModel.cpp
index 5a906ea39096c987ed0213c80505298ed015f1c0..c0aec2cc24096431b0f9670ac8880cf45dc39dd2 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CreateCapillaryPressureModel.cpp
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CreateCapillaryPressureModel.cpp
@@ -49,7 +49,7 @@ static std::unique_ptr<CapillaryPressureSaturation> createBrooksCorey(
     if (auto const Sg_r_ptr = config.getConfigParameterOptional<double>("sg_r"))
     {
         DBUG(
-            "Using value %g for nonwetting phase residual saturation in "
+            "Using value {:g} for nonwetting phase residual saturation in "
             "capillary pressure model.",
             (*Sg_r_ptr));
         Sg_r = *Sg_r_ptr;
@@ -94,7 +94,7 @@ static std::unique_ptr<CapillaryPressureSaturation> createVanGenuchten(
     if (auto const Sg_r_ptr = config.getConfigParameterOptional<double>("sg_r"))
     {
         DBUG(
-            "Using value %g for nonwetting phase residual saturation in "
+            "Using value {:g} for nonwetting phase residual saturation in "
             "capillary pressure model.",
             (*Sg_r_ptr));
         Sg_r = *Sg_r_ptr;
@@ -119,7 +119,7 @@ static std::unique_ptr<CapillaryPressureSaturation> createVanGenuchten(
             //! \ogs_file_param{material__porous_medium__capillary_pressure__vanGenuchten__has_regularized}
         config.getConfigParameterOptional<bool>("has_regularized"))
     {
-        DBUG("capillary pressure model: %s",
+        DBUG("capillary pressure model: {:s}",
              (*has_regularized_conf) ? "true" : "false");
         has_regularized = *has_regularized_conf;
     }
@@ -157,7 +157,7 @@ std::unique_ptr<CapillaryPressureSaturation> createCapillaryPressureModel(
     }
 
     OGS_FATAL(
-        "The capillary pressure saturation models %s are unavailable.\n"
+        "The capillary pressure saturation models {:s} are unavailable.\n"
         "The available types are: \n\tBrooksCorey, \n\tvanGenuchten,",
         "\n\tCurve.\n",
         type.data());
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp
index d17f94c2cba889a3b15f4a1db8186f1bd9735019..8848037181f73e6efd9a72e357651e094e27b8f4 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/RelativePermeability/CreateRelativePermeabilityModel.cpp
@@ -199,7 +199,7 @@ std::unique_ptr<RelativePermeability> createRelativePermeabilityModel(
     }
 
     OGS_FATAL(
-        "The relative permeability model %s is unavailable.\n"
+        "The relative permeability model {:s} is unavailable.\n"
         "The available models are:"
         "\n\tWettingPhaseVanGenuchten,"
         "\n\tNonWettingPhaseVanGenuchten,"
diff --git a/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp b/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp
index aec10048af81bb850d0f999cb78c7da5989c5484..d99a9ab5c512cff81a394b6168d194ca35eb3297 100644
--- a/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp
+++ b/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp
@@ -82,7 +82,7 @@ createConstitutiveRelation(
             "option.");
 #endif  // OGS_USE_MFRONT
     }
-    OGS_FATAL("Cannot construct constitutive relation of given type '%s'.",
+    OGS_FATAL("Cannot construct constitutive relation of given type '{:s}'.",
               type.c_str());
 }
 
@@ -114,7 +114,7 @@ createConstitutiveRelations(
         {
             OGS_FATAL(
                 "Multiple constitutive relations were specified for the same "
-                "material id %d. Keep in mind, that if no material id is "
+                "material id {:d}. Keep in mind, that if no material id is "
                 "specified, it is assumed to be 0 by default.",
                 material_id);
         }
@@ -127,7 +127,7 @@ createConstitutiveRelations(
                 constitutive_relation_config));
     }
 
-    DBUG("Found %d constitutive relations.", constitutive_relations.size());
+    DBUG("Found {:d} constitutive relations.", constitutive_relations.size());
 
     return constitutive_relations;
 }
diff --git a/MaterialLib/SolidModels/CreateEhlers.h b/MaterialLib/SolidModels/CreateEhlers.h
index a76bebe77413500eabf37df52125f6554127b9be..0cf567ee0b85c1974c983b74dd867c9c39fdae6d 100644
--- a/MaterialLib/SolidModels/CreateEhlers.h
+++ b/MaterialLib/SolidModels/CreateEhlers.h
@@ -29,19 +29,19 @@ inline std::unique_ptr<DamagePropertiesParameters> createDamageProperties(
     auto& alpha_d =
         ParameterLib::findParameter<double>(config, "alpha_d", parameters, 1);
 
-    DBUG("Use '%s' as alpha_d.", alpha_d.name.c_str());
+    DBUG("Use '{:s}' as alpha_d.", alpha_d.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__damage_properties__beta_d}
     auto& beta_d =
         ParameterLib::findParameter<double>(config, "beta_d", parameters, 1);
 
-    DBUG("Use '%s' as beta_d.", beta_d.name.c_str());
+    DBUG("Use '{:s}' as beta_d.", beta_d.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__damage_properties__h_d}
     auto& h_d =
         ParameterLib::findParameter<double>(config, "h_d", parameters, 1);
 
-    DBUG("Use '%s' as h_d.", h_d.name.c_str());
+    DBUG("Use '{:s}' as h_d.", h_d.name.c_str());
 
     return std::make_unique<DamagePropertiesParameters>(
         DamagePropertiesParameters{alpha_d, beta_d, h_d});
@@ -60,97 +60,97 @@ std::unique_ptr<SolidEhlers<DisplacementDim>> createEhlers(
     auto& shear_modulus = ParameterLib::findParameter<double>(
         config, "shear_modulus", parameters, 1);
 
-    DBUG("Use '%s' as shear modulus parameter.", shear_modulus.name.c_str());
+    DBUG("Use '{:s}' as shear modulus parameter.", shear_modulus.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__bulk_modulus}
     auto& bulk_modulus = ParameterLib::findParameter<double>(
         config, "bulk_modulus", parameters, 1);
 
-    DBUG("Use '%s' as bulk modulus parameter.", bulk_modulus.name.c_str());
+    DBUG("Use '{:s}' as bulk modulus parameter.", bulk_modulus.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__kappa}
     auto& kappa =
         ParameterLib::findParameter<double>(config, "kappa", parameters, 1);
 
-    DBUG("Use '%s' as kappa.", kappa.name.c_str());
+    DBUG("Use '{:s}' as kappa.", kappa.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__beta}
     auto& beta =
         ParameterLib::findParameter<double>(config, "beta", parameters, 1);
 
-    DBUG("Use '%s' as beta.", beta.name.c_str());
+    DBUG("Use '{:s}' as beta.", beta.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__gamma}
     auto& gamma =
         ParameterLib::findParameter<double>(config, "gamma", parameters, 1);
 
-    DBUG("Use '%s' as gamma.", gamma.name.c_str());
+    DBUG("Use '{:s}' as gamma.", gamma.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__hardening_modulus}
     auto& hardening_modulus = ParameterLib::findParameter<double>(
         config, "hardening_modulus", parameters, 1);
 
-    DBUG("Use '%s' as hardening modulus parameter.",
+    DBUG("Use '{:s}' as hardening modulus parameter.",
          hardening_modulus.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__alpha}
     auto& alpha =
         ParameterLib::findParameter<double>(config, "alpha", parameters, 1);
 
-    DBUG("Use '%s' as alpha.", alpha.name.c_str());
+    DBUG("Use '{:s}' as alpha.", alpha.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__delta}
     auto& delta =
         ParameterLib::findParameter<double>(config, "delta", parameters, 1);
 
-    DBUG("Use '%s' as delta.", delta.name.c_str());
+    DBUG("Use '{:s}' as delta.", delta.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__eps}
     auto& eps =
         ParameterLib::findParameter<double>(config, "eps", parameters, 1);
 
-    DBUG("Use '%s' as eps.", eps.name.c_str());
+    DBUG("Use '{:s}' as eps.", eps.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__m}
     auto& m = ParameterLib::findParameter<double>(config, "m", parameters, 1);
 
-    DBUG("Use '%s' as m.", m.name.c_str());
+    DBUG("Use '{:s}' as m.", m.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__alphap}
     auto& alphap =
         ParameterLib::findParameter<double>(config, "alphap", parameters, 1);
 
-    DBUG("Use '%s' as alphap.", alphap.name.c_str());
+    DBUG("Use '{:s}' as alphap.", alphap.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__deltap}
     auto& deltap =
         ParameterLib::findParameter<double>(config, "deltap", parameters, 1);
 
-    DBUG("Use '%s' as deltap.", deltap.name.c_str());
+    DBUG("Use '{:s}' as deltap.", deltap.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__epsp}
     auto& epsp =
         ParameterLib::findParameter<double>(config, "epsp", parameters, 1);
 
-    DBUG("Use '%s' as epsp.", epsp.name.c_str());
+    DBUG("Use '{:s}' as epsp.", epsp.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__mp}
     auto& paremeter_mp =
         ParameterLib::findParameter<double>(config, "mp", parameters, 1);
 
-    DBUG("Use '%s' as mp.", paremeter_mp.name.c_str());
+    DBUG("Use '{:s}' as mp.", paremeter_mp.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__betap}
     auto& betap =
         ParameterLib::findParameter<double>(config, "betap", parameters, 1);
 
-    DBUG("Use '%s' as betap.", betap.name.c_str());
+    DBUG("Use '{:s}' as betap.", betap.name.c_str());
 
     //! \ogs_file_param_special{material__solid__constitutive_relation__Ehlers__gammap}
     auto& gammap =
         ParameterLib::findParameter<double>(config, "gammap", parameters, 1);
 
-    DBUG("Use '%s' as gammap.", gammap.name.c_str());
+    DBUG("Use '{:s}' as gammap.", gammap.name.c_str());
 
     auto tangent_type =
         //! \ogs_file_param{material__solid__constitutive_relation__Ehlers__tangent_type}
diff --git a/MaterialLib/SolidModels/CreateLinearElasticIsotropic.h b/MaterialLib/SolidModels/CreateLinearElasticIsotropic.h
index e9fa96316adcd4953a0c1a21d83f1c8d7535141b..0866f924cc0565d1553e096e9fe02172ddb48789 100644
--- a/MaterialLib/SolidModels/CreateLinearElasticIsotropic.h
+++ b/MaterialLib/SolidModels/CreateLinearElasticIsotropic.h
@@ -36,14 +36,16 @@ createLinearElasticIsotropic(
         //! \ogs_file_param_special{material__solid__constitutive_relation__LinearElasticIsotropic__youngs_modulus}
         config, "youngs_modulus", parameters, 1);
 
-    DBUG("Use '%s' as youngs_modulus parameter.", youngs_modulus.name.c_str());
+    DBUG("Use '{:s}' as youngs_modulus parameter.",
+         youngs_modulus.name.c_str());
 
     // Poissons ratio
     auto& poissons_ratio = ParameterLib::findParameter<double>(
         //! \ogs_file_param_special{material__solid__constitutive_relation__LinearElasticIsotropic__poissons_ratio}
         config, "poissons_ratio", parameters, 1);
 
-    DBUG("Use '%s' as poissons_ratio parameter.", poissons_ratio.name.c_str());
+    DBUG("Use '{:s}' as poissons_ratio parameter.",
+         poissons_ratio.name.c_str());
 
     typename LinearElasticIsotropic<DisplacementDim>::MaterialProperties mp{
         youngs_modulus, poissons_ratio};
diff --git a/MaterialLib/SolidModels/CreateLinearElasticOrthotropic.cpp b/MaterialLib/SolidModels/CreateLinearElasticOrthotropic.cpp
index bff7e3fdc2ad497969326b389ebed10c27518cbd..1a0c48b859a8395ca5399d0b8efbb028bf9873c2 100644
--- a/MaterialLib/SolidModels/CreateLinearElasticOrthotropic.cpp
+++ b/MaterialLib/SolidModels/CreateLinearElasticOrthotropic.cpp
@@ -35,19 +35,19 @@ createLinearElasticOrthotropic(
     auto& youngs_moduli = ParameterLib::findParameter<double>(
         //! \ogs_file_param_special{material__solid__constitutive_relation__LinearElasticOrthotropic__youngs_moduli}
         config, "youngs_moduli", parameters, 3);
-    DBUG("Use '%s' as youngs_moduli parameter.", youngs_moduli.name.c_str());
+    DBUG("Use '{:s}' as youngs_moduli parameter.", youngs_moduli.name.c_str());
 
     // Shear moduli
     auto& shear_moduli = ParameterLib::findParameter<double>(
         //! \ogs_file_param_special{material__solid__constitutive_relation__LinearElasticOrthotropic__shear_moduli}
         config, "shear_moduli", parameters, 3);
-    DBUG("Use '%s' as shear_moduli parameter.", shear_moduli.name.c_str());
+    DBUG("Use '{:s}' as shear_moduli parameter.", shear_moduli.name.c_str());
 
     // Poissons ratios
     auto& poissons_ratios = ParameterLib::findParameter<double>(
         //! \ogs_file_param_special{material__solid__constitutive_relation__LinearElasticOrthotropic__poissons_ratios}
         config, "poissons_ratios", parameters, 3);
-    DBUG("Use '%s' as poissons_ratios parameter.",
+    DBUG("Use '{:s}' as poissons_ratios parameter.",
          poissons_ratios.name.c_str());
 
     typename LinearElasticOrthotropic<DisplacementDim>::MaterialProperties mp{
diff --git a/MaterialLib/SolidModels/CreateLubby2.h b/MaterialLib/SolidModels/CreateLubby2.h
index 9441adb1055a5fe4dfbdd7bc58e13a75f4e4f948..346dce709fb6f9ac8520e4030ef410baae748af2 100644
--- a/MaterialLib/SolidModels/CreateLubby2.h
+++ b/MaterialLib/SolidModels/CreateLubby2.h
@@ -35,7 +35,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__kelvin_shear_modulus}
         config, "kelvin_shear_modulus", parameters, 1);
 
-    DBUG("Use '%s' as kelvin shear modulus parameter.",
+    DBUG("Use '{:s}' as kelvin shear modulus parameter.",
          kelvin_shear_modulus.name.c_str());
 
     // Kelvin viscosity.
@@ -43,7 +43,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__kelvin_viscosity}
         config, "kelvin_viscosity", parameters, 1);
 
-    DBUG("Use '%s' as kelvin viscosity parameter.",
+    DBUG("Use '{:s}' as kelvin viscosity parameter.",
          kelvin_viscosity.name.c_str());
 
     // Maxwell shear modulus.
@@ -51,7 +51,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__maxwell_shear_modulus}
         config, "maxwell_shear_modulus", parameters, 1);
 
-    DBUG("Use '%s' as maxwell shear modulus parameter.",
+    DBUG("Use '{:s}' as maxwell shear modulus parameter.",
          maxwell_shear_modulus.name.c_str());
 
     // Maxwell bulk modulus.
@@ -59,7 +59,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__maxwell_bulk_modulus}
         config, "maxwell_bulk_modulus", parameters, 1);
 
-    DBUG("Use '%s' as maxwell bulk modulus parameter.",
+    DBUG("Use '{:s}' as maxwell bulk modulus parameter.",
          maxwell_bulk_modulus.name.c_str());
 
     // Maxwell viscosity.
@@ -67,7 +67,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__maxwell_viscosity}
         config, "maxwell_viscosity", parameters, 1);
 
-    DBUG("Use '%s' as maxwell viscosity parameter.",
+    DBUG("Use '{:s}' as maxwell viscosity parameter.",
          maxwell_viscosity.name.c_str());
 
     // Dependency parameter for mK.
@@ -75,7 +75,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__dependency_parameter_mk}
         config, "dependency_parameter_mk", parameters, 1);
 
-    DBUG("Use '%s' as dependency parameter mK.",
+    DBUG("Use '{:s}' as dependency parameter mK.",
          dependency_parameter_mK.name.c_str());
 
     // Dependency parameter for mvK.
@@ -83,7 +83,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__dependency_parameter_mvk}
         config, "dependency_parameter_mvk", parameters, 1);
 
-    DBUG("Use '%s' as dependency parameter mvK.",
+    DBUG("Use '{:s}' as dependency parameter mvK.",
          dependency_parameter_mvK.name.c_str());
 
     // Dependency parameter for mvM.
@@ -91,7 +91,7 @@ std::unique_ptr<Lubby2<DisplacementDim>> createLubby2(
         //! \ogs_file_param_special{material__solid__constitutive_relation__Lubby2__dependency_parameter_mvm}
         config, "dependency_parameter_mvm", parameters, 1);
 
-    DBUG("Use '%s' as dependency parameter mvM.",
+    DBUG("Use '{:s}' as dependency parameter mvM.",
          dependency_parameter_mvM.name.c_str());
 
     Lubby2MaterialProperties mp{
diff --git a/MaterialLib/SolidModels/CreateNewtonRaphsonSolverParameters.cpp b/MaterialLib/SolidModels/CreateNewtonRaphsonSolverParameters.cpp
index 16d33eb199d3b1f3458b851dda1418f783da2804..55c9d0caaccd040ac1b58d8e521b6be61532305f 100644
--- a/MaterialLib/SolidModels/CreateNewtonRaphsonSolverParameters.cpp
+++ b/MaterialLib/SolidModels/CreateNewtonRaphsonSolverParameters.cpp
@@ -26,13 +26,13 @@ NumLib::NewtonRaphsonSolverParameters createNewtonRaphsonSolverParameters(
         //! \ogs_file_param{nonlinear_solver__maximum_iterations}
         config.getConfigParameter<int>("maximum_iterations");
 
-    DBUG("\tmaximum_iterations: %d.", maximum_iterations);
+    DBUG("\tmaximum_iterations: {:d}.", maximum_iterations);
 
     auto const error_tolerance =
         //! \ogs_file_param{nonlinear_solver__error_tolerance}
         config.getConfigParameter<double>("error_tolerance");
 
-    DBUG("\terror_tolerance: %g.", error_tolerance);
+    DBUG("\terror_tolerance: {:g}.", error_tolerance);
 
     return {maximum_iterations, error_tolerance};
 }
diff --git a/MaterialLib/SolidModels/Ehlers.cpp b/MaterialLib/SolidModels/Ehlers.cpp
index bb694bc071b1ccd559ef7676b9f8420970d432ee..e63408c6f4c045d55273bca150ffe2085d786014 100644
--- a/MaterialLib/SolidModels/Ehlers.cpp
+++ b/MaterialLib/SolidModels/Ehlers.cpp
@@ -675,7 +675,7 @@ SolidEhlers<DisplacementDim>::integrateStress(
         {
             OGS_FATAL(
                 "Unimplemented tangent type behaviour for the tangent type "
-                "'%d'.",
+                "'{:d}'.",
                 _tangent_type);
         }
     }
diff --git a/MaterialLib/SolidModels/Ehlers.h b/MaterialLib/SolidModels/Ehlers.h
index 0838e47b2a2bf370bc5cf697aaa0bc03de7f5c2b..0fd26b599802892492d5d7b2c91b22d998281f66 100644
--- a/MaterialLib/SolidModels/Ehlers.h
+++ b/MaterialLib/SolidModels/Ehlers.h
@@ -55,7 +55,7 @@ inline TangentType makeTangentType(std::string const& s)
     {
         return TangentType::Plastic;
     }
-    OGS_FATAL("Not valid string '%s' to create a tangent type from.",
+    OGS_FATAL("Not valid string '{:s}' to create a tangent type from.",
               s.c_str());
 }
 
diff --git a/MaterialLib/SolidModels/MFront/CMakeLists.txt b/MaterialLib/SolidModels/MFront/CMakeLists.txt
index d1e05c8f8508c73c071093d522d72bbb93b1f942..b1b5fa5c1ae5c8d91d1acf890d68bfc1eed07894 100644
--- a/MaterialLib/SolidModels/MFront/CMakeLists.txt
+++ b/MaterialLib/SolidModels/MFront/CMakeLists.txt
@@ -5,8 +5,8 @@ list(APPEND SOURCES MFront.cpp MFront.h)
 ogs_add_library(MaterialLib_SolidModels_MFront ${SOURCES})
 
 target_link_libraries(MaterialLib_SolidModels_MFront
-                      PUBLIC BaseLib NumLib logog OgsMFrontBehaviour
-                      PRIVATE MathLib MeshLib)
+                      PUBLIC BaseLib NumLib OgsMFrontBehaviour
+                      PRIVATE MathLib MeshLib spdlog::spdlog)
 
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
                       "${PROJECT_SOURCE_DIR}/ThirdParty/MGIS")
diff --git a/MaterialLib/SolidModels/MFront/CreateMFront.cpp b/MaterialLib/SolidModels/MFront/CreateMFront.cpp
index a1615bf935c8dcb319e01a018bba18cacd290499..49550899a3cd9a1ed6ffd972172870b34f5df55a 100644
--- a/MaterialLib/SolidModels/MFront/CreateMFront.cpp
+++ b/MaterialLib/SolidModels/MFront/CreateMFront.cpp
@@ -20,13 +20,13 @@ void varInfo(std::string const& msg,
              std::vector<mgis::behaviour::Variable> const& vars,
              mgis::behaviour::Hypothesis hypothesis)
 {
-    INFO("#%s: %lu (array size %lu).",
+    INFO("#{:s}: {:d} (array size {:d}).",
          msg.c_str(),
          vars.size(),
          mgis::behaviour::getArraySize(vars, hypothesis));
     for (auto& var : vars)
     {
-        INFO("  --> type `%s' with name `%s', size %lu, offset %lu.",
+        INFO("  --> type `{:s}' with name `{:s}', size {:d}, offset {:d}.",
              MaterialLib::Solids::MFront::varTypeToString(var.type),
              var.name.c_str(),
              mgis::behaviour::getVariableSize(var, hypothesis),
@@ -37,11 +37,11 @@ void varInfo(std::string const& msg,
 /// Prints info about MFront parameters.
 void varInfo(std::string const& msg, std::vector<std::string> const& parameters)
 {
-    INFO("#%s: %lu.", msg.c_str(), parameters.size());
+    INFO("#{:s}: {:d}.", msg.c_str(), parameters.size());
     // mgis::behaviour::getArraySize(vars, hypothesis));
     for (auto const& parameter : parameters)
     {
-        INFO("  --> with name `%s'.", parameter.c_str());
+        INFO("  --> with name `{:s}'.", parameter.c_str());
     }
 }
 }  // anonymous namespace
@@ -98,13 +98,13 @@ std::unique_ptr<MechanicsBase<DisplacementDim>> createMFront(
     auto behaviour =
         mgis::behaviour::load(lib_path, behaviour_name, hypothesis);
 
-    INFO("Behaviour:      `%s'.", behaviour.behaviour.c_str());
-    INFO("Hypothesis:     `%s'.", mgis::behaviour::toString(hypothesis));
-    INFO("Source:         `%s'.", behaviour.source.c_str());
-    INFO("TFEL version:   `%s'.", behaviour.tfel_version.c_str());
-    INFO("Behaviour type: `%s'.", btypeToString(behaviour.btype));
-    INFO("Kinematic:      `%s'.", toString(behaviour.kinematic));
-    INFO("Symmetry:       `%s'.", toString(behaviour.symmetry));
+    INFO("Behaviour:      `{:s}'.", behaviour.behaviour.c_str());
+    INFO("Hypothesis:     `{:s}'.", mgis::behaviour::toString(hypothesis));
+    INFO("Source:         `{:s}'.", behaviour.source.c_str());
+    INFO("TFEL version:   `{:s}'.", behaviour.tfel_version.c_str());
+    INFO("Behaviour type: `{:s}'.", btypeToString(behaviour.btype));
+    INFO("Kinematic:      `{:s}'.", toString(behaviour.kinematic));
+    INFO("Symmetry:       `{:s}'.", toString(behaviour.symmetry));
 
     varInfo("Mat. props.", behaviour.mps, hypothesis);
     varInfo("Gradients", behaviour.gradients, hypothesis);
@@ -146,7 +146,7 @@ std::unique_ptr<MechanicsBase<DisplacementDim>> createMFront(
             auto const it = map_name_to_param.find(mp.name);
             if (it == map_name_to_param.end())
                 OGS_FATAL(
-                    "Material Property `%s' has not been configured in the "
+                    "Material Property `{:s}' has not been configured in the "
                     "project file.",
                     mp.name.c_str());
 
@@ -156,16 +156,17 @@ std::unique_ptr<MechanicsBase<DisplacementDim>> createMFront(
             auto const* param = &ParameterLib::findParameter<double>(
                 param_name, parameters, num_comp);
 
-            INFO("Using OGS parameter `%s' for material property `%s'.",
+            INFO("Using OGS parameter `{:s}' for material property `{:s}'.",
                  param_name.c_str(), mp.name.c_str());
 
             using V = mgis::behaviour::Variable;
             if (mp.type == V::STENSOR || mp.type == V::TENSOR)
             {
                 WARN(
-                    "Material property `%s' is a tensorial quantity. You, the "
+                    "Material property `{:s}' is a tensorial quantity. You, "
+                    "the "
                     "user, have to make sure that the component order of "
-                    "parameter `%s' matches the one required by MFront!",
+                    "parameter `{:s}' matches the one required by MFront!",
                     mp.name.c_str(), param_name.c_str());
             }
 
@@ -181,7 +182,7 @@ std::unique_ptr<MechanicsBase<DisplacementDim>> createMFront(
 
             for (auto& e : map_name_to_param)
             {
-                ERR("  name: `%s', parameter: `%s'.", e.first.c_str(),
+                ERR("  name: `{:s}', parameter: `{:s}'.", e.first.c_str(),
                     e.second.c_str());
             }
 
diff --git a/MaterialLib/SolidModels/MFront/MFront.cpp b/MaterialLib/SolidModels/MFront/MFront.cpp
index 3095289b6f3ba2654be69b00f46adb055df7af3c..8c0713d87189e33d1618ae3b433f39adf5408f18 100644
--- a/MaterialLib/SolidModels/MFront/MFront.cpp
+++ b/MaterialLib/SolidModels/MFront/MFront.cpp
@@ -111,7 +111,7 @@ const char* toString(mgis::behaviour::Behaviour::Kinematic kin)
             return "FINITESTRAINKINEMATIC_ETO_PK1";
     }
 
-    OGS_FATAL("Unknown kinematic %d.", kin);
+    OGS_FATAL("Unknown kinematic {:d}.", kin);
 }
 
 const char* toString(mgis::behaviour::Behaviour::Symmetry sym)
@@ -125,7 +125,7 @@ const char* toString(mgis::behaviour::Behaviour::Symmetry sym)
             return "ORTHOTROPIC";
     }
 
-    OGS_FATAL("Unknown symmetry %d.", sym);
+    OGS_FATAL("Unknown symmetry {:d}.", sym);
 }
 const char* btypeToString(int btype)
 {
@@ -139,7 +139,7 @@ const char* btypeToString(int btype)
     if (btype == B::COHESIVEZONEMODEL)
         return "COHESIVEZONEMODEL";
 
-    OGS_FATAL("Unknown behaviour type %d.", btype);
+    OGS_FATAL("Unknown behaviour type {:d}.", btype);
 }
 const char* varTypeToString(int v)
 {
@@ -153,7 +153,7 @@ const char* varTypeToString(int v)
     if (v == V::TENSOR)
         return "TENSOR";
 
-    OGS_FATAL("Unknown variable type %d.", v);
+    OGS_FATAL("Unknown variable type {:d}.", v);
 }
 
 template <int DisplacementDim>
@@ -181,7 +181,7 @@ MFront<DisplacementDim>::MFront(
 
     if (mgis::behaviour::getVariableSize(_behaviour.gradients[0], hypothesis) !=
         MFront<DisplacementDim>::KelvinVector::SizeAtCompileTime)
-        OGS_FATAL("Strain must have %ld components instead of %lu.",
+        OGS_FATAL("Strain must have {:d} components instead of {:d}.",
                   MFront<DisplacementDim>::KelvinVector::SizeAtCompileTime,
                   mgis::behaviour::getVariableSize(_behaviour.gradients[0],
                                                    hypothesis));
@@ -200,7 +200,7 @@ MFront<DisplacementDim>::MFront(
     if (mgis::behaviour::getVariableSize(_behaviour.thermodynamic_forces[0],
                                          hypothesis) !=
         MFront<DisplacementDim>::KelvinVector::SizeAtCompileTime)
-        OGS_FATAL("Stress must have %ld components instead of %lu.",
+        OGS_FATAL("Stress must have {:d} components instead of {:d}.",
                   MFront<DisplacementDim>::KelvinVector::SizeAtCompileTime,
                   mgis::behaviour::getVariableSize(
                       _behaviour.thermodynamic_forces[0], hypothesis));
@@ -216,7 +216,7 @@ MFront<DisplacementDim>::MFront(
         if (mgis::behaviour::getVariableSize(_behaviour.esvs[0], hypothesis) !=
             1)
             OGS_FATAL(
-                "Temperature must be a scalar instead of having %lu "
+                "Temperature must be a scalar instead of having {:d} "
                 "components.",
                 mgis::behaviour::getVariableSize(
                     _behaviour.thermodynamic_forces[0], hypothesis));
@@ -224,13 +224,13 @@ MFront<DisplacementDim>::MFront(
 
     if (_behaviour.mps.size() != _material_properties.size())
     {
-        ERR("There are %d material properties in the loaded behaviour:",
+        ERR("There are {:d} material properties in the loaded behaviour:",
             _behaviour.mps.size());
         for (auto const& mp : _behaviour.mps)
         {
-            ERR("\t%s", mp.name.c_str());
+            ERR("\t{:s}", mp.name.c_str());
         }
-        OGS_FATAL("But the number of passed material properties is %d.",
+        OGS_FATAL("But the number of passed material properties is {:d}.",
                   _material_properties.size());
     }
 }
diff --git a/MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h b/MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h
index 0d915d3cec2f49abf537a07529e279c65ba43cbe..7daea399d2fedefed35133082f6fd13915797696 100644
--- a/MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h
+++ b/MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h
@@ -50,16 +50,16 @@ MechanicsBase<DisplacementDim>& selectSolidConstitutiveRelation(
     if (constitutive_relation == end(constitutive_relations))
     {
         OGS_FATAL(
-            "No constitutive relation found for material id %d and element %d. "
-            "There are %d constitutive relations available.",
+            "No constitutive relation found for material id {:d} and element "
+            "{:d}. There are {:d} constitutive relations available.",
             material_id, element_id, constitutive_relations.size());
     }
 
     if (constitutive_relation->second == nullptr)
     {
         OGS_FATAL(
-            "The constitutive relation found for material id %d and element %d "
-            "is a nullptr, which is impossible.",
+            "The constitutive relation found for material id {:d} and element "
+            "{:d} is a nullptr, which is impossible.",
             material_id, element_id);
     }
 
diff --git a/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp b/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp
index 78ff7ffad69c5aa6c0c8d024fcf3a6dea118e871..5ec91bf25cf6b67356de5f6237db38786c51f527 100644
--- a/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp
+++ b/MaterialLib/TwoPhaseModels/CreateTwoPhaseFlowMaterialProperties.cpp
@@ -9,7 +9,7 @@
 
 #include "CreateTwoPhaseFlowMaterialProperties.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Algorithm.h"
 #include "MaterialLib/Fluid/FluidProperty.h"
diff --git a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp
index bbea95d169bea5b66a3010f13fe194f6cb1c29c5..5693aafba3e3251151f50feab13e553baba3d541 100644
--- a/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp
+++ b/MaterialLib/TwoPhaseModels/TwoPhaseFlowWithPPMaterialProperties.cpp
@@ -10,8 +10,8 @@
 #include "TwoPhaseFlowWithPPMaterialProperties.h"
 
 #include <boost/math/special_functions/pow.hpp>
-#include <logog/include/logog.hpp>
 #include <utility>
+#include "BaseLib/Logging.h"
 
 #include "MaterialLib/Fluid/FluidProperty.h"
 #include "MaterialLib/PorousMedium/Porosity/Porosity.h"
diff --git a/MathLib/CMakeLists.txt b/MathLib/CMakeLists.txt
index a27d9fa6cee26f681b9f884bf57e282e617cef4f..0a1a2bbeec6562e33141fe33443300900c600d3c 100644
--- a/MathLib/CMakeLists.txt
+++ b/MathLib/CMakeLists.txt
@@ -30,7 +30,10 @@ target_include_directories(MathLib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
 
 set_target_properties(MathLib PROPERTIES LINKER_LANGUAGE CXX)
 
-target_link_libraries(MathLib PUBLIC BaseLib logog ${OpenMP_CXX_LIBRARIES})
+target_link_libraries(
+    MathLib
+    PUBLIC BaseLib ${OpenMP_CXX_LIBRARIES}
+    PRIVATE spdlog::spdlog)
 
 if(CVODE_FOUND)
     target_include_directories(MathLib PRIVATE ${CVODE_INCLUDE_DIRS})
diff --git a/MathLib/GeometricBasics.cpp b/MathLib/GeometricBasics.cpp
index 267166a0d1afb983002348669a7421db3e08c305..8fd6bc43dc9d74bde74c5b47e5ca4c4b0701e94d 100644
--- a/MathLib/GeometricBasics.cpp
+++ b/MathLib/GeometricBasics.cpp
@@ -7,7 +7,7 @@
  *              http://www.opengeosys.org/project/license
  */
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <Eigen/Dense>
 
diff --git a/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp b/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp
index 2cadad0470b542fd4aa7c6a8ef8230b7fb832805..fd51e249ad2a67042f3b03c7956a5316904d2c05 100644
--- a/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp
+++ b/MathLib/InterpolationAlgorithms/PiecewiseLinearInterpolation.cpp
@@ -41,7 +41,7 @@ PiecewiseLinearInterpolation::PiecewiseLinearInterpolation(
     {
         const std::size_t i = std::distance(_supp_pnts.begin(), it);
         OGS_FATAL(
-            "Variable %d and variable %d are the same. "
+            "Variable {:d} and variable {:d} are the same. "
             "Piecewise linear interpolation is not possible\n",
             i, i + 1);
     }
diff --git a/MathLib/KelvinVector.cpp b/MathLib/KelvinVector.cpp
index e4391aa333c87b28cb7f917c69645e79c20b919c..2d45a12ad4af7cd51b4403f403f8ee31b4b6290b 100644
--- a/MathLib/KelvinVector.cpp
+++ b/MathLib/KelvinVector.cpp
@@ -102,7 +102,7 @@ Eigen::Matrix<double, 3, 3> kelvinVectorToTensor(Eigen::Matrix<double,
         return kelvinVectorToTensor(v6);
     }
     OGS_FATAL(
-        "Conversion of dynamic Kelvin vector of size %d to a tensor is not "
+        "Conversion of dynamic Kelvin vector of size {:d} to a tensor is not "
         "possible. Kelvin vector must be of size 4 or 6.",
         v.size());
 }
@@ -176,7 +176,7 @@ kelvinVectorToSymmetricTensor(Eigen::Matrix<double,
     }
     OGS_FATAL(
         "Kelvin vector to tensor conversion expected an input vector of size 4 "
-        "or 6, but a vector of size %d was given.",
+        "or 6, but a vector of size {:d} was given.",
         v.size());
 }
 
diff --git a/MathLib/KelvinVector.h b/MathLib/KelvinVector.h
index 48f4c04940b5675e1fa877eb60662f6805957df7..45f5701db863f50290620d2a18954c9f0c7a6084 100644
--- a/MathLib/KelvinVector.h
+++ b/MathLib/KelvinVector.h
@@ -180,7 +180,7 @@ symmetricTensorToKelvinVector(Eigen::MatrixBase<Derived> const& v)
     if (v.cols() != 1)
     {
         OGS_FATAL(
-            "KelvinVector must be a column vector, but input has %d columns.",
+            "KelvinVector must be a column vector, but input has {:d} columns.",
             v.cols());
     }
 
@@ -201,7 +201,7 @@ symmetricTensorToKelvinVector(Eigen::MatrixBase<Derived> const& v)
     {
         OGS_FATAL(
             "Symmetric tensor to Kelvin vector conversion expected an input "
-            "vector of size 4 or 6, but a vector of size %d was given.",
+            "vector of size 4 or 6, but a vector of size {:d} was given.",
             v.size());
     }
     return result;
@@ -222,7 +222,7 @@ KelvinVectorType<DisplacementDim> symmetricTensorToKelvinVector(
     {
         OGS_FATAL(
             "Symmetric tensor to Kelvin vector conversion expected an input "
-            "vector of size %d, but a vector of size %d was given.",
+            "vector of size {:d}, but a vector of size {:d} was given.",
             kelvin_vector_size, values.size());
     }
 
diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index 3c4fc97446629859ae6e727dbdad9d53ddb21c3a..a8f3955c1ce5d15059326a124e9ba9ed4944ac90 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
@@ -10,7 +10,7 @@
 
 #include "EigenLinearSolver.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #ifdef USE_MKL
 #include <Eigen/PardisoSupport>
@@ -55,7 +55,7 @@ class EigenDirectLinearSolver final : public EigenLinearSolverBase
 public:
     bool solve(Matrix& A, Vector const& b, Vector& x, EigenOption& opt) override
     {
-        INFO("-> solve with %s",
+        INFO("-> solve with {:s}",
              EigenOption::getSolverName(opt.solver_type).c_str());
         if (!A.isCompressed())
         {
@@ -88,7 +88,7 @@ class EigenIterativeLinearSolver final : public EigenLinearSolverBase
 public:
     bool solve(Matrix& A, Vector const& b, Vector& x, EigenOption& opt) override
     {
-        INFO("-> solve with %s (precon %s)",
+        INFO("-> solve with {:s} (precon {:s})",
              EigenOption::getSolverName(opt.solver_type).c_str(),
              EigenOption::getPreconName(opt.precon_type).c_str());
         _solver.setTolerance(opt.error_tolerance);
@@ -106,8 +106,9 @@ public:
         }
 
         x = _solver.solveWithGuess(b, x);
-        INFO("\t iteration: %d/%ld", _solver.iterations(), opt.max_iterations);
-        INFO("\t residual: %e\n", _solver.error());
+        INFO("\t iteration: {:d}/{:d}", _solver.iterations(),
+             opt.max_iterations);
+        INFO("\t residual: {:e}\n", _solver.error());
 
         if(_solver.info()!=Eigen::Success) {
             ERR("Failed during Eigen linear solve");
diff --git a/MathLib/LinAlg/Eigen/EigenOption.cpp b/MathLib/LinAlg/Eigen/EigenOption.cpp
index 782a4dd24ed3374853f451ec5c28e6e6247cf6ec..35271534c242af387030092a2dbca46c6226e409 100644
--- a/MathLib/LinAlg/Eigen/EigenOption.cpp
+++ b/MathLib/LinAlg/Eigen/EigenOption.cpp
@@ -48,7 +48,7 @@ EigenOption::SolverType EigenOption::getSolverType(const std::string &solver_nam
         return SolverType::GMRES;
     }
 
-    OGS_FATAL("Unknown Eigen solver type `%s'", solver_name.c_str());
+    OGS_FATAL("Unknown Eigen solver type `{:s}'", solver_name.c_str());
 }
 
 EigenOption::PreconType EigenOption::getPreconType(const std::string &precon_name)
@@ -66,7 +66,7 @@ EigenOption::PreconType EigenOption::getPreconType(const std::string &precon_nam
         return PreconType::ILUT;
     }
 
-    OGS_FATAL("Unknown Eigen preconditioner type `%s'", precon_name.c_str());
+    OGS_FATAL("Unknown Eigen preconditioner type `{:s}'", precon_name.c_str());
 }
 
 std::string EigenOption::getSolverName(SolverType const solver_type)
diff --git a/MathLib/LinAlg/Eigen/EigenTools.cpp b/MathLib/LinAlg/Eigen/EigenTools.cpp
index 8fd3c2335d172f5c5f01089e8ca47b45b6a1f883..88fac8ea857a55141b025847074ec38a2a7ccc34 100644
--- a/MathLib/LinAlg/Eigen/EigenTools.cpp
+++ b/MathLib/LinAlg/Eigen/EigenTools.cpp
@@ -10,7 +10,7 @@
 
 #include "EigenTools.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "EigenVector.h"
 
diff --git a/MathLib/LinAlg/Eigen/EigenTools.h b/MathLib/LinAlg/Eigen/EigenTools.h
index 0dd4ba27e817ef76e4e49f24e3c6d613eb2935d0..a64edfceaf7e9ebc829a9d1d42abf6bcac0b0c67 100644
--- a/MathLib/LinAlg/Eigen/EigenTools.h
+++ b/MathLib/LinAlg/Eigen/EigenTools.h
@@ -11,7 +11,7 @@
 #pragma once
 
 #include <vector>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Error.h"
 #include "EigenMatrix.h" // for EigenMatrix::IndexType
diff --git a/MathLib/LinAlg/EigenLis/EigenLisLinearSolver.cpp b/MathLib/LinAlg/EigenLis/EigenLisLinearSolver.cpp
index fe5e8cfcf8fde36c7517376cf1b74400d1767382..4c039ba886fe33162755c911135698d5e369a2ec 100644
--- a/MathLib/LinAlg/EigenLis/EigenLisLinearSolver.cpp
+++ b/MathLib/LinAlg/EigenLis/EigenLisLinearSolver.cpp
@@ -13,7 +13,7 @@
 #ifdef _OPENMP
 #include <omp.h>
 #endif
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "MathLib/LinAlg/Eigen/EigenMatrix.h"
diff --git a/MathLib/LinAlg/Lis/LisCheck.h b/MathLib/LinAlg/Lis/LisCheck.h
index 02c8f3cc70a254690328de940c0da3621d70e0b2..5396ea6795aefa869da25c90e7dfa189f0f269ea 100644
--- a/MathLib/LinAlg/Lis/LisCheck.h
+++ b/MathLib/LinAlg/Lis/LisCheck.h
@@ -15,8 +15,8 @@
 #pragma once
 
 #include <vector>
+#include "BaseLib/Logging.h"
 #include "lis.h"
-#include <logog/include/logog.hpp>
 
 namespace MathLib
 {
@@ -31,7 +31,7 @@ inline bool checkLisError(int err)
 {
     bool ok = (err == LIS_SUCCESS);
     if (!ok) {
-        ERR("***ERROR: Lis error code = %d", err);
+        ERR("***ERROR: Lis error code = {:d}", err);
     }
     return ok;
 }
diff --git a/MathLib/LinAlg/Lis/LisLinearSolver.cpp b/MathLib/LinAlg/Lis/LisLinearSolver.cpp
index 8db668e7e271179722b930a9776b0539c9d201a2..c5f82e5701f046b4adfa0d647385e41364d5bda2 100644
--- a/MathLib/LinAlg/Lis/LisLinearSolver.cpp
+++ b/MathLib/LinAlg/Lis/LisLinearSolver.cpp
@@ -18,7 +18,7 @@
 
 #include "LisLinearSolver.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "LisCheck.h"
 #include "LisMatrix.h"
@@ -50,21 +50,21 @@ bool LisLinearSolver::solve(LisMatrix &A, LisVector &b, LisVector &x)
     lis_solver_set_option(
         const_cast<char*>(_lis_option._option_string.c_str()), solver);
 #ifdef _OPENMP
-    INFO("-> number of threads: %i", (int) omp_get_max_threads());
+    INFO("-> number of threads: {:i}", (int)omp_get_max_threads());
 #endif
     {
         int precon;
         ierr = lis_solver_get_precon(solver, &precon);
         if (!checkLisError(ierr))
             return false;
-        INFO("-> precon: %i", precon);
+        INFO("-> precon: {:i}", precon);
     }
     {
         int slv;
         ierr = lis_solver_get_solver(solver, &slv);
         if (!checkLisError(ierr))
             return false;
-        INFO("-> solver: %i", slv);
+        INFO("-> solver: {:i}", slv);
     }
 
     // solve
@@ -78,7 +78,7 @@ bool LisLinearSolver::solve(LisMatrix &A, LisVector &b, LisVector &x)
     if (!checkLisError(ierr))
         return false;
 
-    INFO("-> status: %d", linear_solver_status);
+    INFO("-> status: {:d}", linear_solver_status);
 
     {
         int iter = 0;
@@ -86,14 +86,14 @@ bool LisLinearSolver::solve(LisMatrix &A, LisVector &b, LisVector &x)
         if (!checkLisError(ierr))
             return false;
 
-        INFO("-> iteration: %d", iter);
+        INFO("-> iteration: {:d}", iter);
     }
     {
         double resid = 0.0;
         ierr = lis_solver_get_residualnorm(solver, &resid);
         if (!checkLisError(ierr))
             return false;
-        INFO("-> residual: %g", resid);
+        INFO("-> residual: {:g}", resid);
     }
     {
         double time, itime, ptime, p_ctime, p_itime;
@@ -101,11 +101,11 @@ bool LisLinearSolver::solve(LisMatrix &A, LisVector &b, LisVector &x)
                                      &ptime, &p_ctime, &p_itime);
         if (!checkLisError(ierr))
             return false;
-        INFO("-> time total           (s): %g", time);
-        INFO("-> time iterations      (s): %g", itime);
-        INFO("-> time preconditioning (s): %g", ptime);
-        INFO("-> time precond. create (s): %g", p_ctime);
-        INFO("-> time precond. iter   (s): %g", p_itime);
+        INFO("-> time total           (s): {:g}", time);
+        INFO("-> time iterations      (s): {:g}", itime);
+        INFO("-> time preconditioning (s): {:g}", ptime);
+        INFO("-> time precond. create (s): {:g}", p_ctime);
+        INFO("-> time precond. iter   (s): {:g}", p_itime);
     }
 
     // Clear solver
diff --git a/MathLib/LinAlg/Lis/LisMatrix.cpp b/MathLib/LinAlg/Lis/LisMatrix.cpp
index b44d44d76a6c25a2806e351085f93bddecf58fb7..2552a4befe876feed0d7cc3361bf0d92f21f700e 100644
--- a/MathLib/LinAlg/Lis/LisMatrix.cpp
+++ b/MathLib/LinAlg/Lis/LisMatrix.cpp
@@ -17,7 +17,7 @@
 #include <cmath>
 #include <cstdlib>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Error.h"
 #include "LisVector.h"
diff --git a/MathLib/LinAlg/Lis/LisOption.h b/MathLib/LinAlg/Lis/LisOption.h
index 03dd2c7847f7a22f9064719ec687b20964b9dcf8..30160602b3a4e471eaedc78a5f3123e90ff3de62 100644
--- a/MathLib/LinAlg/Lis/LisOption.h
+++ b/MathLib/LinAlg/Lis/LisOption.h
@@ -17,7 +17,7 @@
 #include <string>
 #include <map>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "MathLib/LinAlg/LinearSolverOptions.h"
@@ -47,7 +47,7 @@ struct LisOption final
             if (auto s = options->getConfigParameterOptional<std::string>("lis")) {
                 if (!s->empty()) {
                     _option_string += " " + *s;
-                    INFO("Lis options: '%s'", _option_string.c_str());
+                    INFO("Lis options: '{:s}'", _option_string.c_str());
                 }
             }
         }
diff --git a/MathLib/LinAlg/PETSc/PETScLinearSolver.h b/MathLib/LinAlg/PETSc/PETScLinearSolver.h
index 6d367fb53c59054d550a65fbb3ced96a7527caf9..40a695cce5bd23cf14303ed2094a5fa3d4a269ee 100644
--- a/MathLib/LinAlg/PETSc/PETScLinearSolver.h
+++ b/MathLib/LinAlg/PETSc/PETScLinearSolver.h
@@ -20,7 +20,7 @@
 
 #include <petscksp.h>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 
diff --git a/MathLib/Nonlinear/Root1D.h b/MathLib/Nonlinear/Root1D.h
index 0849a8c37c35dc6921c5bf5cafdb51ae2aad4527..a2934fd8a555ddbb62b156dd86f0fdc4d6032b13 100644
--- a/MathLib/Nonlinear/Root1D.h
+++ b/MathLib/Nonlinear/Root1D.h
@@ -14,8 +14,8 @@
 #include <cmath>
 #include <limits>
 #include <type_traits>
-#include <logog/include/logog.hpp>
 #include "BaseLib/Error.h"
+#include "BaseLib/Logging.h"
 
 namespace MathLib
 {
diff --git a/MathLib/ODE/CVodeSolver.cpp b/MathLib/ODE/CVodeSolver.cpp
index 46b07195b583a4847969e13b00b489689255ab0a..655ce7140e23f860db369ca6f793acc52173b966 100644
--- a/MathLib/ODE/CVodeSolver.cpp
+++ b/MathLib/ODE/CVodeSolver.cpp
@@ -10,7 +10,7 @@
 #include "CVodeSolver.h"
 
 #include <cassert>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <cvode/cvode.h>             /* prototypes for CVODE fcts., consts. */
 #include <nvector/nvector_serial.h>  /* serial N_Vector types, fcts., macros */
@@ -33,8 +33,8 @@ void check_error(std::string const& f_name, int const error_flag)
 {
     if (error_flag != CV_SUCCESS)
     {
-        OGS_FATAL("CVodeSolver: %s failed with error flag %d.", f_name.c_str(),
-            error_flag);
+        OGS_FATAL("CVodeSolver: {:s} failed with error flag {:d}.",
+                  f_name.c_str(), error_flag);
     }
 }
 
@@ -59,10 +59,11 @@ void printStats(void* cvode_mem)
     check_error("CVodeGetNumGEvals", CVodeGetNumGEvals(cvode_mem, &nge));
 
     DBUG("Sundials CVode solver. Statistics:");
-    DBUG("nst = %-6ld  nfe = %-6ld nsetups = %-6ld nfeLS = %-6ld nje = %ld",
-         nst, nfe, nsetups, nfeLS, nje);
-    DBUG("nni = %-6ld ncfn = %-6ld    netf = %-6ld   nge = %ld\n", nni, ncfn,
-         netf, nge);
+    DBUG(
+        "nst = {:<0d}  nfe = {:<0d} nsetups = {:<0d} nfeLS = {:<0d} nje = {:d}",
+        nst, nfe, nsetups, nfeLS, nje);
+    DBUG("nni = {:<0d} ncfn = {:<0d}    netf = {:<0d}   nge = {:d}\n", nni,
+         ncfn, netf, nge);
 }
 
 //! @}
@@ -134,7 +135,7 @@ CVodeSolverImpl::CVodeSolverImpl(const BaseLib::ConfigTree& config,
         //! \ogs_file_param{ode_solver__CVODE__linear_multistep_method}
         config.getConfigParameterOptional<std::string>("linear_multistep_method"))
     {
-        DBUG("setting linear multistep method (config: %s)", param->c_str());
+        DBUG("setting linear multistep method (config: {:s})", param->c_str());
 
         if (*param == "Adams")
         {
@@ -146,7 +147,7 @@ CVodeSolverImpl::CVodeSolverImpl(const BaseLib::ConfigTree& config,
         }
         else
         {
-            OGS_FATAL("unknown linear multistep method: %s", param->c_str());
+            OGS_FATAL("unknown linear multistep method: {:s}", param->c_str());
         }
     }
 
@@ -154,7 +155,8 @@ CVodeSolverImpl::CVodeSolverImpl(const BaseLib::ConfigTree& config,
         //! \ogs_file_param{ode_solver__CVODE__nonlinear_solver_iteration}
         config.getConfigParameterOptional<std::string>("nonlinear_solver_iteration"))
     {
-        DBUG("setting nonlinear solver iteration (config: %s)", param->c_str());
+        DBUG("setting nonlinear solver iteration (config: {:s})",
+             param->c_str());
 
         if (*param == "Functional")
         {
@@ -166,7 +168,8 @@ CVodeSolverImpl::CVodeSolverImpl(const BaseLib::ConfigTree& config,
         }
         else
         {
-            OGS_FATAL("unknown nonlinear solver iteration: %s", param->c_str());
+            OGS_FATAL("unknown nonlinear solver iteration: {:s}",
+                      param->c_str());
         }
     }
 
diff --git a/MathLib/ODE/ODESolverBuilder.h b/MathLib/ODE/ODESolverBuilder.h
index 3d44dbe21c965a87e36b65ad55e531c6dc7d6728..5919346c7a06f600a192f2e5d37493186ae0b723 100644
--- a/MathLib/ODE/ODESolverBuilder.h
+++ b/MathLib/ODE/ODESolverBuilder.h
@@ -10,7 +10,7 @@
 
 #pragma once
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Error.h"
 #include "ODESolver.h"
diff --git a/MeshGeoToolsLib/AppendLinesAlongPolyline.cpp b/MeshGeoToolsLib/AppendLinesAlongPolyline.cpp
index 30d50ec3c94246f69b12c4e0b86e49052ea4272d..f5474e8dace997033683c5e6d1e08b9b2f4328fd 100644
--- a/MeshGeoToolsLib/AppendLinesAlongPolyline.cpp
+++ b/MeshGeoToolsLib/AppendLinesAlongPolyline.cpp
@@ -8,7 +8,7 @@
 
 #include "AppendLinesAlongPolyline.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Polyline.h"
 #include "GeoLib/PolylineVec.h"
@@ -52,7 +52,7 @@ std::unique_ptr<MeshLib::Mesh> appendLinesAlongPolylines(
         if (vec_nodes_on_ply.empty()) {
             std::string ply_name;
             ply_vec.getNameOfElementByID(k, ply_name);
-            INFO("No nodes found on polyline %s", ply_name.c_str());
+            INFO("No nodes found on polyline {:s}", ply_name.c_str());
             continue;
         }
 
diff --git a/MeshGeoToolsLib/BoundaryElementsAlongPolyline.cpp b/MeshGeoToolsLib/BoundaryElementsAlongPolyline.cpp
index 2ac93a42e3c0628e1b3fb53089976937b984d812..a44cb59745bc06cb1d488366ad3ced0d4ea281c9 100644
--- a/MeshGeoToolsLib/BoundaryElementsAlongPolyline.cpp
+++ b/MeshGeoToolsLib/BoundaryElementsAlongPolyline.cpp
@@ -147,7 +147,7 @@ MeshLib::Element* BoundaryElementsAlongPolyline::modifyEdgeNodeOrdering(
         }
         else
         {
-            OGS_FATAL("Not implemented for element type %s",
+            OGS_FATAL("Not implemented for element type {:s}",
                       typeid(edge).name());
         }
 
diff --git a/MeshGeoToolsLib/BoundaryElementsAtPoint.cpp b/MeshGeoToolsLib/BoundaryElementsAtPoint.cpp
index 1bda95b46e65404f1f83020e72fca5c63a276154..e0ecfe0b7453484ae9cc872944f8a85cfa0cb0bd 100644
--- a/MeshGeoToolsLib/BoundaryElementsAtPoint.cpp
+++ b/MeshGeoToolsLib/BoundaryElementsAtPoint.cpp
@@ -29,7 +29,7 @@ BoundaryElementsAtPoint::BoundaryElementsAtPoint(
     {
         OGS_FATAL(
             "BoundaryElementsAtPoint: the mesh node searcher was unable to "
-            "locate the point (%f, %f, %f) in the mesh.",
+            "locate the point ({:f}, {:f}, {:f}) in the mesh.",
             _point[0], _point[1], _point[2]);
     }
     if (node_ids.size() == 1)
@@ -52,9 +52,10 @@ BoundaryElementsAtPoint::BoundaryElementsAtPoint(
     if (!multiple_nodes_allowed)
     {
         OGS_FATAL(
-            "BoundaryElementsAtPoint: the mesh node searcher found %d points "
-            "near the requested point (%f, %f, %f) in the mesh, while exactly "
-            "one is expected. Node  (id=%d) (%f, %f, %f) has distance %f.",
+            "BoundaryElementsAtPoint: the mesh node searcher found {:d} points "
+            "near the requested point ({:f}, {:f}, {:f}) in the mesh, while "
+            "exactly one is expected. Node  (id={:d}) ({:f}, {:f}, {:f}) has "
+            "distance {:f}.",
             node_ids.size(), _point[0], _point[1], _point[2],
             mesh_nodes[nearest_node_id]->getID(),
             (*mesh_nodes[nearest_node_id])[0],
@@ -63,14 +64,13 @@ BoundaryElementsAtPoint::BoundaryElementsAtPoint(
             MathLib::sqrDist(*mesh_nodes[nearest_node_id], point));
     }
     WARN(
-        "BoundaryElementsAtPoint: the mesh node searcher found %d points "
-        "near the requested point (%f, %f, %f) in the mesh, while exactly "
-        "one is expected. Node  (id=%d) (%f, %f, %f) has distance %f.",
+        "BoundaryElementsAtPoint: the mesh node searcher found {:d} points "
+        "near the requested point ({:f}, {:f}, {:f}) in the mesh, while "
+        "exactly one is expected. Node  (id={:d}) ({:f}, {:f}, {:f}) has "
+        "distance {:f}.",
         node_ids.size(), _point[0], _point[1], _point[2],
-        mesh_nodes[nearest_node_id]->getID(),
-        (*mesh_nodes[nearest_node_id])[0],
-        (*mesh_nodes[nearest_node_id])[1],
-        (*mesh_nodes[nearest_node_id])[2],
+        mesh_nodes[nearest_node_id]->getID(), (*mesh_nodes[nearest_node_id])[0],
+        (*mesh_nodes[nearest_node_id])[1], (*mesh_nodes[nearest_node_id])[2],
         MathLib::sqrDist(*mesh_nodes[nearest_node_id], point));
 
     std::array<MeshLib::Node*, 1> const nodes = {
diff --git a/MeshGeoToolsLib/CMakeLists.txt b/MeshGeoToolsLib/CMakeLists.txt
index 4bafd9791befbbb8650795751bc0ea556e585e60..fa25cf3497c3787ce28193edac7e272614cb3217 100644
--- a/MeshGeoToolsLib/CMakeLists.txt
+++ b/MeshGeoToolsLib/CMakeLists.txt
@@ -6,4 +6,4 @@ ogs_add_library(MeshGeoToolsLib ${SOURCES})
 
 target_link_libraries(MeshGeoToolsLib
                       PUBLIC GeoLib MathLib
-                      PRIVATE BaseLib MeshLib logog)
+                      PRIVATE BaseLib MeshLib spdlog::spdlog)
diff --git a/MeshGeoToolsLib/ConstructMeshesFromGeometries.cpp b/MeshGeoToolsLib/ConstructMeshesFromGeometries.cpp
index 85e6bc55e9843fef1586a280e507f367edc9dac1..81ca8381a87a4180572414e8f5a1c1f138ca6b5f 100644
--- a/MeshGeoToolsLib/ConstructMeshesFromGeometries.cpp
+++ b/MeshGeoToolsLib/ConstructMeshesFromGeometries.cpp
@@ -9,7 +9,7 @@
 
 #include "ConstructMeshesFromGeometries.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
@@ -58,7 +58,7 @@ constructAdditionalMeshesFromGeometries(
 
             auto const& geometry = *vec_data[i];
 
-            DBUG("Creating mesh from geometry %s %s.", vec_name.c_str(),
+            DBUG("Creating mesh from geometry {:s} {:s}.", vec_name.c_str(),
                  geometry_name.c_str());
 
             additional_meshes.emplace_back(createMeshFromElementSelection(
diff --git a/MeshGeoToolsLib/CreateSearchLength.cpp b/MeshGeoToolsLib/CreateSearchLength.cpp
index bd8cb76a35c320888bc8d04e5d40b209dde63f75..b5371b158c00a1863392bdf622e404a63d35f144 100644
--- a/MeshGeoToolsLib/CreateSearchLength.cpp
+++ b/MeshGeoToolsLib/CreateSearchLength.cpp
@@ -44,7 +44,7 @@ std::unique_ptr<MeshGeoToolsLib::SearchLength> createSearchLengthAlgorithm(
         //! \ogs_file_param_special{prj__search_length_algorithm__heuristic}
         return std::make_unique<HeuristicSearchLength>(mesh);
     }
-    OGS_FATAL("Unknown search length algorithm type '%s'.", type.c_str());
+    OGS_FATAL("Unknown search length algorithm type '{:s}'.", type.c_str());
 }
 
 }  // end namespace MeshGeoToolsLib
diff --git a/MeshGeoToolsLib/GeoMapper.cpp b/MeshGeoToolsLib/GeoMapper.cpp
index 3ddf204318c91a661b7270720b512e99005b01c0..5cd7098a00a824efd59e1ae556d665ec9fdc6d34 100644
--- a/MeshGeoToolsLib/GeoMapper.cpp
+++ b/MeshGeoToolsLib/GeoMapper.cpp
@@ -18,7 +18,7 @@
 #include <sstream>
 #include <numeric>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Algorithm.h"
 
@@ -53,7 +53,7 @@ void GeoMapper::mapOnDEM(std::unique_ptr<GeoLib::Raster const> raster)
 {
     std::vector<GeoLib::Point*> const* pnts(_geo_objects.getPointVec(_geo_name));
     if (! pnts) {
-        ERR("Geometry '%s' does not exist.", _geo_name.c_str());
+        ERR("Geometry '{:s}' does not exist.", _geo_name.c_str());
         return;
     }
     _raster = std::move(raster);
@@ -69,7 +69,7 @@ void GeoMapper::mapOnMesh(MeshLib::Mesh const*const mesh)
 {
     std::vector<GeoLib::Point*> const* pnts(_geo_objects.getPointVec(_geo_name));
     if (! pnts) {
-        ERR("Geometry '%s' does not exist.", _geo_name.c_str());
+        ERR("Geometry '{:s}' does not exist.", _geo_name.c_str());
         return;
     }
 
@@ -115,7 +115,7 @@ void GeoMapper::mapToConstantValue(double value)
     std::vector<GeoLib::Point*> const* points (this->_geo_objects.getPointVec(this->_geo_name));
     if (points == nullptr)
     {
-        ERR("Geometry '%s' not found.", this->_geo_name.c_str());
+        ERR("Geometry '{:s}' not found.", this->_geo_name.c_str());
         return;
     }
     std::for_each(points->begin(), points->end(), [value](GeoLib::Point* pnt){ (*pnt)[2] = value; });
@@ -306,7 +306,7 @@ static std::vector<GeoLib::LineSegment> createSubSegmentsForElement(
             out << k << " " << intersections[k] << "\n";
         }
         out << "Could not map segment on element. Aborting.\n";
-        OGS_FATAL("%s", out.str().c_str());
+        OGS_FATAL("{:s}", out.str().c_str());
     }
 
     if (intersections.size() == 1 && elem == beg_elem)
@@ -476,7 +476,7 @@ static bool snapPointToElementNode(MathLib::Point3d& p,
             p = node;
 #ifdef DEBUG_GEOMAPPER
             out << "to " << p;
-            DBUG("%s", out.str().c_str());
+            DBUG("{:s}", out.str().c_str());
 #endif
             return true;
         }
diff --git a/MeshGeoToolsLib/HeuristicSearchLength.cpp b/MeshGeoToolsLib/HeuristicSearchLength.cpp
index d1ac7abbf96e8d5bd5fe8d3ed97fadc4c7e08728..85558faeadaf5f50786db50c0dce964af0f552fd 100644
--- a/MeshGeoToolsLib/HeuristicSearchLength.cpp
+++ b/MeshGeoToolsLib/HeuristicSearchLength.cpp
@@ -11,7 +11,7 @@
 
 #include "HeuristicSearchLength.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Elements/Element.h"
 
@@ -72,7 +72,7 @@ HeuristicSearchLength::HeuristicSearchLength(MeshLib::Mesh const& mesh, LengthTy
 
     DBUG(
         "[MeshNodeSearcher::MeshNodeSearcher] Calculated search length for "
-        "mesh '%s' is %f.",
+        "mesh '{:s}' is {:f}.",
         _mesh.getName().c_str(), _search_length);
 }
 
diff --git a/MeshGeoToolsLib/IdentifySubdomainMesh.cpp b/MeshGeoToolsLib/IdentifySubdomainMesh.cpp
index c654562c379d23d0be21dda0cab3756fd45a9196..ee3977f59b7c84273b547f0da9d3e45ea7535876 100644
--- a/MeshGeoToolsLib/IdentifySubdomainMesh.cpp
+++ b/MeshGeoToolsLib/IdentifySubdomainMesh.cpp
@@ -36,8 +36,8 @@ std::vector<std::size_t> identifySubdomainMeshNodes(
     {
         OGS_FATAL(
             "Expected to find exactly one node in the bulk mesh for each node "
-            "of the subdomain; Found %d nodes in the bulk mesh out of %d nodes "
-            "in the subdomain.",
+            "of the subdomain; Found {:d} nodes in the bulk mesh out of {:d} "
+            "nodes in the subdomain.",
             bulk_node_ids.size(), subdomain_mesh.getNumberOfNodes());
     }
 
@@ -125,11 +125,11 @@ std::vector<std::vector<std::size_t>> identifySubdomainMeshElements(
 
         if (bulk_element_ids.empty())
         {
-            ERR("No element could be found for the subdomain element %d. "
+            ERR("No element could be found for the subdomain element {:d}. "
                 "Corresponding bulk mesh node ids are:",
                 e->getID());
             for (auto const i : element_node_ids_bulk)
-                ERR("\t%d", i);
+                ERR("\t{:d}", i);
             OGS_FATAL(
                 "Expect at least one element to be found in the bulk mesh.");
         }
@@ -162,8 +162,8 @@ void updateOrCheckExistingSubdomainProperty(
                    begin(values), end(values)))
     {
         INFO(
-            "There is already a '%s' property present in the subdomain mesh "
-            "'%s' and it is equal to the newly computed values.",
+            "There is already a '{:s}' property present in the subdomain mesh "
+            "'{:s}' and it is equal to the newly computed values.",
             property_name.c_str(), mesh.getName().c_str());
         return;
     }
@@ -172,8 +172,8 @@ void updateOrCheckExistingSubdomainProperty(
     // Property differs. Notify and update if forced.
     //
     WARN(
-        "There is already a '%s' property present in the subdomain mesh '%s' "
-        "and it is not equal to the newly computed values.",
+        "There is already a '{:s}' property present in the subdomain mesh "
+        "'{:s}' and it is not equal to the newly computed values.",
         property_name.c_str(),
         mesh.getName().c_str());
 
@@ -182,7 +182,7 @@ void updateOrCheckExistingSubdomainProperty(
         OGS_FATAL("The force overwrite flag was not specified, exiting.");
     }
 
-    INFO("Overwriting '%s' property.", property_name.c_str());
+    INFO("Overwriting '{:s}' property.", property_name.c_str());
     original_property.resize(values.size());
     std::copy(begin(values), end(values), begin(original_property));
 }
diff --git a/MeshGeoToolsLib/MeshNodeSearcher.cpp b/MeshGeoToolsLib/MeshNodeSearcher.cpp
index efb3600bf28fcbe1a96684104d07b89d4a3fcb53..4be0bc8f023f38a6b8a04e7c08fa95f2c5255abf 100644
--- a/MeshGeoToolsLib/MeshNodeSearcher.cpp
+++ b/MeshGeoToolsLib/MeshNodeSearcher.cpp
@@ -18,7 +18,7 @@
 #include "MeshNodesAlongSurface.h"
 #include "MeshNodesOnPoint.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Point.h"
 #include "GeoLib/Polyline.h"
@@ -41,7 +41,7 @@ MeshNodeSearcher::MeshNodeSearcher(
       _search_length_algorithm(std::move(search_length_algorithm)),
       _search_all_nodes(search_all_nodes)
 {
-    DBUG("The search length for mesh '%s' is %e.", _mesh.getName().c_str(),
+    DBUG("The search length for mesh '{:s}' is {:e}.", _mesh.getName().c_str(),
          _search_length_algorithm->getSearchLength());
 }
 
@@ -103,8 +103,8 @@ std::vector<std::size_t> MeshNodeSearcher::getMeshNodeIDs(
         if (ids.empty())
         {
             OGS_FATAL(
-                "No nodes could be found in the mesh for point %d : (%g, %g, "
-                "%g) in %g epsilon radius in the mesh '%s'",
+                "No nodes could be found in the mesh for point {:d} : ({:g}, "
+                "{:g}, {:g}) in {:g} epsilon radius in the mesh '{:s}'",
                 p.getID(), p[0], p[1], p[2], epsilon_radius,
                 _mesh.getName().c_str());
         }
@@ -120,9 +120,9 @@ std::vector<std::size_t> MeshNodeSearcher::getMeshNodeIDs(
                    << "\n";
             }
             OGS_FATAL(
-                "Found %d nodes in the mesh for point %d : (%g, %g, %g) in %g "
-                "epsilon radius in the mesh '%s'. Expected to find exactly one "
-                "node.\n%s",
+                "Found {:d} nodes in the mesh for point {:d} : ({:g}, {:g}, "
+                "{:g}) in {:g} epsilon radius in the mesh '{:s}'. Expected to "
+                "find exactly one node.\n{:s}",
                 ids.size(), p.getID(), p[0], p[1], p[2], epsilon_radius,
                 _mesh.getName().c_str(), ss.str().c_str());
         }
diff --git a/MeshLib/CMakeLists.txt b/MeshLib/CMakeLists.txt
index b739688c335effc0e826fbbc0b3780e660372115..bd46787bfae62118f372fd70de5b28df3018cc9f 100644
--- a/MeshLib/CMakeLists.txt
+++ b/MeshLib/CMakeLists.txt
@@ -23,9 +23,7 @@ endif()
 # Create the library
 ogs_add_library(MeshLib ${SOURCES})
 
-target_link_libraries(MeshLib
-                      PUBLIC BaseLib
-                             GeoLib
-                             MathLib
-                             logog
-                             ${VTK_LIBRARIES})
+target_link_libraries(
+    MeshLib
+    PUBLIC BaseLib GeoLib MathLib ${VTK_LIBRARIES}
+    PRIVATE spdlog::spdlog)
diff --git a/MeshLib/ElementStatus.cpp b/MeshLib/ElementStatus.cpp
index c0c69fe323395404aa905618331126118c21c4e6..f000e70f9832c5a6fcdc8026c36480606da4fe79 100644
--- a/MeshLib/ElementStatus.cpp
+++ b/MeshLib/ElementStatus.cpp
@@ -71,7 +71,7 @@ ElementStatus::ElementStatus(Mesh const* const mesh,
     }
 
     DBUG(
-        "Deactivated %d materials and resulting active %d nodes and %d "
+        "Deactivated {:d} materials and resulting active {:d} nodes and {:d} "
         "elements",
         vec_inactive_matIDs.size(),
         _vec_active_nodes.size(),
diff --git a/MeshLib/Elements/EdgeReturn.cpp b/MeshLib/Elements/EdgeReturn.cpp
index 361fe3567925903da3dbddd167253a81eec7bfff..12952e9644c29023f918e2a48a739240dec1c347 100644
--- a/MeshLib/Elements/EdgeReturn.cpp
+++ b/MeshLib/Elements/EdgeReturn.cpp
@@ -10,7 +10,7 @@
 
 #include "EdgeReturn.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Node.h"
 #include "Element.h"
diff --git a/MeshLib/Elements/Element.cpp b/MeshLib/Elements/Element.cpp
index 9b15aa45969c3a505a61141d4794e04a62a27385..50b5f0b6f25493ab084c3fbd3ea396ddeeb26df6 100644
--- a/MeshLib/Elements/Element.cpp
+++ b/MeshLib/Elements/Element.cpp
@@ -14,7 +14,7 @@
 
 #include "Element.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/GeometricBasics.h"
 #include "MathLib/MathTools.h"
@@ -164,7 +164,8 @@ const Node* Element::getNode(unsigned i) const
         return _nodes[i];
     }
 #ifndef NDEBUG
-    ERR("Error in MeshLib::Element::getNode() - Index %d in %s", i, MeshElemType2String(getGeomType()).c_str());
+    ERR("Error in MeshLib::Element::getNode() - Index {:d} in {:s}", i,
+        MeshElemType2String(getGeomType()).c_str());
     return nullptr;
 #endif
 }
@@ -261,7 +262,7 @@ bool isPointInElementXY(MathLib::Point3d const& p, Element const& e)
                MathLib::isPointInTriangleXY(p, n0, n2, n3);
     }
 
-    WARN("isPointInElementXY: element type '%s' is not supported.",
+    WARN("isPointInElementXY: element type '{:s}' is not supported.",
          MeshLib::MeshElemType2String(e.getGeomType()).c_str());
     return false;
 }
diff --git a/MeshLib/Elements/HexRule20.cpp b/MeshLib/Elements/HexRule20.cpp
index 9484fe287ca62da0e027d67336f2547585f67e77..c854c0faa83d42d05eb81c22bad8aeffc33f9f6e 100644
--- a/MeshLib/Elements/HexRule20.cpp
+++ b/MeshLib/Elements/HexRule20.cpp
@@ -12,7 +12,7 @@
 
 #include <array>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Node.h"
 #include "Quad.h"
@@ -55,7 +55,7 @@ const Element* HexRule20::getFace(const Element* e, unsigned i)
         }
         return new Quad8(nodes, e->getID());
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/HexRule8.cpp b/MeshLib/Elements/HexRule8.cpp
index 4eb944b58797fbcf134026a6375be9ae88884106..31526574a6527abc71ba0c4ff8dc1c0c1f2a72e3 100644
--- a/MeshLib/Elements/HexRule8.cpp
+++ b/MeshLib/Elements/HexRule8.cpp
@@ -12,7 +12,7 @@
 
 #include <array>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/GeometricBasics.h"
 
@@ -59,7 +59,7 @@ const Element* HexRule8::getFace(const Element* e, unsigned i)
         }
         return new Quad(nodes, e->getID());
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/LineRule2.cpp b/MeshLib/Elements/LineRule2.cpp
index b9f2130397c73009b48a7276bc54e8a3cfed7f79..998142dd73253459bcf6220f425339ce950163ea 100644
--- a/MeshLib/Elements/LineRule2.cpp
+++ b/MeshLib/Elements/LineRule2.cpp
@@ -10,8 +10,6 @@
 
 #include "LineRule2.h"
 
-#include <logog/include/logog.hpp>
-
 #include "MeshLib/Node.h"
 
 namespace MeshLib {
diff --git a/MeshLib/Elements/MapBulkElementPoint.cpp b/MeshLib/Elements/MapBulkElementPoint.cpp
index 5df1657b1ab41dbe6e9922399293c1553e8c3727..538e66310d43da14d2f288e7227a2a4ad51c44ad 100644
--- a/MeshLib/Elements/MapBulkElementPoint.cpp
+++ b/MeshLib/Elements/MapBulkElementPoint.cpp
@@ -28,7 +28,7 @@ MathLib::Point3d getBulkElementPoint(MeshLib::Quad const& /*quad*/,
     case 3:
         return MathLib::Point3d{std::array<double, 3>{{0.0, 1.0 - wp[0], 0.0}}};
     default:
-        OGS_FATAL("Invalid face id '%u' for the quad.", face_id);
+        OGS_FATAL("Invalid face id '{:d}' for the quad.", face_id);
     }
 }
 
@@ -55,7 +55,7 @@ MathLib::Point3d getBulkElementPoint(MeshLib::Hex const& /*hex*/,
         case 5:
             return MathLib::Point3d{std::array<double, 3>{{wp[0], wp[1], 1.0}}};
         default:
-            OGS_FATAL("Invalid face id '%u' for the hexahedron.", face_id);
+            OGS_FATAL("Invalid face id '{:d}' for the hexahedron.", face_id);
     }
 }
 
@@ -76,7 +76,7 @@ MathLib::Point3d getBulkElementPoint(MeshLib::Tet const& /*tet*/,
             return MathLib::Point3d{
                 std::array<double, 3>{{0, 1 - wp[0], wp[1]}}};
         default:
-            OGS_FATAL("Invalid face id '%u' for the tetrahedron.", face_id);
+            OGS_FATAL("Invalid face id '{:d}' for the tetrahedron.", face_id);
     }
 }
 
@@ -102,7 +102,7 @@ MathLib::Point3d getBulkElementPoint(MeshLib::Prism const& /*prism*/,
             return MathLib::Point3d{
                 std::array<double, 3>{{wp[0], wp[1], 1.0}}};
         default:
-            OGS_FATAL("Invalid face id '%u' for the prism.", face_id);
+            OGS_FATAL("Invalid face id '{:d}' for the prism.", face_id);
     }
 }
 
@@ -117,7 +117,7 @@ MathLib::Point3d getBulkElementPoint(MeshLib::Mesh const& mesh,
         MeshLib::Quad const& quad(*dynamic_cast<MeshLib::Quad const*>(element));
         return getBulkElementPoint(quad, bulk_face_id, wp);
     }
-    OGS_FATAL("Wrong cell type '%s' or functionality not yet implemented.",
+    OGS_FATAL("Wrong cell type '{:s}' or functionality not yet implemented.",
               MeshLib::CellType2String(element->getCellType()).c_str());
 }
 
@@ -143,7 +143,7 @@ MathLib::Point3d getBulkElementPoint(MeshLib::Mesh const& mesh,
         MeshLib::Tet const& tet = *static_cast<MeshLib::Tet const*>(element);
         return getBulkElementPoint(tet, bulk_face_id, wp);
     }
-    OGS_FATAL("Wrong cell type '%s' or functionality not yet implemented.",
+    OGS_FATAL("Wrong cell type '{:s}' or functionality not yet implemented.",
               MeshLib::CellType2String(element->getCellType()).c_str());
 }
 
diff --git a/MeshLib/Elements/PrismRule15.cpp b/MeshLib/Elements/PrismRule15.cpp
index 1845445e728d6525ed7a1e2ca8d9cef7dc929500..df497e8032725b4cfe73962517dfa63069b163e7 100644
--- a/MeshLib/Elements/PrismRule15.cpp
+++ b/MeshLib/Elements/PrismRule15.cpp
@@ -10,7 +10,7 @@
 
 #include "PrismRule15.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Node.h"
 #include "Quad.h"
@@ -60,7 +60,7 @@ const Element* PrismRule15::getFace(const Element* e, unsigned i)
 
         return new Quad8(nodes);
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/PrismRule6.cpp b/MeshLib/Elements/PrismRule6.cpp
index 8f7a45f821b0f24a771cdee0f5e5e1531fdb8ebe..5ea981fe4f8582d769d81b84fb06e22670d823ab 100644
--- a/MeshLib/Elements/PrismRule6.cpp
+++ b/MeshLib/Elements/PrismRule6.cpp
@@ -10,7 +10,7 @@
 
 #include "PrismRule6.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/GeometricBasics.h"
 
@@ -62,7 +62,7 @@ const Element* PrismRule6::getFace(const Element* e, unsigned i)
 
         return new Quad(nodes);
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/PyramidRule13.cpp b/MeshLib/Elements/PyramidRule13.cpp
index be8b51cafd80c24595ee9556118ebfb3c41b65ea..9235df3c01d2d01f6cd087d781a1b8b9f4bc2395 100644
--- a/MeshLib/Elements/PyramidRule13.cpp
+++ b/MeshLib/Elements/PyramidRule13.cpp
@@ -10,7 +10,7 @@
 
 #include "PyramidRule13.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Node.h"
 #include "Quad.h"
@@ -59,7 +59,7 @@ const Element* PyramidRule13::getFace(const Element* e, unsigned i)
 
         return new Quad8(nodes, e->getID());
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/PyramidRule5.cpp b/MeshLib/Elements/PyramidRule5.cpp
index e4f4db04ec2a7c9d5360319a5f1e1ea42659a0f5..eea3de3bafd60c5592b30cb97109212b058d4189 100644
--- a/MeshLib/Elements/PyramidRule5.cpp
+++ b/MeshLib/Elements/PyramidRule5.cpp
@@ -10,7 +10,7 @@
 
 #include "PyramidRule5.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/GeometricBasics.h"
 
@@ -61,7 +61,7 @@ const Element* PyramidRule5::getFace(const Element* e, unsigned i)
 
         return new Quad(nodes, e->getID());
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/QuadRule4.cpp b/MeshLib/Elements/QuadRule4.cpp
index e8d41ec384539446fa82f8fdbb9799ce24676c08..276a8bd0108086d39b374ad9253f5cdd6b02283a 100644
--- a/MeshLib/Elements/QuadRule4.cpp
+++ b/MeshLib/Elements/QuadRule4.cpp
@@ -10,8 +10,6 @@
 
 #include "QuadRule4.h"
 
-#include <logog/include/logog.hpp>
-
 #include "MathLib/GeometricBasics.h"
 
 #include "MeshLib/Node.h"
diff --git a/MeshLib/Elements/TemplateElement.h b/MeshLib/Elements/TemplateElement.h
index a05d7cab6e666d519afe60f273e3ff7aeb4ffdf6..2db18f3ba50876a475bf26dc1f78b0daaf1b7c81 100644
--- a/MeshLib/Elements/TemplateElement.h
+++ b/MeshLib/Elements/TemplateElement.h
@@ -98,7 +98,7 @@ public:
         {
             return ELEMENT_RULE::getFace(this, i);
         }
-        OGS_FATAL("TemplateElement::getBoundary for boundary %u failed.", i);
+        OGS_FATAL("TemplateElement::getBoundary for boundary {:d} failed.", i);
     }
 
     /// Returns the number of boundaries of the element.
diff --git a/MeshLib/Elements/TetRule10.cpp b/MeshLib/Elements/TetRule10.cpp
index 7d41675c5b39abc5a9818fe8d91a7ccc628dd0b1..1a75211da36bec9ab57451e622a4a0ee1af81416 100644
--- a/MeshLib/Elements/TetRule10.cpp
+++ b/MeshLib/Elements/TetRule10.cpp
@@ -12,7 +12,7 @@
 
 #include <array>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Node.h"
 #include "Tri.h"
@@ -49,7 +49,7 @@ const Element* TetRule10::getFace(const Element* e, unsigned i)
         }
         return new Tri6(nodes, e->getID());
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/TetRule4.cpp b/MeshLib/Elements/TetRule4.cpp
index 512fe1c9dd0abd993f6de62fd02703f79a58a543..26fa1a874971fdbc1856ea85bd8904cf34f172fb 100644
--- a/MeshLib/Elements/TetRule4.cpp
+++ b/MeshLib/Elements/TetRule4.cpp
@@ -12,7 +12,7 @@
 
 #include <array>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/GeometricBasics.h"
 
@@ -51,7 +51,7 @@ const Element* TetRule4::getFace(const Element* e, unsigned i)
         }
         return new Tri(nodes, e->getID());
     }
-    ERR("Error in MeshLib::Element::getFace() - Index %d does not exist.", i);
+    ERR("Error in MeshLib::Element::getFace() - Index {:d} does not exist.", i);
     return nullptr;
 }
 
diff --git a/MeshLib/Elements/TriRule3.cpp b/MeshLib/Elements/TriRule3.cpp
index cd4981201f090608507428429d129b8c0266ab7e..9f5c1ee640a5f1f6efebb1fae010257c0a42e4f9 100644
--- a/MeshLib/Elements/TriRule3.cpp
+++ b/MeshLib/Elements/TriRule3.cpp
@@ -10,8 +10,6 @@
 
 #include "TriRule3.h"
 
-#include <logog/include/logog.hpp>
-
 #include "MathLib/GeometricBasics.h"
 
 #include "MeshLib/Node.h"
diff --git a/MeshLib/IO/Legacy/MeshIO.cpp b/MeshLib/IO/Legacy/MeshIO.cpp
index 2a1d94c5d14db1d401808bbad7d8b44f8c108bfa..c69ee8be54c1dbeec4e27f20c4a3572e5cc3cb12 100644
--- a/MeshLib/IO/Legacy/MeshIO.cpp
+++ b/MeshLib/IO/Legacy/MeshIO.cpp
@@ -22,7 +22,7 @@
 #include <memory>
 #include <sstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -46,7 +46,8 @@ MeshLib::Mesh* MeshIO::loadMeshFromFile(const std::string& file_name)
     std::ifstream in (file_name.c_str(),std::ios::in);
     if (!in.is_open())
     {
-        WARN("MeshIO::loadMeshFromFile() - Could not open file %s.", file_name.c_str());
+        WARN("MeshIO::loadMeshFromFile() - Could not open file {:s}.",
+             file_name.c_str());
         return nullptr;
     }
 
@@ -105,8 +106,9 @@ MeshLib::Mesh* MeshIO::loadMeshFromFile(const std::string& file_name)
                     materials.push_back(readMaterialID(ss));
                     MeshLib::Element *elem(readElement(ss,nodes));
                     if (elem == nullptr) {
-                        ERR("Reading mesh element %d from file '%s' failed.", i,
-                            file_name.c_str());
+                        ERR("Reading mesh element {:d} from file '{:s}' "
+                            "failed.",
+                            i, file_name.c_str());
                         // clean up the elements vector
                         std::for_each(elements.begin(), elements.end(),
                             std::default_delete<MeshLib::Element>());
@@ -146,8 +148,8 @@ MeshLib::Mesh* MeshIO::loadMeshFromFile(const std::string& file_name)
                                  materials.cend());
         }
         INFO("\t... finished.");
-        INFO("Nr. Nodes: %d.", nodes.size());
-        INFO("Nr. Elements: %d.", elements.size());
+        INFO("Nr. Nodes: {:d}.", nodes.size());
+        INFO("Nr. Elements: {:d}.", elements.size());
 
         in.close();
         return mesh;
diff --git a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
index 4d33bfa7674fce3cb4afd3a82b18d25383bc763b..e3143fdd1e6a1151b8369babcdde59695512c2c3 100644
--- a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
+++ b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp
@@ -15,7 +15,7 @@
 
 #include "NodePartitionedMeshReader.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #ifdef USE_PETSC
 #include <mpi.h>
@@ -35,8 +35,9 @@ is_safely_convertable(VALUE const& value)
     bool const result = value <= std::numeric_limits<TYPE>::max();
     if (!result)
     {
-        ERR("The value %d is too large for conversion.", value);
-        ERR("Maximum available size is %d.", std::numeric_limits<TYPE>::max());
+        ERR("The value {:d} is too large for conversion.", value);
+        ERR("Maximum available size is {:d}.",
+            std::numeric_limits<TYPE>::max());
     }
     return result;
 }
@@ -95,7 +96,7 @@ MeshLib::NodePartitionedMesh* NodePartitionedMeshReader::read(
         mesh = readBinary(file_name_base);
     }
 
-    INFO("[time] Reading the mesh took %f s.", timer.elapsed());
+    INFO("[time] Reading the mesh took {:f} s.", timer.elapsed());
 
     MPI_Barrier(_mpi_comm);
 
@@ -123,7 +124,8 @@ NodePartitionedMeshReader::readBinaryDataFromFile(std::string const& filename,
 
     if(file_status != 0)
     {
-        ERR("Error opening file %s. MPI error code %d", filename.c_str(), file_status);
+        ERR("Error opening file {:s}. MPI error code {:d}", filename.c_str(),
+            file_status);
         return false;
     }
 
@@ -217,9 +219,11 @@ void NodePartitionedMeshReader::readPropertiesBinary(
     std::ifstream is(fname_cfg.c_str(), std::ios::binary | std::ios::in);
     if (!is)
     {
-        WARN("Could not open file '%s'.\n"
-             "\tYou can ignore this warning if the mesh does not contain %s-"
-             "wise property data.", fname_cfg.c_str(), item_type.data());
+        WARN(
+            "Could not open file '{:s}'.\n"
+            "\tYou can ignore this warning if the mesh does not contain {:s}-"
+            "wise property data.",
+            fname_cfg.c_str(), item_type.data());
         return;
     }
     std::size_t number_of_properties = 0;
@@ -233,15 +237,15 @@ void NodePartitionedMeshReader::readPropertiesBinary(
         {
             OGS_FATAL(
                 "Error in NodePartitionedMeshReader::readPropertiesBinary: "
-                "Could not read the meta data for the PropertyVector %d",
+                "Could not read the meta data for the PropertyVector {:d}",
                 i);
         }
     }
     for (std::size_t i(0); i < number_of_properties; ++i)
     {
-        DBUG("[%d] +++++++++++++", _mpi_rank);
+        DBUG("[{:d}] +++++++++++++", _mpi_rank);
         MeshLib::IO::writePropertyVectorMetaData(*(vec_pvmd[i]));
-        DBUG("[%d] +++++++++++++", _mpi_rank);
+        DBUG("[{:d}] +++++++++++++", _mpi_rank);
     }
     auto pos = is.tellg();
     auto offset =
@@ -259,11 +263,12 @@ void NodePartitionedMeshReader::readPropertiesBinary(
     {
         OGS_FATAL(
             "Error in NodePartitionedMeshReader::readPropertiesBinary: "
-            "Could not read the partition meta data for the mpi process %d",
+            "Could not read the partition meta data for the mpi process {:d}",
             _mpi_rank);
     }
-    DBUG("[%d] offset in the PropertyVector: %d", _mpi_rank, pvpmd->offset);
-    DBUG("[%d] %d tuples in partition.", _mpi_rank, pvpmd->number_of_tuples);
+    DBUG("[{:d}] offset in the PropertyVector: {:d}", _mpi_rank, pvpmd->offset);
+    DBUG("[{:d}] {:d} tuples in partition.", _mpi_rank,
+         pvpmd->number_of_tuples);
     is.close();
 
     const std::string fname_val = file_name_base + "_partitioned_" + item_type +
@@ -272,9 +277,10 @@ void NodePartitionedMeshReader::readPropertiesBinary(
     is.open(fname_val.c_str(), std::ios::binary | std::ios::in);
     if (!is)
     {
-        ERR("Could not open file '%s'\n."
-            "\tYou can ignore this warning if the mesh does not contain %s-"
-             "wise property data.", fname_val.c_str(), item_type.data());
+        ERR("Could not open file '{:s}'\n."
+            "\tYou can ignore this warning if the mesh does not contain {:s}-"
+            "wise property data.",
+            fname_val.c_str(), item_type.data());
     }
 
     readDomainSpecificPartOfPropertyVectors(vec_pvmd, *pvpmd, t, is, p);
@@ -292,10 +298,12 @@ void NodePartitionedMeshReader::readDomainSpecificPartOfPropertyVectors(
     std::size_t const number_of_properties = vec_pvmd.size();
     for (std::size_t i(0); i < number_of_properties; ++i)
     {
-        DBUG("[%d] global offset: %d, offset within the PropertyVector: %d.",
-             _mpi_rank, global_offset,
-             global_offset +
-                 pvpmd.offset * vec_pvmd[i]->data_type_size_in_bytes);
+        DBUG(
+            "[{:d}] global offset: {:d}, offset within the PropertyVector: "
+            "{:d}.",
+            _mpi_rank, global_offset,
+            global_offset +
+                pvpmd.offset * vec_pvmd[i]->data_type_size_in_bytes);
         if (vec_pvmd[i]->is_int_type)
         {
             if (vec_pvmd[i]->is_data_type_signed)
@@ -347,7 +355,7 @@ bool NodePartitionedMeshReader::openASCIIFiles(
 
         if( !is_cfg.good() )
         {
-            ERR("Error opening file %s for input.", filename.c_str());
+            ERR("Error opening file {:s} for input.", filename.c_str());
             return false;
         }
 
@@ -369,7 +377,7 @@ bool NodePartitionedMeshReader::openASCIIFiles(
         is_node.open(filename);
         if( !is_node.good() )
         {
-            ERR("Error opening file %s for input.", filename.c_str());
+            ERR("Error opening file {:s} for input.", filename.c_str());
             return false;
         }
     }
@@ -379,7 +387,7 @@ bool NodePartitionedMeshReader::openASCIIFiles(
         is_elem.open(filename);
         if( !is_elem.good() )
         {
-            ERR("Error opening file %s for input.", filename.c_str());
+            ERR("Error opening file {:s} for input.", filename.c_str());
             return false;
         }
     }
@@ -665,7 +673,7 @@ void NodePartitionedMeshReader::setElements(
             default:
                 OGS_FATAL(
                     "NodePartitionedMeshReader: construction of element type "
-                    "%d is not implemented.",
+                    "{:d} is not implemented.",
                     e_type);
         }
     }
diff --git a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h
index 2a6139b8cce459163d54f143306591cf1a4067e7..b954ef8033df6c6eb932f65b5ce3b17e3a90c3fd 100644
--- a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h
+++ b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.h
@@ -200,7 +200,7 @@ private:
         if (!is.read(reinterpret_cast<char*>(pv->data()), number_of_bytes))
             OGS_FATAL(
                 "Error in NodePartitionedMeshReader::readPropertiesBinary: "
-                "Could not read part %d of the PropertyVector.",
+                "Could not read part {:d} of the PropertyVector.",
                 _mpi_rank);
     }
 
diff --git a/MeshLib/IO/MPI_IO/PropertyVectorMetaData.h b/MeshLib/IO/MPI_IO/PropertyVectorMetaData.h
index 0e3a01f177eb06522be3c2f829527eeff319bc4a..37953d89067cdd4d9b5ab4b3be07347dc678b103 100644
--- a/MeshLib/IO/MPI_IO/PropertyVectorMetaData.h
+++ b/MeshLib/IO/MPI_IO/PropertyVectorMetaData.h
@@ -69,13 +69,13 @@ inline void writePropertyVectorMetaDataBinary(
 
 inline void writePropertyVectorMetaData(PropertyVectorMetaData const& pvmd)
 {
-    DBUG("size of name: %d", pvmd.property_name.length());
-    DBUG("name: '%s'", pvmd.property_name.c_str());
-    DBUG("is_int_data_type: %d", pvmd.is_int_type);
-    DBUG("is_data_type_signed: %d", pvmd.is_data_type_signed);
-    DBUG("data_type_size_in_bytes: %d", pvmd.data_type_size_in_bytes);
-    DBUG("number of components: %d", pvmd.number_of_components);
-    DBUG("number of tuples: %d", pvmd.number_of_tuples);
+    DBUG("size of name: {:d}", pvmd.property_name.length());
+    DBUG("name: '{:s}'", pvmd.property_name.c_str());
+    DBUG("is_int_data_type: {:d}", pvmd.is_int_type);
+    DBUG("is_data_type_signed: {:d}", pvmd.is_data_type_signed);
+    DBUG("data_type_size_in_bytes: {:d}", pvmd.data_type_size_in_bytes);
+    DBUG("number of components: {:d}", pvmd.number_of_components);
+    DBUG("number of tuples: {:d}", pvmd.number_of_tuples);
 }
 
 inline boost::optional<PropertyVectorMetaData> readPropertyVectorMetaData(
diff --git a/MeshLib/IO/VtkIO/PVDFile.cpp b/MeshLib/IO/VtkIO/PVDFile.cpp
index e5963df6b0ef5609eb4fa1cd7a1e74c5f8e01b2e..8419d0f031d0a9d129788ae83d3ffaba507b1ad6 100644
--- a/MeshLib/IO/VtkIO/PVDFile.cpp
+++ b/MeshLib/IO/VtkIO/PVDFile.cpp
@@ -13,8 +13,8 @@
 #include <fstream>
 #include <iomanip>
 #include <limits>
-#include <logog/include/logog.hpp>
 #include "BaseLib/Error.h"
+#include "BaseLib/Logging.h"
 #include "MeshLib/IO/VtkIO/VtuInterface.h"
 
 namespace MeshLib
@@ -35,7 +35,7 @@ void PVDFile::addVTUFile(const std::string &vtu_fname, double timestep)
 
     std::ofstream fh(_pvd_filename.c_str());
     if (!fh) {
-        OGS_FATAL("could not open file `%s'", _pvd_filename.c_str());
+        OGS_FATAL("could not open file `{:s}'", _pvd_filename.c_str());
     }
 
     fh << std::setprecision(std::numeric_limits<double>::digits10);
diff --git a/MeshLib/IO/VtkIO/VtuInterface-impl.h b/MeshLib/IO/VtkIO/VtuInterface-impl.h
index 4e40ffa8b55fb6f7709d25e047c2b5960223e7f6..579c9f10afc1bde90c688432a6aec07003115d9b 100644
--- a/MeshLib/IO/VtkIO/VtuInterface-impl.h
+++ b/MeshLib/IO/VtkIO/VtuInterface-impl.h
@@ -22,7 +22,7 @@
 #include <vtkSmartPointer.h>
 #include <vtkUnstructuredGrid.h>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Vtk/VtkMappedMeshSource.h"
 
diff --git a/MeshLib/IO/VtkIO/VtuInterface.cpp b/MeshLib/IO/VtkIO/VtuInterface.cpp
index bb6da05903dee1c3964720528320f68ebe0ff600..39a7ad0bc1715d63ff72a616c7bcb58ff512c1ae 100644
--- a/MeshLib/IO/VtkIO/VtuInterface.cpp
+++ b/MeshLib/IO/VtkIO/VtuInterface.cpp
@@ -22,7 +22,7 @@
 #include <vtkSmartPointer.h>
 #include <vtkUnstructuredGrid.h>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <boost/algorithm/string/erase.hpp>
 
@@ -50,7 +50,7 @@ VtuInterface::VtuInterface(const MeshLib::Mesh* mesh, int dataMode, bool compres
 MeshLib::Mesh* VtuInterface::readVTUFile(std::string const &file_name)
 {
     if (!BaseLib::IsFileExisting(file_name)) {
-        ERR("File '%s' does not exist.", file_name.c_str());
+        ERR("File '{:s}' does not exist.", file_name.c_str());
         return nullptr;
     }
 
@@ -62,7 +62,7 @@ MeshLib::Mesh* VtuInterface::readVTUFile(std::string const &file_name)
     vtkUnstructuredGrid* vtkGrid = reader->GetOutput();
     if (vtkGrid->GetNumberOfPoints() == 0)
     {
-        ERR("Mesh '%s' contains zero points.", file_name.c_str());
+        ERR("Mesh '{:s}' contains zero points.", file_name.c_str());
         return nullptr;
     }
 
@@ -116,7 +116,7 @@ int writeVtu(MeshLib::Mesh const& mesh, std::string const& file_name,
     auto const result = writer.writeToFile(file_name);
     if (!result)
     {
-        ERR("writeMeshToFile(): Could not write mesh to '%s'.",
+        ERR("writeMeshToFile(): Could not write mesh to '{:s}'.",
             file_name.c_str());
         return -1;
     }
diff --git a/MeshLib/IO/readMeshFromFile.cpp b/MeshLib/IO/readMeshFromFile.cpp
index d17b43d98917f26dc57ee4942d51fdb1aad01325..cc85f06bc4205597d6e64c5b7e5d35c424611f47 100644
--- a/MeshLib/IO/readMeshFromFile.cpp
+++ b/MeshLib/IO/readMeshFromFile.cpp
@@ -23,7 +23,7 @@
 
 #include <boost/algorithm/string/erase.hpp>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -80,7 +80,8 @@ MeshLib::Mesh* readMeshFromFileSerial(const std::string &file_name)
         return MeshLib::IO::VtuInterface::readVTUFile(file_name);
     }
 
-    ERR("readMeshFromFile(): Unknown mesh file format in file %s.", file_name.c_str());
+    ERR("readMeshFromFile(): Unknown mesh file format in file {:s}.",
+        file_name.c_str());
     return nullptr;
 }
 
diff --git a/MeshLib/IO/writeMeshToFile.cpp b/MeshLib/IO/writeMeshToFile.cpp
index 25c06354e1a78ddf63bb2eddb1438febdd231e63..4f21f343c53e35972c5e4649c8997340dd9e61bc 100644
--- a/MeshLib/IO/writeMeshToFile.cpp
+++ b/MeshLib/IO/writeMeshToFile.cpp
@@ -9,7 +9,7 @@
 
 #include "writeMeshToFile.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/FileTools.h"
 #include "BaseLib/StringTools.h"
@@ -38,14 +38,15 @@ int writeMeshToFile(const MeshLib::Mesh &mesh, const std::string &file_name)
         auto const result = writer.writeToFile(file_name);
         if (!result)
         {
-            ERR("writeMeshToFile(): Could not write mesh to '%s'.",
+            ERR("writeMeshToFile(): Could not write mesh to '{:s}'.",
                 file_name.c_str());
             return -1;
         }
         return 0;
     }
 
-    ERR("writeMeshToFile(): Unknown mesh file format in file %s.", file_name.c_str());
+    ERR("writeMeshToFile(): Unknown mesh file format in file {:s}.",
+        file_name.c_str());
     return -1;
 }
 
diff --git a/MeshLib/Mesh.cpp b/MeshLib/Mesh.cpp
index 19a54a8b08bf55f58b9b0c3713cc7672e2bc573f..03e929c8b29c386e6d6aa0c963f14159e6b12757 100644
--- a/MeshLib/Mesh.cpp
+++ b/MeshLib/Mesh.cpp
@@ -273,8 +273,8 @@ void Mesh::checkNonlinearNodeIDs() const
             }
 
             WARN(
-                "Found a nonlinear node whose ID (%d) is smaller than the "
-                "number of base node IDs (%d). Some functions may not work "
+                "Found a nonlinear node whose ID ({:d}) is smaller than the "
+                "number of base node IDs ({:d}). Some functions may not work "
                 "properly.",
                 e->getNodeIndex(i), getNumberOfBaseNodes());
             return;
@@ -296,7 +296,7 @@ void scaleMeshPropertyVector(MeshLib::Mesh & mesh,
 {
     if (!mesh.getProperties().existsPropertyVector<double>(property_name))
     {
-        WARN("Did not find PropertyVector '%s' for scaling.",
+        WARN("Did not find PropertyVector '{:s}' for scaling.",
              property_name.c_str());
         return;
     }
@@ -320,7 +320,7 @@ PropertyVector<int> const* materialIDs(Mesh const& mesh)
 std::unique_ptr<MeshLib::Mesh> createMeshFromElementSelection(
     std::string mesh_name, std::vector<MeshLib::Element*> const& elements)
 {
-    DBUG("Found %d elements in the mesh", elements.size());
+    DBUG("Found {:d} elements in the mesh", elements.size());
 
     // Store bulk element ids for each of the new elements.
     std::vector<std::size_t> bulk_element_ids;
diff --git a/MeshLib/Mesh.h b/MeshLib/Mesh.h
index 8ceaa95cf620db66c2484cf7d2825c646fc04807..332be920f437dce72a322ac25be86b69b4a94c37 100644
--- a/MeshLib/Mesh.h
+++ b/MeshLib/Mesh.h
@@ -214,8 +214,8 @@ void addPropertyToMesh(MeshLib::Mesh& mesh, std::string const& name,
         if (mesh.getNumberOfNodes() != values.size() / number_of_components)
         {
             OGS_FATAL(
-                "Error number of nodes (%u) does not match the number of "
-                "tuples (%u).",
+                "Error number of nodes ({:d}) does not match the number of "
+                "tuples ({:d}).",
                 mesh.getNumberOfNodes(), values.size() / number_of_components);
         }
     }
@@ -224,8 +224,8 @@ void addPropertyToMesh(MeshLib::Mesh& mesh, std::string const& name,
         if (mesh.getNumberOfElements() != values.size() / number_of_components)
         {
             OGS_FATAL(
-                "Error number of elements (%u) does not match the number of "
-                "tuples (%u).",
+                "Error number of elements ({:d}) does not match the number of "
+                "tuples ({:d}).",
                 mesh.getNumberOfElements(),
                 values.size() / number_of_components);
         }
@@ -235,7 +235,7 @@ void addPropertyToMesh(MeshLib::Mesh& mesh, std::string const& name,
         name, item_type, number_of_components);
     if (!property)
     {
-        OGS_FATAL("Error while creating PropertyVector '%s'.", name.c_str());
+        OGS_FATAL("Error while creating PropertyVector '{:s}'.", name.c_str());
     }
     property->reserve(values.size());
     std::copy(values.cbegin(), values.cend(), std::back_inserter(*property));
diff --git a/MeshLib/MeshEditing/AddLayerToMesh.cpp b/MeshLib/MeshEditing/AddLayerToMesh.cpp
index 8ef2f24dad13c45977342291a7ece5e4c3382c31..66b28fd2939adceecd40af7746c5558aa5e9050b 100644
--- a/MeshLib/MeshEditing/AddLayerToMesh.cpp
+++ b/MeshLib/MeshEditing/AddLayerToMesh.cpp
@@ -18,7 +18,7 @@
 #include <numeric>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Mesh.h"
 #include "MeshLib/Node.h"
@@ -94,7 +94,7 @@ MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness,
     std::string const& name,
     bool on_top)
 {
-    INFO("Extracting top surface of mesh '%s' ... ", mesh.getName().c_str());
+    INFO("Extracting top surface of mesh '{:s}' ... ", mesh.getName().c_str());
     int const flag = (on_top) ? -1 : 1;
     const MathLib::Vector3 dir(0, 0, flag);
     double const angle(90);
@@ -139,7 +139,7 @@ MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness,
 
     if (!sfc_mesh->getProperties().existsPropertyVector<std::size_t>(prop_name))
     {
-        ERR("Need subsurface node ids, but the property '%s' is not "
+        ERR("Need subsurface node ids, but the property '{:s}' is not "
             "available.",
             prop_name.c_str());
         return nullptr;
diff --git a/MeshLib/MeshEditing/ConvertToLinearMesh.cpp b/MeshLib/MeshEditing/ConvertToLinearMesh.cpp
index 3ed4fc0f75cfb8f47b8a9c88947f879d98d321d2..56f70547cb74b4e9c119c3fca619f1412f443dd6 100644
--- a/MeshLib/MeshEditing/ConvertToLinearMesh.cpp
+++ b/MeshLib/MeshEditing/ConvertToLinearMesh.cpp
@@ -44,8 +44,8 @@ T_ELEMENT* createLinearElement(MeshLib::Element const* e,
         if (it == end(vec_new_nodes))
         {
             OGS_FATAL(
-                "A base node %d (with original global node id %d) not found in "
-                "the list for element %d.",
+                "A base node {:d} (with original global node id {:d}) not "
+                "found in the list for element {:d}.",
                 i, e->getNode(i)->getID(), e->getID());
         }
         nodes[i] = const_cast<MeshLib::Node*>(*it);
@@ -92,7 +92,7 @@ std::unique_ptr<MeshLib::Mesh> convertToLinearMesh(
         }
         else
         {
-            OGS_FATAL("Mesh element type %s is not supported",
+            OGS_FATAL("Mesh element type {:s} is not supported",
                       MeshLib::CellType2String(e->getCellType()).c_str());
         }
     }
diff --git a/MeshLib/MeshEditing/ElementValueModification.cpp b/MeshLib/MeshEditing/ElementValueModification.cpp
index f484f1da070ed95e552b8cf46305dc12e77451a6..03366a60a370a1dc7ef74ac03783f6e6e1445b48 100644
--- a/MeshLib/MeshEditing/ElementValueModification.cpp
+++ b/MeshLib/MeshEditing/ElementValueModification.cpp
@@ -16,7 +16,7 @@
 
 #include <algorithm>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/Mesh.h"
@@ -36,7 +36,7 @@ bool ElementValueModification::replace(MeshLib::Mesh &mesh,
     }
     catch (std::runtime_error const& e)
     {
-        ERR("%s", e.what());
+        ERR("{:s}", e.what());
         return false;
     }
 
@@ -51,7 +51,7 @@ bool ElementValueModification::replace(MeshLib::Mesh &mesh,
             {
                 WARN(
                     "ElementValueModification::replaceElementValue() "
-                    "- Replacement value '%d' is already taken, "
+                    "- Replacement value '{:d}' is already taken, "
                     "no changes have been made.",
                     new_value);
                 return false;
@@ -86,7 +86,7 @@ std::size_t ElementValueModification::condense(MeshLib::Mesh &mesh)
     }
     catch (std::runtime_error const& e)
     {
-        ERR("%s", e.what());
+        ERR("{:s}", e.what());
         return 0;
     }
 
@@ -120,7 +120,7 @@ std::size_t ElementValueModification::setByElementType(MeshLib::Mesh &mesh, Mesh
     }
     catch (std::runtime_error const& e)
     {
-        ERR("%s", e.what());
+        ERR("{:s}", e.what());
         return 0;
     }
 
diff --git a/MeshLib/MeshEditing/Mesh2MeshPropertyInterpolation.cpp b/MeshLib/MeshEditing/Mesh2MeshPropertyInterpolation.cpp
index 2aa166e7c88fa150542a7b5da9c5b2e4ce57f988..a7f588aae8c16f99210eb9a77b8887983b888e5f 100644
--- a/MeshLib/MeshEditing/Mesh2MeshPropertyInterpolation.cpp
+++ b/MeshLib/MeshEditing/Mesh2MeshPropertyInterpolation.cpp
@@ -17,7 +17,7 @@
 
 #include "Mesh2MeshPropertyInterpolation.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/AABB.h"
 #include "GeoLib/Grid.h"
@@ -38,8 +38,8 @@ bool Mesh2MeshPropertyInterpolation::setPropertiesForMesh(Mesh& dest_mesh) const
 {
     if (_src_mesh.getDimension() != dest_mesh.getDimension()) {
         ERR("MeshLib::Mesh2MeshPropertyInterpolation::setPropertiesForMesh() "
-            "dimension of source (dim = %d) and destination (dim = %d) mesh "
-            "does not match.",
+            "dimension of source (dim = {:d}) and destination (dim = {:d}) "
+            "mesh does not match.",
             _src_mesh.getDimension(), dest_mesh.getDimension());
         return false;
     }
@@ -59,7 +59,7 @@ bool Mesh2MeshPropertyInterpolation::setPropertiesForMesh(Mesh& dest_mesh) const
     }
     else
     {
-        INFO("Create new PropertyVector '%s' of type double.",
+        INFO("Create new PropertyVector '{:s}' of type double.",
              _property_name.c_str());
         dest_properties =
             dest_mesh.getProperties().createNewPropertyVector<double>(
@@ -68,7 +68,7 @@ bool Mesh2MeshPropertyInterpolation::setPropertiesForMesh(Mesh& dest_mesh) const
         {
             WARN(
                 "Could not get or create a PropertyVector of type double"
-                " using the given name '%s'.",
+                " using the given name '{:s}'.",
                 _property_name.c_str());
             return false;
         }
@@ -139,7 +139,7 @@ void Mesh2MeshPropertyInterpolation::interpolatePropertiesForMesh(
         {
             OGS_FATAL(
                 "Mesh2MeshInterpolation: Could not find values in source mesh "
-                "for the element %d.",
+                "for the element {:d}.",
                 k);
         }
         dest_properties[k] = average_value / cnt;
@@ -152,7 +152,7 @@ void Mesh2MeshPropertyInterpolation::interpolateElementPropertiesToNodePropertie
     // fetch the source of property values
     if (!_src_mesh.getProperties().existsPropertyVector<double>(_property_name))
     {
-        WARN("Did not find PropertyVector<double> '%s'.",
+        WARN("Did not find PropertyVector<double> '{:s}'.",
              _property_name.c_str());
         return;
     }
diff --git a/MeshLib/MeshEditing/MeshRevision.cpp b/MeshLib/MeshEditing/MeshRevision.cpp
index 7e3fb000bf463aab53046a911dfcc36ecd8ff965..d5015604dd9022187c3469596c1d0842b97f1860 100644
--- a/MeshLib/MeshEditing/MeshRevision.cpp
+++ b/MeshLib/MeshEditing/MeshRevision.cpp
@@ -16,7 +16,7 @@
 
 #include <numeric>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Grid.h"
 #include "MathLib/GeometricBasics.h"
@@ -87,7 +87,7 @@ MeshLib::Mesh* MeshRevision::simplifyMesh(const std::string &new_mesh_name,
                     subdivideElement(elem, new_nodes, new_elements));
                 if (n_new_elements == 0)
                 {
-                    ERR("Element %d has unknown element type.", k);
+                    ERR("Element {:d} has unknown element type.", k);
                     this->resetNodeIDs();
                     this->cleanUp(new_nodes, new_elements);
                     return nullptr;
diff --git a/MeshLib/MeshEditing/RemoveMeshComponents.cpp b/MeshLib/MeshEditing/RemoveMeshComponents.cpp
index f32b566977985c5ed3535634f6ef4265b1bc5c7b..5bd10e19433cc0f850872ef6680a1aa6850183e7 100644
--- a/MeshLib/MeshEditing/RemoveMeshComponents.cpp
+++ b/MeshLib/MeshEditing/RemoveMeshComponents.cpp
@@ -60,10 +60,10 @@ MeshLib::Mesh* removeElements(
         return nullptr;
     }
 
-    INFO("Removing total %d elements...", removed_element_ids.size());
+    INFO("Removing total {:d} elements...", removed_element_ids.size());
     std::vector<MeshLib::Element*> tmp_elems =
         details::excludeElementCopy(mesh.getElements(), removed_element_ids);
-    INFO("%d elements remain in mesh.", tmp_elems.size());
+    INFO("{:d} elements remain in mesh.", tmp_elems.size());
 
     // copy node and element objects
     std::vector<MeshLib::Node*> new_nodes =
@@ -75,7 +75,7 @@ MeshLib::Mesh* removeElements(
     NodeSearch ns(mesh);
     ns.searchNodesConnectedToOnlyGivenElements(removed_element_ids);
     auto& removed_node_ids(ns.getSearchedNodeIDs());
-    INFO("Removing total %d nodes...", removed_node_ids.size());
+    INFO("Removing total {:d} nodes...", removed_node_ids.size());
     for (auto nodeid : removed_node_ids)
     {
         delete new_nodes[nodeid];
diff --git a/MeshLib/MeshGenerators/LayeredMeshGenerator.cpp b/MeshLib/MeshGenerators/LayeredMeshGenerator.cpp
index c30200e17fd385a74496ed5150672f3ece4f6c7a..8f26863354c12c3a861fbef05df7a0d523053e75 100644
--- a/MeshLib/MeshGenerators/LayeredMeshGenerator.cpp
+++ b/MeshLib/MeshGenerators/LayeredMeshGenerator.cpp
@@ -17,7 +17,7 @@
 #include <vector>
 #include <fstream>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Raster.h"
 
@@ -65,7 +65,11 @@ LayeredMeshGenerator::getMesh(std::string const& mesh_name) const
                   std::back_inserter(*materials));
     }
     else
-        WARN ("Skipping MaterialID information, number of entries does not match element number");
+    {
+        WARN(
+            "Skipping MaterialID information, number of entries does not match "
+            "element number");
+    }
 
     std::unique_ptr<MeshLib::Mesh> result(new MeshLib::Mesh(mesh_name, _nodes, _elements, properties));
     MeshLib::NodeSearch ns(*result);
diff --git a/MeshLib/MeshGenerators/MeshLayerMapper.cpp b/MeshLib/MeshGenerators/MeshLayerMapper.cpp
index 24456e82ad8ab9f5c5fd811952fd578e555db847..571b34811d83270b17f987d5c789dd0ae252a01f 100644
--- a/MeshLib/MeshGenerators/MeshLayerMapper.cpp
+++ b/MeshLib/MeshGenerators/MeshLayerMapper.cpp
@@ -16,7 +16,7 @@
 
 #include <algorithm>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Raster.h"
 
@@ -42,7 +42,7 @@ MeshLib::Mesh* MeshLayerMapper::createStaticLayers(MeshLib::Mesh const& mesh, st
             thickness.push_back(layer_thickness_vector[i]);
         }
         else
-            WARN("Ignoring layer %d with thickness %f.", i,
+            WARN("Ignoring layer {:d} with thickness {:f}.", i,
                  layer_thickness_vector[i]);
     }
 
diff --git a/MeshLib/MeshGenerators/QuadraticMeshGenerator.cpp b/MeshLib/MeshGenerators/QuadraticMeshGenerator.cpp
index abf437b6f8b8523128c73705423b85253b5c817c..6b6fd7ed01fd381482ffa87104961bd024eb1558 100644
--- a/MeshLib/MeshGenerators/QuadraticMeshGenerator.cpp
+++ b/MeshLib/MeshGenerators/QuadraticMeshGenerator.cpp
@@ -76,7 +76,7 @@ std::unique_ptr<MeshLib::Element> createQuadraticElement(
         return convertLinearToQuadratic<MeshLib::Hex20>(e);
     }
 
-    OGS_FATAL("Mesh element type %s is not supported",
+    OGS_FATAL("Mesh element type {:s} is not supported",
               MeshLib::CellType2String(e.getCellType()).c_str());
 }
 
diff --git a/MeshLib/MeshGenerators/RasterToMesh.cpp b/MeshLib/MeshGenerators/RasterToMesh.cpp
index 75b91291016ae926ebb4b11741488e62fe45b912..4c2621ad2a2fcc9c82e92caf84a645339497f222 100644
--- a/MeshLib/MeshGenerators/RasterToMesh.cpp
+++ b/MeshLib/MeshGenerators/RasterToMesh.cpp
@@ -10,6 +10,8 @@
 
 #include "RasterToMesh.h"
 
+#include "BaseLib/Logging.h"
+
 #include "MeshLib/Elements/Elements.h"
 #include "MeshLib/Mesh.h"
 #include "MeshLib/Node.h"
diff --git a/MeshLib/MeshGenerators/RasterToMesh.h b/MeshLib/MeshGenerators/RasterToMesh.h
index e0c1fee1b0bf629b83e3c063f3ffed96b05abdd0..bd8e582ea64c9acdefaa1e79c92d7e2faeb162b2 100644
--- a/MeshLib/MeshGenerators/RasterToMesh.h
+++ b/MeshLib/MeshGenerators/RasterToMesh.h
@@ -10,8 +10,6 @@
 
 #pragma once
 
-#include <logog/include/logog.hpp>
-
 #include "GeoLib/Raster.h"
 #include "MeshLib/Location.h"
 #include "MeshLib/MeshEnums.h"
diff --git a/MeshLib/MeshGenerators/VtkMeshConverter.cpp b/MeshLib/MeshGenerators/VtkMeshConverter.cpp
index 92eaf78e9610a72b0b8d11a6e17958144c8e5cee..307458c56db150072bdabdb6b4976b38f1d50de4 100644
--- a/MeshLib/MeshGenerators/VtkMeshConverter.cpp
+++ b/MeshLib/MeshGenerators/VtkMeshConverter.cpp
@@ -229,7 +229,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
             }
             default:
                 ERR("VtkMeshConverter::convertUnstructuredGrid(): Unknown mesh "
-                    "element type '%d'.",
+                    "element type '{:d}'.",
                     cell_type);
                 return nullptr;
         }
@@ -343,7 +343,7 @@ void VtkMeshConverter::convertArray(vtkDataArray& array,
     }
 
     WARN(
-        "Array '%s' in VTU file uses unsupported data type '%s'. The data "
+        "Array '{:s}' in VTU file uses unsupported data type '{:s}'. The data "
         "array will not be available.",
         array.GetName(), array.GetDataTypeAsString());
 }
diff --git a/MeshLib/MeshGenerators/VtkMeshConverter.h b/MeshLib/MeshGenerators/VtkMeshConverter.h
index 30736d6076bb2681131372edf84be3f44223eefe..266ab9bfdba461d48ff553c9a0865e1bfcc778db 100644
--- a/MeshLib/MeshGenerators/VtkMeshConverter.h
+++ b/MeshLib/MeshGenerators/VtkMeshConverter.h
@@ -17,7 +17,7 @@
 #include <vtkDataArray.h>
 #include <vtkType.h>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/Raster.h"
 #include "MeshLib/Location.h"
@@ -109,7 +109,7 @@ private:
             array_name, type, nComponents);
         if (!vec)
         {
-            WARN("Array %s could not be converted to PropertyVector.",
+            WARN("Array {:s} could not be converted to PropertyVector.",
                  array_name);
             return;
         }
diff --git a/MeshLib/MeshInformation.cpp b/MeshLib/MeshInformation.cpp
index 11af2d82694b2d1603db2370866afd406e3a8dfa..86e7f60fd7177b703ff04a9ebe23da1dcec31501 100644
--- a/MeshLib/MeshInformation.cpp
+++ b/MeshLib/MeshInformation.cpp
@@ -75,7 +75,7 @@ void MeshInformation::writeAllNumbersOfElementTypes(const MeshLib::Mesh& mesh)
     for (unsigned int element_type = 0; element_type < nr_ele_types.size();
          element_type++)
     {
-        INFO("\t%d %s ", nr_ele_types[element_type],
+        INFO("\t{:d} {:s} ", nr_ele_types[element_type],
              element_names[element_type].c_str());
     }
 }
@@ -84,25 +84,25 @@ void MeshInformation::writePropertyVectorInformation(const MeshLib::Mesh& mesh)
 {
     std::vector<std::string> const& vec_names(
         mesh.getProperties().getPropertyVectorNames());
-    INFO("There are %d properties in the mesh:", vec_names.size());
+    INFO("There are {:d} properties in the mesh:", vec_names.size());
     for (const auto& vec_name : vec_names)
     {
         if (auto const vec_bounds =
                 MeshLib::MeshInformation::getValueBounds<int>(mesh, vec_name))
         {
-            INFO("\t%s: [%d, %d]", vec_name.c_str(), vec_bounds->first,
+            INFO("\t{:s}: [{:d}, {:d}]", vec_name.c_str(), vec_bounds->first,
                  vec_bounds->second);
         }
         else if (auto const vec_bounds =
                      MeshLib::MeshInformation::getValueBounds<double>(mesh,
                                                                       vec_name))
         {
-            INFO("\t%s: [%g, %g]", vec_name.c_str(), vec_bounds->first,
+            INFO("\t{:s}: [{:g}, {:g}]", vec_name.c_str(), vec_bounds->first,
                  vec_bounds->second);
         }
         else
         {
-            INFO("\t%s: Could not get value bounds for property vector.",
+            INFO("\t{:s}: Could not get value bounds for property vector.",
                  vec_name.c_str());
         }
     }
@@ -115,7 +115,7 @@ void MeshInformation::writeMeshValidationResults(MeshLib::Mesh& mesh)
     unsigned const n_holes(MeshLib::MeshValidation::detectHoles(mesh));
     if (n_holes > 0)
     {
-        INFO("%d hole(s) detected within the mesh", n_holes);
+        INFO("{:d} hole(s) detected within the mesh", n_holes);
     }
     else
     {
diff --git a/MeshLib/MeshInformation.h b/MeshLib/MeshInformation.h
index cddff750b8cb152d5a9fd78680ffcdfaf8266510..d95921d3e910f914c36c475344ab9f46f4de913f 100644
--- a/MeshLib/MeshInformation.h
+++ b/MeshLib/MeshInformation.h
@@ -46,7 +46,7 @@ public:
             mesh.getProperties().getPropertyVector<T>(name);
         if (data_vec->empty())
         {
-            INFO("Mesh does not contain values for the property '%s'.",
+            INFO("Mesh does not contain values for the property '{:s}'.",
                  name.c_str());
             return {};
         }
diff --git a/MeshLib/MeshQuality/EdgeRatioMetric.cpp b/MeshLib/MeshQuality/EdgeRatioMetric.cpp
index 96766eaf8bd2fc5d22e4972b915eeaf5db334325..1aaff213308e57a73228cec8ee147552f89b6d44 100644
--- a/MeshLib/MeshQuality/EdgeRatioMetric.cpp
+++ b/MeshLib/MeshQuality/EdgeRatioMetric.cpp
@@ -77,8 +77,9 @@ void EdgeRatioMetric::calculateQuality()
             break;
         }
         default:
-            ERR ("MeshQualityShortestLongestRatio::check () check for element type %s not implemented.",
-                 MeshElemType2String(elem.getGeomType()).c_str());
+            ERR("MeshQualityShortestLongestRatio::check () check for element "
+                "type {:s} not implemented.",
+                MeshElemType2String(elem.getGeomType()).c_str());
         }
     }
 }
diff --git a/MeshLib/MeshQuality/ElementQualityMetric.h b/MeshLib/MeshQuality/ElementQualityMetric.h
index 9d2480f98f97100e9a8d1468e4d342a6606a913f..94596ef94cb9e1df36af4cb953e630a6ee323fc8 100644
--- a/MeshLib/MeshQuality/ElementQualityMetric.h
+++ b/MeshLib/MeshQuality/ElementQualityMetric.h
@@ -16,8 +16,6 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
-
 #include "BaseLib/Histogram.h"
 
 #include "MeshLib/Mesh.h"
diff --git a/MeshLib/MeshQuality/ElementSizeMetric.cpp b/MeshLib/MeshQuality/ElementSizeMetric.cpp
index 5da8d05f201f5de491f2823ef6d3b57062a42b9b..52383aeeadeba4bdddc075577abee986f3a9247e 100644
--- a/MeshLib/MeshQuality/ElementSizeMetric.cpp
+++ b/MeshLib/MeshQuality/ElementSizeMetric.cpp
@@ -38,9 +38,12 @@ void ElementSizeMetric::calculateQuality()
         error_count = calc3dQuality();
     }
 
-    INFO ("ElementSizeMetric::calculateQuality() minimum: %f, max_volume: %f", _min, _max);
+    INFO(
+        "ElementSizeMetric::calculateQuality() minimum: {:f}, max_volume: {:f}",
+        _min,
+        _max);
     if (error_count > 0)
-        WARN ("Warning: %d elements with zero volume found.", error_count);
+        WARN("Warning: {:d} elements with zero volume found.", error_count);
 }
 
 std::size_t ElementSizeMetric::calc1dQuality()
diff --git a/MeshLib/MeshQuality/MeshValidation.cpp b/MeshLib/MeshQuality/MeshValidation.cpp
index c3cd73c154b3726c9c88069500b3c8010908e3e2..1d2e2d6a549ce548fecdf2a97122d16dc616b3a3 100644
--- a/MeshLib/MeshQuality/MeshValidation.cpp
+++ b/MeshLib/MeshQuality/MeshValidation.cpp
@@ -18,7 +18,7 @@
 #include <algorithm>
 #include <stack>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/Mesh.h"
 #include "MeshLib/Node.h"
@@ -36,10 +36,11 @@ MeshValidation::MeshValidation(MeshLib::Mesh &mesh)
     NodeSearch ns(mesh);
     ns.searchUnused();
     if (!ns.getSearchedNodeIDs().empty()) {
-        INFO ("%d unused mesh nodes found.", ns.getSearchedNodeIDs().size());
+        INFO("{:d} unused mesh nodes found.", ns.getSearchedNodeIDs().size());
     }
     MeshRevision rev(mesh);
-    INFO ("Found %d potentially collapsable nodes.", rev.getNumberOfCollapsableNodes());
+    INFO("Found {:d} potentially collapsable nodes.",
+         rev.getNumberOfCollapsableNodes());
 
     const std::vector<ElementErrorCode> codes(
         MeshLib::MeshValidation::testElementGeometry(mesh));
@@ -101,7 +102,7 @@ std::vector<ElementErrorCode> MeshValidation::testElementGeometry(const MeshLib:
         for (std::size_t i = 0; i < nErrorCodes; ++i)
         {
             if (error_count[i])
-                INFO("%d elements found with %s.",
+                INFO("{:d} elements found with {:s}.",
                      error_count[i],
                      ElementErrorCode::toString(flags[i]).c_str());
         }
diff --git a/MeshLib/MeshSearch/ElementSearch.cpp b/MeshLib/MeshSearch/ElementSearch.cpp
index 87f7a1e9d650b280588027fd515cf1d44c4e2210..4c53b9fea10c174540b68eb216f86dde6aac1bc7 100644
--- a/MeshLib/MeshSearch/ElementSearch.cpp
+++ b/MeshLib/MeshSearch/ElementSearch.cpp
@@ -10,8 +10,6 @@
 
 #include "ElementSearch.h"
 
-#include <logog/include/logog.hpp>
-
 #include "BaseLib/Algorithm.h"
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/Node.h"
diff --git a/MeshLib/MeshSearch/ElementSearch.h b/MeshLib/MeshSearch/ElementSearch.h
index a39ef8dcd1361c3a71acbeb4cb183c5aa67bedd7..f852681958af536750b04d5e68a8cec3a88e90ce 100644
--- a/MeshLib/MeshSearch/ElementSearch.h
+++ b/MeshLib/MeshSearch/ElementSearch.h
@@ -81,7 +81,7 @@ public:
         }
         catch (std::runtime_error const& e)
         {
-            ERR("%s", e.what());
+            ERR("{:s}", e.what());
             WARN(
                 "Value-based element removal currently only works for "
                 "scalars.");
diff --git a/MeshLib/MeshSearch/MeshElementGrid.cpp b/MeshLib/MeshSearch/MeshElementGrid.cpp
index f225a174d894faa54db102d8596e99cdb79232d6..e6f5479097ffbfbf69baee7630fe85f71ae0255e 100644
--- a/MeshLib/MeshSearch/MeshElementGrid.cpp
+++ b/MeshLib/MeshSearch/MeshElementGrid.cpp
@@ -15,8 +15,6 @@
 #include <cmath>
 #include <memory>
 
-#include <logog/include/logog.hpp>
-
 #include "../Mesh.h"
 #include "../Node.h"
 #include "../Elements/Element.h"
@@ -117,8 +115,8 @@ void MeshElementGrid::sortElementsInGridCells(MeshLib::Mesh const& sfc_mesh)
 {
     for (auto const element : sfc_mesh.getElements()) {
         if (! sortElementInGridCells(*element)) {
-            OGS_FATAL("Sorting element (id=%d) into mesh element grid.",
-                element->getID());
+            OGS_FATAL("Sorting element (id={:d}) into mesh element grid.",
+                      element->getID());
         }
     }
 }
diff --git a/MeshLib/MeshSearch/NodeSearch.cpp b/MeshLib/MeshSearch/NodeSearch.cpp
index 3157b168819db6f041a93789b04735947c7aa06e..37ecbdae88ba83c229c0f36e18d7dbb3d1df9746 100644
--- a/MeshLib/MeshSearch/NodeSearch.cpp
+++ b/MeshLib/MeshSearch/NodeSearch.cpp
@@ -13,8 +13,6 @@
 #include <memory>
 #include <set>
 
-#include <logog/include/logog.hpp>
-
 #include "MeshLib/Mesh.h"
 #include "MeshLib/Node.h"
 #include "MeshLib/Elements/Element.h"
diff --git a/MeshLib/MeshSubset.h b/MeshLib/MeshSubset.h
index 72cec1204ac13ed0094bc901ddb354359b32c6eb..b514b86151301d2f50945bd73514221eddc2a54a 100644
--- a/MeshLib/MeshSubset.h
+++ b/MeshLib/MeshSubset.h
@@ -53,8 +53,8 @@ public:
                 auto it = lower_bound(begin(mesh_nodes), end(mesh_nodes), n);
                 if (it == end(mesh_nodes))
                 {
-                    ERR("A node %d (%g, %g, %g) in mesh subset is not a part "
-                        "of the mesh.",
+                    ERR("A node {:d} ({:g}, {:g}, {:g}) in mesh subset is not "
+                        "a part of the mesh.",
                         n->getID(), (*n)[0], (*n)[1], (*n)[2]);
                     return false;
                 }
diff --git a/MeshLib/MeshSurfaceExtraction.cpp b/MeshLib/MeshSurfaceExtraction.cpp
index 5e5b68102001c837d452792a4fdc29aa8f4764ae..20c3973bf76f1cff19f00880ed765ba88c1510f6 100644
--- a/MeshLib/MeshSurfaceExtraction.cpp
+++ b/MeshLib/MeshSurfaceExtraction.cpp
@@ -15,7 +15,7 @@
 #include "MeshSurfaceExtraction.h"
 
 #include <boost/math/constants/constants.hpp>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 #include <memory>
 
 #include "MeshLib/Elements/Line.h"
@@ -75,16 +75,16 @@ bool createSfcMeshProperties(MeshLib::Mesh& sfc_mesh,
     std::size_t const n_nodes(sfc_mesh.getNumberOfNodes());
     if (node_ids_map.size() != n_nodes)
     {
-        ERR("createSfcMeshProperties() - Incorrect number of node IDs (%d) "
-            "compared to actual number of surface nodes (%d).",
+        ERR("createSfcMeshProperties() - Incorrect number of node IDs ({:d}) "
+            "compared to actual number of surface nodes ({:d}).",
             node_ids_map.size(), n_nodes);
         return false;
     }
 
     if (element_ids_map.size() != n_elems)
     {
-        ERR("createSfcMeshProperties() - Incorrect number of element IDs (%d) "
-            "compared to actual number of surface elements (%d).",
+        ERR("createSfcMeshProperties() - Incorrect number of element IDs "
+            "({:d}) compared to actual number of surface elements ({:d}).",
             element_ids_map.size(), n_elems);
         return false;
     }
@@ -112,12 +112,14 @@ bool createSfcMeshProperties(MeshLib::Mesh& sfc_mesh,
         }
         else
         {
-            WARN("Skipping property vector '%s' - no matching data type found.",
-                 name.c_str());
+            WARN(
+                "Skipping property vector '{:s}' - no matching data type "
+                "found.",
+                name.c_str());
             vectors_skipped++;
         }
     }
-    INFO("%d property vectors copied, %d vectors skipped.", vectors_copied,
+    INFO("{:d} property vectors copied, {:d} vectors skipped.", vectors_copied,
          vectors_skipped);
     return true;
 }
@@ -186,7 +188,7 @@ std::vector<double> MeshSurfaceExtraction::getSurfaceAreaForNodes(
         node_area_vec.push_back(node_area);
     }
 
-    INFO("Total surface Area: %f", total_area);
+    INFO("Total surface Area: {:f}", total_area);
 
     return node_area_vec;
 }
@@ -255,7 +257,7 @@ void MeshSurfaceExtraction::get2DSurfaceElements(
     const MathLib::Vector3& dir, double angle, unsigned mesh_dimension)
 {
     if (mesh_dimension < 2 || mesh_dimension > 3)
-        ERR("Cannot handle meshes of dimension %i", mesh_dimension);
+        ERR("Cannot handle meshes of dimension {:i}", mesh_dimension);
 
     bool const complete_surface = (MathLib::scalarProduct(dir, dir) == 0);
 
@@ -416,7 +418,7 @@ std::unique_ptr<MeshLib::Mesh> getBoundaryElementsAsMesh(
     auto const mesh_dimension = bulk_mesh.getDimension();
     if (mesh_dimension < 2 || mesh_dimension > 3)
     {
-        ERR("Cannot handle meshes of dimension %i", mesh_dimension);
+        ERR("Cannot handle meshes of dimension {:i}", mesh_dimension);
     }
 
     // create boundary elements based on the subsurface nodes
diff --git a/MeshLib/Properties-impl.h b/MeshLib/Properties-impl.h
index 798e77b317d80f8b06265736aff481a16d326256..e535547114d00f0bec8e7b6fbb699a80af3babac 100644
--- a/MeshLib/Properties-impl.h
+++ b/MeshLib/Properties-impl.h
@@ -20,8 +20,8 @@ PropertyVector<T>* Properties::createNewPropertyVector(
         _properties.find(name)
     );
     if (it != _properties.end()) {
-        ERR("A property of the name '%s' is already assigned to the mesh.",
-            name.c_str());
+        ERR("A property of the name '{:s}' is already assigned to the mesh.",
+            name);
         return nullptr;
     }
     auto entry_info(
@@ -48,8 +48,8 @@ PropertyVector<T>* Properties::createNewPropertyVector(
         _properties.find(name)
     );
     if (it != _properties.end()) {
-        ERR("A property of the name '%s' already assigned to the mesh.",
-            name.c_str());
+        ERR("A property of the name '{:s}' already assigned to the mesh.",
+            name);
         return nullptr;
     }
 
@@ -57,7 +57,9 @@ PropertyVector<T>* Properties::createNewPropertyVector(
     for (std::size_t k(0); k<item2group_mapping.size(); k++) {
         std::size_t const group_id (item2group_mapping[k]);
         if (group_id >= n_prop_groups) {
-            ERR("The mapping to property %d for item %d is not in the correct range [0,%d).", group_id, k, n_prop_groups);
+            ERR("The mapping to property {:d} for item {:d} is not in the "
+                "correct range [0,{:d}).",
+                group_id, k, n_prop_groups);
             return nullptr;
         }
     }
@@ -121,16 +123,15 @@ PropertyVector<T> const* Properties::getPropertyVector(
     auto it(_properties.find(name));
     if (it == _properties.end())
     {
-        OGS_FATAL(
-            "The PropertyVector '%s' is not available in the mesh.",
-            name.c_str());
+        OGS_FATAL("The PropertyVector '{:s}' is not available in the mesh.",
+                  name);
     }
     if (!dynamic_cast<PropertyVector<T> const*>(it->second))
     {
         OGS_FATAL(
-            "The PropertyVector '%s' has a different type than the requested "
+            "The PropertyVector '{:s}' has a different type than the requested "
             "PropertyVector.",
-            name.c_str());
+            name);
     }
     return dynamic_cast<PropertyVector<T> const*>(it->second);
 }
@@ -142,15 +143,15 @@ PropertyVector<T>* Properties::getPropertyVector(std::string const& name)
     if (it == _properties.end())
     {
         OGS_FATAL(
-            "A PropertyVector with the specified name '%s' is not available.",
-            name.c_str());
+            "A PropertyVector with the specified name '{:s}' is not available.",
+            name);
     }
     if (!dynamic_cast<PropertyVector<T>*>(it->second))
     {
         OGS_FATAL(
-            "The PropertyVector '%s' has a different type than the requested "
+            "The PropertyVector '{:s}' has a different type than the requested "
             "PropertyVector.",
-            name.c_str());
+            name);
     }
     return dynamic_cast<PropertyVector<T>*>(it->second);
 }
@@ -163,30 +164,32 @@ PropertyVector<T> const* Properties::getPropertyVector(
     auto const it = _properties.find(name);
     if (it == _properties.end())
     {
-        OGS_FATAL("A PropertyVector with name '%s' does not exist in the mesh.",
-                  name.c_str());
+        OGS_FATAL(
+            "A PropertyVector with name '{:s}' does not exist in the mesh.",
+            name);
     }
 
     auto property = dynamic_cast<PropertyVector<T>*>(it->second);
     if (property == nullptr)
     {
         OGS_FATAL(
-            "Could not cast the data type of the PropertyVector '%s' to "
+            "Could not cast the data type of the PropertyVector '{:s}' to "
             "requested data type.",
-            name.c_str());
+            name);
     }
     if (property->getMeshItemType() != item_type)
     {
         OGS_FATAL(
-            "The PropertyVector '%s' has type '%s'. A '%s' field is requested.",
-            name.c_str(), toString(property->getMeshItemType()),
-            toString(item_type));
+            "The PropertyVector '{:s}' has type '{:s}'. A '{:s}' field is "
+            "requested.",
+            name, toString(property->getMeshItemType()), toString(item_type));
     }
     if (property->getNumberOfComponents() != n_components)
     {
         OGS_FATAL(
-            "PropertyVector '%s' has %d components, %d components are needed.",
-            name.c_str(), property->getNumberOfComponents(), n_components);
+            "PropertyVector '{:s}' has {:d} components, {:d} components are "
+            "needed.",
+            name, property->getNumberOfComponents(), n_components);
     }
     return property;
 }
@@ -199,30 +202,32 @@ PropertyVector<T>* Properties::getPropertyVector(std::string const& name,
     auto const it = _properties.find(name);
     if (it == _properties.end())
     {
-        OGS_FATAL("A PropertyVector with name '%s' does not exist in the mesh.",
-                  name.c_str());
+        OGS_FATAL(
+            "A PropertyVector with name '{:s}' does not exist in the mesh.",
+            name);
     }
 
     auto property = dynamic_cast<PropertyVector<T>*>(it->second);
     if (property == nullptr)
     {
         OGS_FATAL(
-            "Could not cast the data type of the PropertyVector '%s' to "
+            "Could not cast the data type of the PropertyVector '{:s}' to "
             "requested data type.",
-            name.c_str());
+            name);
     }
     if (property->getMeshItemType() != item_type)
     {
         OGS_FATAL(
-            "The PropertyVector '%s' has type '%s'. A '%s' field is requested.",
-            name.c_str(), toString(property->getMeshItemType()),
-            toString(item_type));
+            "The PropertyVector '{:s}' has type '{:s}'. A '{:s}' field is "
+            "requested.",
+            name, toString(property->getMeshItemType()), toString(item_type));
     }
     if (property->getNumberOfComponents() != n_components)
     {
         OGS_FATAL(
-            "PropertyVector '%s' has %d components, %d components are needed.",
-            name.c_str(), property->getNumberOfComponents(), n_components);
+            "PropertyVector '{:s}' has {:d} components, {:d} components are "
+            "needed.",
+            name, property->getNumberOfComponents(), n_components);
     }
     return property;
 }
diff --git a/MeshLib/Properties.cpp b/MeshLib/Properties.cpp
index 685186da4c51c66b802e98b2b6366ee06dc1c2ab..2423ac01b8b397e0a4b0aa5340ca1eb08ae80c4f 100644
--- a/MeshLib/Properties.cpp
+++ b/MeshLib/Properties.cpp
@@ -21,7 +21,7 @@ void Properties::removePropertyVector(std::string const& name)
         _properties.find(name)
     );
     if (it == _properties.end()) {
-        WARN("A property of the name '%s' does not exist.", name.c_str());
+        WARN("A property of the name '{:s}' does not exist.", name);
         return;
     }
     delete it->second;
diff --git a/MeshLib/Properties.h b/MeshLib/Properties.h
index bd0f28c8210702463017e29110505cce28612cf3..6f619e6cffd3314b4129e915c8736fdfb9057e2a 100644
--- a/MeshLib/Properties.h
+++ b/MeshLib/Properties.h
@@ -16,7 +16,7 @@
 #include <string>
 #include <map>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Location.h"
 
diff --git a/MeshLib/PropertyVector.h b/MeshLib/PropertyVector.h
index 1a4f3fdf09ded126bbcf275f028427d0269b20e7..b79aecce97954194434b297c95f921abc2f9997a 100644
--- a/MeshLib/PropertyVector.h
+++ b/MeshLib/PropertyVector.h
@@ -231,8 +231,8 @@ public:
         if (p == nullptr)
         {
             OGS_FATAL(
-                "No data found in the property vector %s "
-                "for the tuple index %d and component %d",
+                "No data found in the property vector {:s} "
+                "for the tuple index {:d} and component {:d}",
                 getPropertyName().c_str(), tuple_index, component);
         }
         return p[component];
diff --git a/MeshLib/Vtk/VtkMappedMeshSource.cpp b/MeshLib/Vtk/VtkMappedMeshSource.cpp
index c31e9dfbd80bf38159c6709f797e38bc11fed3c8..692a087aae97cc2a248026275da007b8a6c221ff 100644
--- a/MeshLib/Vtk/VtkMappedMeshSource.cpp
+++ b/MeshLib/Vtk/VtkMappedMeshSource.cpp
@@ -172,8 +172,8 @@ int VtkMappedMeshSource::RequestData(vtkInformation* /*request*/,
         }
 
         OGS_FATAL(
-            "Mesh property '%s' with unknown data type. Please check the data "
-            "type of the mesh properties. The available data types are:"
+            "Mesh property '{:s}' with unknown data type. Please check the "
+            "data type of the mesh properties. The available data types are:"
             "\n\t double,"
             "\n\t float,"
             "\n\t int,"
diff --git a/MeshLib/VtkOGSEnum.cpp b/MeshLib/VtkOGSEnum.cpp
index adb03cb5faaa52c278953ccfa6682e6385284a12..ab773418698b4f3890dc8f17c89c8d2a15f9c06b 100644
--- a/MeshLib/VtkOGSEnum.cpp
+++ b/MeshLib/VtkOGSEnum.cpp
@@ -59,7 +59,7 @@ int OGSToVtkCellType(MeshLib::CellType ogs)
         default:
             OGS_FATAL(
                 "Unknown cell type in conversion from OGS to VTK. Given cell "
-                "type value is %d.",
+                "type value is {:d}.",
                 ogs);
     }
 }
diff --git a/MeshLib/convertMeshToGeo.cpp b/MeshLib/convertMeshToGeo.cpp
index 6e09abe59c819c3721615ba9435606fee68a3d8a..3f0fe7b1f1a67f2492aa99ba5113f36708a287ae 100644
--- a/MeshLib/convertMeshToGeo.cpp
+++ b/MeshLib/convertMeshToGeo.cpp
@@ -14,7 +14,7 @@
 
 #include "convertMeshToGeo.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "GeoLib/GEOObjects.h"
 #include "GeoLib/Surface.h"
@@ -103,7 +103,7 @@ bool convertMeshToGeo(const MeshLib::Mesh& mesh,
         {
             OGS_FATAL(
                 "Could not get minimum/maximum ranges values for the "
-                "MaterialIDs property in the mesh '%s'.",
+                "MaterialIDs property in the mesh '{:s}'.",
                 mesh.getName().c_str());
         }
         return std::make_tuple(materialIds, *bounds);
diff --git a/NumLib/CMakeLists.txt b/NumLib/CMakeLists.txt
index 7d66a36d90b55d3679a199c82e7254bf6840a74b..20cf10131a39099e83bbf49ee18f1da031c1076f 100644
--- a/NumLib/CMakeLists.txt
+++ b/NumLib/CMakeLists.txt
@@ -19,10 +19,7 @@ target_include_directories(NumLib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
 
 set_target_properties(NumLib PROPERTIES LINKER_LANGUAGE CXX)
 
-target_link_libraries(NumLib
-                      PUBLIC BaseLib
-                             GeoLib
-                             MathLib
-                             MeshLib
-                             logog
-                      PRIVATE MeshGeoToolsLib)
+target_link_libraries(
+    NumLib
+    PUBLIC BaseLib GeoLib MathLib MeshLib
+    PRIVATE MeshGeoToolsLib spdlog::spdlog)
diff --git a/NumLib/DOF/LocalToGlobalIndexMap.cpp b/NumLib/DOF/LocalToGlobalIndexMap.cpp
index 9d2958b96a7f7653916f61903726c4b0f7a00c52..83fa3a9f5ec1033be8534f02d1fc5a80d37d6464 100644
--- a/NumLib/DOF/LocalToGlobalIndexMap.cpp
+++ b/NumLib/DOF/LocalToGlobalIndexMap.cpp
@@ -209,7 +209,7 @@ LocalToGlobalIndexMap::LocalToGlobalIndexMap(
     {
         OGS_FATAL(
             "Number of mesh subsets is not equal to number of components. "
-            "There are %d mesh subsets and %d components.",
+            "There are {:d} mesh subsets and {:d} components.",
             _mesh_subsets.size(), global_component_ids.size());
     }
 
diff --git a/NumLib/DOF/MeshComponentMap.cpp b/NumLib/DOF/MeshComponentMap.cpp
index badc124d5fd621ee28d040e90496af6030adea64..a69b7c9f13ffd3b8feafd2b7b8df629d5f22a328 100644
--- a/NumLib/DOF/MeshComponentMap.cpp
+++ b/NumLib/DOF/MeshComponentMap.cpp
@@ -126,7 +126,7 @@ MeshComponentMap MeshComponentMap::getSubset(
             OGS_FATAL(
                 "Assumption in the MeshComponentMap violated. Expecting "
                 "all of mesh ids to be the same, but it is not true for "
-                "the mesh '%s' with id %d.",
+                "the mesh '{:s}' with id {:d}.",
                 first_mismatch->getMesh().getName().c_str(),
                 first_mismatch->getMeshID());
         }
@@ -173,9 +173,11 @@ MeshComponentMap MeshComponentMap::getSubset(
                 if (is_base_node)
                 {
                     OGS_FATAL(
-                        "Could not find a global index for global component %d "
-                        "for the mesh '%s', node %d, in the corresponding bulk "
-                        "mesh '%s' and node %d. This happens because the "
+                        "Could not find a global index for global component "
+                        "{:d} "
+                        "for the mesh '{:s}', node {:d}, in the corresponding "
+                        "bulk "
+                        "mesh '{:s}' and node {:d}. This happens because the "
                         "boundary mesh is larger then the definition region of "
                         "the bulk component, usually because the geometry for "
                         "the boundary condition is too large.",
@@ -342,7 +344,7 @@ GlobalIndexType MeshComponentMap::getLocalIndex(
         _ghosts_indices.begin(), _ghosts_indices.end(), real_global_index);
     if (ghost_index_it == _ghosts_indices.end())
     {
-        OGS_FATAL("index %d not found in ghost_indices", real_global_index);
+        OGS_FATAL("index {:d} not found in ghost_indices", real_global_index);
     }
 
     // Using std::distance on a std::vector is O(1). As long as _ghost_indices
diff --git a/NumLib/DOF/SimpleMatrixVectorProvider.cpp b/NumLib/DOF/SimpleMatrixVectorProvider.cpp
index 19c7c38b6cd9f13c2c484f235478ec355957c5d8..97fcd0a76be6c73f6097a62ddf1dbe05ea449659 100644
--- a/NumLib/DOF/SimpleMatrixVectorProvider.cpp
+++ b/NumLib/DOF/SimpleMatrixVectorProvider.cpp
@@ -11,7 +11,7 @@
 #include "SimpleMatrixVectorProvider.h"
 
 #include <cassert>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Error.h"
 #include "MathLib/LinAlg/LinAlg.h"
diff --git a/NumLib/Extrapolation/LocalLinearLeastSquaresExtrapolator.cpp b/NumLib/Extrapolation/LocalLinearLeastSquaresExtrapolator.cpp
index bdd04ef2b5f239e51cb440fecc3eb07a9065ef1c..46096293f72005d74dc7b0e296fd87fc20483a90 100644
--- a/NumLib/Extrapolation/LocalLinearLeastSquaresExtrapolator.cpp
+++ b/NumLib/Extrapolation/LocalLinearLeastSquaresExtrapolator.cpp
@@ -11,7 +11,7 @@
 #include "LocalLinearLeastSquaresExtrapolator.h"
 
 #include <Eigen/SVD>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
 #include "MathLib/LinAlg/LinAlg.h"
@@ -160,7 +160,7 @@ void LocalLinearLeastSquaresExtrapolator::extrapolateElement(
         OGS_FATAL(
             "The number of computed integration point values is not divisable "
             "by the number of num_components. Maybe the computed property is "
-            "not a %d-component vector for each integration point.",
+            "not a {:d}-component vector for each integration point.",
             num_components);
     }
 
@@ -289,7 +289,7 @@ void LocalLinearLeastSquaresExtrapolator::calculateResidualElement(
         OGS_FATAL(
             "The number of computed integration point values is not divisable "
             "by the number of num_components. Maybe the computed property is "
-            "not a %d-component vector for each integration point.",
+            "not a {:d}-component vector for each integration point.",
             num_components);
     }
 
diff --git a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp
index c8b17dd35ab8522f2bd9052ee9d0ece97ccc1d88..f33dac6f53cde2aa074efbe8780ec6a778f63edf 100644
--- a/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp
+++ b/NumLib/Fem/CoordinatesMapping/NaturalCoordinatesMapping.cpp
@@ -108,7 +108,9 @@ static void checkJacobianDeterminant(const double detJ,
 
     if (detJ < 0)
     {
-        ERR("det J = %g is negative for element %d.", detJ, element.getID());
+        ERR("det J = {:g} is negative for element {:d}.",
+            detJ,
+            element.getID());
 #ifndef NDEBUG
         std::cerr << element << "\n";
 #endif  // NDEBUG
@@ -119,7 +121,7 @@ static void checkJacobianDeterminant(const double detJ,
 
     if (detJ == 0)
     {
-        ERR("det J is zero for element %d.", element.getID());
+        ERR("det J is zero for element {:d}.", element.getID());
 #ifndef NDEBUG
         std::cerr << element << "\n";
 #endif  // NDEBUG
diff --git a/NumLib/NewtonRaphson.h b/NumLib/NewtonRaphson.h
index 87a6f278b8c8589b700d912192e22ab4ccd8c114..290c3149ae8c828a8f321a5d3503acb5387a47af 100644
--- a/NumLib/NewtonRaphson.h
+++ b/NumLib/NewtonRaphson.h
@@ -11,7 +11,7 @@
 #pragma once
 
 #include <boost/optional.hpp>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <Eigen/Dense>
 
@@ -71,20 +71,21 @@ public:
 
             increment.noalias() =
                 _linear_solver.compute(jacobian).solve(-residual);
-            // DBUG("Local linear solver accuracy |J dx - r| = %g",
+            // DBUG("Local linear solver accuracy |J dx - r| = {:g}",
             //      (jacobian * increment + residual).norm());
 
             _solution_update(increment);
 
-            // DBUG("Local Newton: Iteration #%d |dx| = %g, |r| = %g",
+            // DBUG("Local Newton: Iteration #{:d} |dx| = {:g}, |r| = {:g}",
             //      iteration, increment.norm(), residual.norm());
         } while (iteration++ < _maximum_iterations);
 
         if (iteration > _maximum_iterations)
         {
             ERR("The local Newton method did not converge within the given "
-                "number of iterations. Iteration: %d, increment %g, residual: "
-                "%g",
+                "number of iterations. Iteration: {:d}, increment {:g}, "
+                "residual: "
+                "{:g}",
                 iteration - 1, increment.norm(), residual.norm());
             return {};
         }
diff --git a/NumLib/ODESolver/ConvergenceCriterion.cpp b/NumLib/ODESolver/ConvergenceCriterion.cpp
index 7924e9176aeec1c455c01021734625170981cf45..5babc76d086b4cb442736f49b58661189afdfb5d 100644
--- a/NumLib/ODESolver/ConvergenceCriterion.cpp
+++ b/NumLib/ODESolver/ConvergenceCriterion.cpp
@@ -41,7 +41,8 @@ std::unique_ptr<ConvergenceCriterion> createConvergenceCriterion(
         return createConvergenceCriterionPerComponentResidual(config);
     }
 
-    OGS_FATAL("There is no convergence criterion of type `%s'.", type.c_str());
+    OGS_FATAL("There is no convergence criterion of type `{:s}'.",
+              type.c_str());
 }
 
 bool checkRelativeTolerance(const double reltol, const double numerator,
diff --git a/NumLib/ODESolver/ConvergenceCriterionDeltaX.cpp b/NumLib/ODESolver/ConvergenceCriterionDeltaX.cpp
index f62eaa8a376bbb9ab90d63e8bbc2c9d449aca85f..438caf36a27a555a5b157b8d64599d5669f004b8 100644
--- a/NumLib/ODESolver/ConvergenceCriterionDeltaX.cpp
+++ b/NumLib/ODESolver/ConvergenceCriterionDeltaX.cpp
@@ -9,7 +9,7 @@
  */
 
 #include "ConvergenceCriterionDeltaX.h"
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "MathLib/LinAlg/LinAlg.h"
@@ -38,8 +38,8 @@ void ConvergenceCriterionDeltaX::checkDeltaX(const GlobalVector& minus_delta_x,
     auto error_dx = MathLib::LinAlg::norm(minus_delta_x, _norm_type);
     auto norm_x = MathLib::LinAlg::norm(x, _norm_type);
 
-    INFO("Convergence criterion: |dx|=%.4e, |x|=%.4e, |dx|/|x|=%.4e", error_dx,
-         norm_x,
+    INFO("Convergence criterion: |dx|={:.4e}, |x|={:.4e}, |dx|/|x|={:.4e}",
+         error_dx, norm_x,
          (norm_x == 0. ? std::numeric_limits<double>::quiet_NaN()
                        : (error_dx / norm_x)));
 
@@ -73,7 +73,7 @@ std::unique_ptr<ConvergenceCriterionDeltaX> createConvergenceCriterionDeltaX(
 
     if (norm_type == MathLib::VecNormType::INVALID)
     {
-        OGS_FATAL("Unknown vector norm type `%s'.", norm_type_str.c_str());
+        OGS_FATAL("Unknown vector norm type `{:s}'.", norm_type_str.c_str());
     }
 
     return std::make_unique<ConvergenceCriterionDeltaX>(
diff --git a/NumLib/ODESolver/ConvergenceCriterionPerComponentDeltaX.cpp b/NumLib/ODESolver/ConvergenceCriterionPerComponentDeltaX.cpp
index 9311aa94a82c163b8ae4bc59078a15673f6e1363..8fe5bffb16b150a644ce01408d3443c12cee354d 100644
--- a/NumLib/ODESolver/ConvergenceCriterionPerComponentDeltaX.cpp
+++ b/NumLib/ODESolver/ConvergenceCriterionPerComponentDeltaX.cpp
@@ -9,8 +9,8 @@
  */
 
 #include "ConvergenceCriterionPerComponentDeltaX.h"
-#include <logog/include/logog.hpp>
 #include <limits>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
@@ -60,8 +60,8 @@ void ConvergenceCriterionPerComponentDeltaX::checkDeltaX(
             norm(x, global_component, _norm_type, *_dof_table, *_mesh);
 
         INFO(
-            "Convergence criterion, component %u: |dx|=%.4e, |x|=%.4e, "
-            "|dx|/|x|=%.4e",
+            "Convergence criterion, component {:d}: |dx|={:.4e}, |x|={:.4e}, "
+            "|dx|/|x|={:.4e}",
             global_component, error_dx, norm_x,
             (norm_x == 0. ? std::numeric_limits<double>::quiet_NaN()
                           : (error_dx / norm_x)));
@@ -122,7 +122,7 @@ createConvergenceCriterionPerComponentDeltaX(const BaseLib::ConfigTree& config)
 
     if (norm_type == MathLib::VecNormType::INVALID)
     {
-        OGS_FATAL("Unknown vector norm type `%s'.", norm_type_str.c_str());
+        OGS_FATAL("Unknown vector norm type `{:s}'.", norm_type_str.c_str());
     }
 
     return std::make_unique<ConvergenceCriterionPerComponentDeltaX>(
diff --git a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp
index e10481159f05d3ab70c75e307cb66f5a1d6e2270..0a9d3196c369c2d8c58df1988e0a91bdacca50a4 100644
--- a/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp
+++ b/NumLib/ODESolver/ConvergenceCriterionPerComponentResidual.cpp
@@ -9,7 +9,7 @@
  */
 
 #include "ConvergenceCriterionPerComponentResidual.h"
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "NumLib/DOF/DOFTableUtil.h"
@@ -59,8 +59,8 @@ void ConvergenceCriterionPerComponentResidual::checkDeltaX(
             norm(x, global_component, _norm_type, *_dof_table, *_mesh);
 
         INFO(
-            "Convergence criterion, component %u: |dx|=%.4e, |x|=%.4e, "
-            "|dx|/|x|=%.4e",
+            "Convergence criterion, component {:d}: |dx|={:.4e}, |x|={:.4e}, "
+            "|dx|/|x|={:.4e}",
             global_component, error_dx, norm_x,
             (norm_x == 0. ? std::numeric_limits<double>::quiet_NaN()
                           : (error_dx / norm_x)));
@@ -89,13 +89,15 @@ void ConvergenceCriterionPerComponentResidual::checkResidual(
                              *_dof_table, *_mesh);
 
         if (_is_first_iteration) {
-            INFO("Convergence criterion, component %u: |r0|=%.4e", global_component, norm_res);
+            INFO("Convergence criterion, component {:d}: |r0|={:.4e}",
+                 global_component, norm_res);
             _residual_norms_0[global_component] = norm_res;
         } else {
             auto const norm_res0 = _residual_norms_0[global_component];
             INFO(
-                "Convergence criterion, component %u: |r|=%.4e, |r0|=%.4e, "
-                "|r|/|r0|=%.4e",
+                "Convergence criterion, component {:d}: |r|={:.4e}, "
+                "|r0|={:.4e}, "
+                "|r|/|r0|={:.4e}",
                 global_component, norm_res, norm_res0,
                 (norm_res0 == 0. ? std::numeric_limits<double>::quiet_NaN()
                                  : (norm_res / norm_res0)));
@@ -159,7 +161,7 @@ createConvergenceCriterionPerComponentResidual(
 
     if (norm_type == MathLib::VecNormType::INVALID)
     {
-        OGS_FATAL("Unknown vector norm type `%s'.", norm_type_str.c_str());
+        OGS_FATAL("Unknown vector norm type `{:s}'.", norm_type_str.c_str());
     }
 
     return std::make_unique<ConvergenceCriterionPerComponentResidual>(
diff --git a/NumLib/ODESolver/ConvergenceCriterionResidual.cpp b/NumLib/ODESolver/ConvergenceCriterionResidual.cpp
index 7366239b09123151c92766a8652a9c23c51b012d..1d94919c10273046ef9777bb0b04241148374a33 100644
--- a/NumLib/ODESolver/ConvergenceCriterionResidual.cpp
+++ b/NumLib/ODESolver/ConvergenceCriterionResidual.cpp
@@ -9,7 +9,7 @@
  */
 
 #include "ConvergenceCriterionResidual.h"
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "MathLib/LinAlg/LinAlg.h"
@@ -38,8 +38,8 @@ void ConvergenceCriterionResidual::checkDeltaX(
     auto error_dx = MathLib::LinAlg::norm(minus_delta_x, _norm_type);
     auto norm_x = MathLib::LinAlg::norm(x, _norm_type);
 
-    INFO("Convergence criterion: |dx|=%.4e, |x|=%.4e, |dx|/|x|=%.4e", error_dx,
-         norm_x,
+    INFO("Convergence criterion: |dx|={:.4e}, |x|={:.4e}, |dx|/|x|={:.4e}",
+         error_dx, norm_x,
          (norm_x == 0. ? std::numeric_limits<double>::quiet_NaN()
                        : (error_dx / norm_x)));
 }
@@ -50,7 +50,7 @@ void ConvergenceCriterionResidual::checkResidual(const GlobalVector& residual)
 
     if (_is_first_iteration)
     {
-        INFO("Convergence criterion: |r0|=%.4e", norm_res);
+        INFO("Convergence criterion: |r0|={:.4e}", norm_res);
         _residual_norm_0 = norm_res;
     }
     else
@@ -61,16 +61,17 @@ void ConvergenceCriterionResidual::checkResidual(const GlobalVector& residual)
                 : _residual_norm_0;
         if (_residual_norm_0 < std::numeric_limits<double>::epsilon())
         {
-            INFO("Convergence criterion: |r|=%.4e |r0|=%.4e", norm_res,
+            INFO("Convergence criterion: |r|={:.4e} |r0|={:.4e}", norm_res,
                  _residual_norm_0);
         }
         else
         {
-            INFO("Convergence criterion: |r|=%.4e |r0|=%.4e |r|/|r0|=%.4e",
-                 norm_res, _residual_norm_0,
-                 (_residual_norm_0 == 0.
-                      ? std::numeric_limits<double>::quiet_NaN()
-                      : (norm_res / _residual_norm_0)));
+            INFO(
+                "Convergence criterion: |r|={:.4e} |r0|={:.4e} |r|/|r0|={:.4e}",
+                norm_res, _residual_norm_0,
+                (_residual_norm_0 == 0.
+                     ? std::numeric_limits<double>::quiet_NaN()
+                     : (norm_res / _residual_norm_0)));
         }
     }
 
@@ -107,7 +108,7 @@ createConvergenceCriterionResidual(const BaseLib::ConfigTree& config)
 
     if (norm_type == MathLib::VecNormType::INVALID)
     {
-        OGS_FATAL("Unknown vector norm type `%s'.", norm_type_str.c_str());
+        OGS_FATAL("Unknown vector norm type `{:s}'.", norm_type_str.c_str());
     }
 
     return std::make_unique<ConvergenceCriterionResidual>(
diff --git a/NumLib/ODESolver/NonlinearSolver.cpp b/NumLib/ODESolver/NonlinearSolver.cpp
index 4852d09f51c701d35f33dad79722944e800e36c3..5d648181bc803e77824b53d4a3ea1872255a6ec0 100644
--- a/NumLib/ODESolver/NonlinearSolver.cpp
+++ b/NumLib/ODESolver/NonlinearSolver.cpp
@@ -10,7 +10,7 @@
 
 #include "NonlinearSolver.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "BaseLib/Error.h"
@@ -94,7 +94,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Picard>::solve(
         sys.assemble(x_new, process_id);
         sys.getA(A);
         sys.getRhs(rhs);
-        INFO("[time] Assembly took %g s.", time_assembly.elapsed());
+        INFO("[time] Assembly took {:g} s.", time_assembly.elapsed());
 
         // Subract non-equilibrium initial residuum if set
         if (_r_neq != nullptr)
@@ -105,7 +105,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Picard>::solve(
         timer_dirichlet.start();
         sys.applyKnownSolutionsPicard(A, rhs, *x_new[process_id]);
         time_dirichlet += timer_dirichlet.elapsed();
-        INFO("[time] Applying Dirichlet BCs took %g s.", time_dirichlet);
+        INFO("[time] Applying Dirichlet BCs took {:g} s.", time_dirichlet);
 
         if (!sys.isLinear() && _convergence_criterion->hasResidualCheck()) {
             GlobalVector res;
@@ -118,7 +118,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Picard>::solve(
         time_linear_solver.start();
         bool iteration_succeeded =
             _linear_solver.solve(A, rhs, *x_new[process_id]);
-        INFO("[time] Linear solver took %g s.", time_linear_solver.elapsed());
+        INFO("[time] Linear solver took {:g} s.", time_linear_solver.elapsed());
 
         if (!iteration_succeeded)
         {
@@ -181,7 +181,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Picard>::solve(
         // Update x s.t. in the next iteration we will compute the right delta x
         LinAlg::copy(*x_new[process_id], *x[process_id]);
 
-        INFO("[time] Iteration #%u took %g s.", iteration,
+        INFO("[time] Iteration #{:d} took {:g} s.", iteration,
              time_iteration.elapsed());
 
         if (error_norms_met)
@@ -199,7 +199,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Picard>::solve(
 
     if (iteration > _maxiter)
     {
-        ERR("Picard: Could not solve the given nonlinear system within %u "
+        ERR("Picard: Could not solve the given nonlinear system within {:d} "
             "iterations",
             _maxiter);
     }
@@ -284,7 +284,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Newton>::solve(
         }
         catch (AssemblyException const& e)
         {
-            ERR("Abort nonlinear iteration. Repeating timestep. Reason: %s",
+            ERR("Abort nonlinear iteration. Repeating timestep. Reason: {:s}",
                 e.what());
             error_norms_met = false;
             iteration = _maxiter;
@@ -292,7 +292,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Newton>::solve(
         }
         sys.getResidual(*x[process_id], res);
         sys.getJacobian(J);
-        INFO("[time] Assembly took %g s.", time_assembly.elapsed());
+        INFO("[time] Assembly took {:g} s.", time_assembly.elapsed());
 
         // Subract non-equilibrium initial residuum if set
         if (_r_neq != nullptr)
@@ -303,7 +303,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Newton>::solve(
         timer_dirichlet.start();
         sys.applyKnownSolutionsNewton(J, res, minus_delta_x);
         time_dirichlet += timer_dirichlet.elapsed();
-        INFO("[time] Applying Dirichlet BCs took %g s.", time_dirichlet);
+        INFO("[time] Applying Dirichlet BCs took {:g} s.", time_dirichlet);
 
         if (!sys.isLinear() && _convergence_criterion->hasResidualCheck())
         {
@@ -313,7 +313,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Newton>::solve(
         BaseLib::RunTime time_linear_solver;
         time_linear_solver.start();
         bool iteration_succeeded = _linear_solver.solve(J, res, minus_delta_x);
-        INFO("[time] Linear solver took %g s.", time_linear_solver.elapsed());
+        INFO("[time] Linear solver took {:g} s.", time_linear_solver.elapsed());
 
         if (!iteration_succeeded)
         {
@@ -382,7 +382,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Newton>::solve(
             error_norms_met = _convergence_criterion->isSatisfied();
         }
 
-        INFO("[time] Iteration #%u took %g s.", iteration,
+        INFO("[time] Iteration #{:d} took {:g} s.", iteration,
              time_iteration.elapsed());
 
         if (error_norms_met)
@@ -400,7 +400,7 @@ NonlinearSolverStatus NonlinearSolver<NonlinearSolverTag::Newton>::solve(
 
     if (iteration > _maxiter)
     {
-        ERR("Newton: Could not solve the given nonlinear system within %u "
+        ERR("Newton: Could not solve the given nonlinear system within {:d} "
             "iterations",
             _maxiter);
     }
@@ -436,7 +436,7 @@ createNonlinearSolver(GlobalLinearSolver& linear_solver,
         {
             OGS_FATAL(
                 "The damping factor for the Newon method must be positive, got "
-                "%g.",
+                "{:g}.",
                 damping);
         }
         auto const tag = NonlinearSolverTag::Newton;
diff --git a/NumLib/ODESolver/NonlinearSolver.h b/NumLib/ODESolver/NonlinearSolver.h
index 10510ba9db7b1a5ff60bd551b2397001965cdb1c..ad0fdf89e987b75c09e10553be55f4c2988cd46e 100644
--- a/NumLib/ODESolver/NonlinearSolver.h
+++ b/NumLib/ODESolver/NonlinearSolver.h
@@ -12,7 +12,7 @@
 
 #include <memory>
 #include <utility>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "ConvergenceCriterion.h"
 #include "NonlinearSolverStatus.h"
diff --git a/NumLib/ODESolver/TimeDiscretizationBuilder.cpp b/NumLib/ODESolver/TimeDiscretizationBuilder.cpp
index a79f66160a71fe3375e8b4425f9364251363f25a..59fbb2070daed49627de36a5192ebc81e3019c56 100644
--- a/NumLib/ODESolver/TimeDiscretizationBuilder.cpp
+++ b/NumLib/ODESolver/TimeDiscretizationBuilder.cpp
@@ -45,6 +45,6 @@ std::unique_ptr<TimeDiscretization> createTimeDiscretization(
         return std::make_unique<BackwardDifferentiationFormula>(order);
     }
 
-    OGS_FATAL("Unrecognized time discretization type `%s'", type.c_str());
+    OGS_FATAL("Unrecognized time discretization type `{:s}'", type.c_str());
 }
 }  // namespace NumLib
diff --git a/NumLib/TimeStepping/Algorithms/CreateFixedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/CreateFixedTimeStepping.cpp
index 39ef6017d81c083af0ed80c10ed20df42a2adfba..b35a8600f66c6033de1db5f199398a4e11e56e5f 100644
--- a/NumLib/TimeStepping/Algorithms/CreateFixedTimeStepping.cpp
+++ b/NumLib/TimeStepping/Algorithms/CreateFixedTimeStepping.cpp
@@ -72,9 +72,9 @@ std::unique_ptr<TimeStepAlgorithm> createFixedTimeStepping(
             {
                 OGS_FATAL(
                     "Resize of the time steps vector failed for the requested "
-                    "new size %u. Probably there is not enough memory (%g GiB "
-                    "requested).\n"
-                    "Thrown exception: %s",
+                    "new size {:d}. Probably there is not enough memory ({:g} "
+                    "GiB requested).\n"
+                    "Thrown exception: {:s}",
                     new_size,
                     new_size * sizeof(double) / 1024. / 1024. / 1024.,
                     e.what());
@@ -83,9 +83,9 @@ std::unique_ptr<TimeStepAlgorithm> createFixedTimeStepping(
             {
                 OGS_FATAL(
                     "Resize of the time steps vector failed for the requested "
-                    "new size %u. Probably there is not enough memory (%g GiB "
-                    "requested).\n"
-                    "Thrown exception: %s",
+                    "new size {:d}. Probably there is not enough memory ({:g} "
+                    "GiB requested).\n"
+                    "Thrown exception: {:s}",
                     new_size, new_size * sizeof(double) / 1024. / 1024. / 1024.,
                     e.what());
             }
@@ -108,9 +108,9 @@ std::unique_ptr<TimeStepAlgorithm> createFixedTimeStepping(
         {
             OGS_FATAL(
                 "Resize of the time steps vector failed for the requested new "
-                "size %u. Probably there is not enough memory (%g GiB "
+                "size {:d}. Probably there is not enough memory ({:g} GiB "
                 "requested).\n"
-                "Thrown exception: %s",
+                "Thrown exception: {:s}",
                 new_size,
                 new_size * sizeof(double) / 1024. / 1024. / 1024.,
                 e.what());
@@ -119,9 +119,9 @@ std::unique_ptr<TimeStepAlgorithm> createFixedTimeStepping(
         {
             OGS_FATAL(
                 "Resize of the time steps vector failed for the requested new "
-                "size %u. Probably there is not enough memory (%g GiB "
+                "size {:d}. Probably there is not enough memory ({:g} GiB "
                 "requested).\n"
-                "Thrown exception: %s",
+                "Thrown exception: {:s}",
                 new_size, new_size * sizeof(double) / 1024. / 1024. / 1024.,
                 e.what());
         }
diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
index 1f8a692ac896a51a3b3cd64149557bf2345ef28c..b0d0c3de1a6a2d162413a8100a29633a19238994 100644
--- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
+++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp
@@ -14,7 +14,7 @@
 #include <functional>
 #include <limits>
 #include <vector>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Algorithm.h"
 
@@ -66,9 +66,9 @@ bool EvolutionaryPIDcontroller::next(double const solution_error,
             "This step is rejected due to the relative change from the"
             " solution of the previous\n"
             "\t time step to the current solution exceeds the given tolerance"
-            " of %g.\n"
+            " of {:g}.\n"
             "\t This time step will be repeated with a new time step size of"
-            " %g\n"
+            " {:g}\n"
             "\t or the simulation will be halted.",
             _tol, h_new);
 
diff --git a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
index faf0a559f57379d1a7729ebd6300b5442d0b3b8f..c65c9f7b8b86384ac83d4c9affa1ae90cdc5e489 100644
--- a/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
+++ b/NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h
@@ -44,9 +44,9 @@ public:
         {
             OGS_FATAL(
                 "Resize of the time steps vector failed for the requested new "
-                "size %u. Probably there is not enough memory (%g GiB "
+                "size {:d}. Probably there is not enough memory ({:g} GiB "
                 "requested).\n"
-                "Thrown exception: %s",
+                "Thrown exception: {:s}",
                 new_size, new_size * sizeof(double) / 1024. / 1024. / 1024.,
                 e.what());
         }
@@ -54,9 +54,9 @@ public:
         {
             OGS_FATAL(
                 "Allocation of the time steps vector failed for the requested "
-                "size %u. Probably there is not enough memory (%d GiB "
+                "size {:d}. Probably there is not enough memory ({:d} GiB "
                 "requested).\n"
-                "Thrown exception: %s",
+                "Thrown exception: {:s}",
                 new_size,
                 new_size * sizeof(double) / 1024. / 1024. / 1024.,
                 e.what());
diff --git a/NumLib/TimeStepping/CreateTimeStepper.cpp b/NumLib/TimeStepping/CreateTimeStepper.cpp
index cd24414076f564912d7d3741a6bf84d2fcc7dd63..1623568cecbef115f5883268e9c1736fb2279d8a 100644
--- a/NumLib/TimeStepping/CreateTimeStepper.cpp
+++ b/NumLib/TimeStepping/CreateTimeStepper.cpp
@@ -49,7 +49,7 @@ std::unique_ptr<TimeStepAlgorithm> createTimeStepper(
         return NumLib::createIterationNumberBasedTimeStepping(config);
     }
     OGS_FATAL(
-        "Unknown time stepping type: '%s'. The available types are: "
+        "Unknown time stepping type: '{:s}'. The available types are: "
         "\n\tSingleStep,"
         "\n\tFixedTimeStepping,"
         "\n\tEvolutionaryPIDcontroller,",
diff --git a/ParameterLib/CMakeLists.txt b/ParameterLib/CMakeLists.txt
index 9c54b8e304b8befc474740f1ef53a85c01f3ee0f..de2dcb6bd4d4ae9dd463d98089bb43a0e97f5861 100644
--- a/ParameterLib/CMakeLists.txt
+++ b/ParameterLib/CMakeLists.txt
@@ -7,4 +7,4 @@ include(GenerateExportHeader)
 generate_export_header(ParameterLib)
 target_include_directories(ParameterLib PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
 
-target_link_libraries(ParameterLib PUBLIC MathLib PRIVATE BaseLib MeshLib)
+target_link_libraries(ParameterLib PUBLIC MathLib PRIVATE BaseLib MeshLib spdlog::spdlog)
diff --git a/ParameterLib/ConstantParameter.cpp b/ParameterLib/ConstantParameter.cpp
index 46b54d7fe24dbea5bbdb6f8e39d32e24340db7a2..9091ba090c374ec8ab415566eece2cf9f17a227b 100644
--- a/ParameterLib/ConstantParameter.cpp
+++ b/ParameterLib/ConstantParameter.cpp
@@ -11,6 +11,7 @@
 #include "ConstantParameter.h"
 #include "BaseLib/ConfigTree.h"
 #include "BaseLib/Error.h"
+#include "BaseLib/Logging.h"
 
 namespace ParameterLib
 {
@@ -33,10 +34,10 @@ std::unique_ptr<ParameterBase> createConstantParameter(
             if (value->size() != 1)
             {
                 OGS_FATAL(
-                    "Expected to read exactly one value, but %d were given.",
+                    "Expected to read exactly one value, but {:d} were given.",
                     value->size());
             }
-            DBUG("Using value %g for constant parameter.", (*value)[0]);
+            DBUG("Using value {:g} for constant parameter.", (*value)[0]);
             return std::make_unique<ConstantParameter<double>>(name,
                                                                (*value)[0]);
         }
@@ -56,7 +57,7 @@ std::unique_ptr<ParameterBase> createConstantParameter(
     for (double const v : values)
     {
         (void)v;  // unused value if building w/o DBUG output.
-        DBUG("\t%g", v);
+        DBUG("\t{:g}", v);
     }
 
     return std::make_unique<ConstantParameter<double>>(name, values);
diff --git a/ParameterLib/CoordinateSystem.cpp b/ParameterLib/CoordinateSystem.cpp
index 0dc9fc8bb4acb4c30b5c3b590de7b25eb338cad5..510e8172971bdf44a291d2ce11f417d6ddf0c146 100644
--- a/ParameterLib/CoordinateSystem.cpp
+++ b/ParameterLib/CoordinateSystem.cpp
@@ -23,8 +23,9 @@ CoordinateSystem::CoordinateSystem(Parameter<double> const& e0,
     if (typeid(_base[0]) != typeid(_base[1]))
     {
         OGS_FATAL(
-            "The parameter types for the basis must be equal but they are '%s' "
-            "and '%s'.",
+            "The parameter types for the basis must be equal but they are "
+            "'{:s}' "
+            "and '{:s}'.",
             typeid(_base[0]).name(),
             typeid(_base[1]).name());
     }
@@ -50,7 +51,7 @@ CoordinateSystem::CoordinateSystem(Parameter<double> const& e0,
     {
         OGS_FATAL(
             "The parameter types for the basis must be equal but they are "
-            "'%s', '%s', and '%s'.",
+            "'{:s}', '{:s}', and '{:s}'.",
             typeid(_base[0]).name(),
             typeid(_base[1]).name(),
             typeid(_base[2]).name());
@@ -90,7 +91,7 @@ Eigen::Matrix<double, 2, 2> CoordinateSystem::transformation<2>(
     {
         OGS_FATAL(
             "The determinant of the coordinate system transformation matrix is "
-            "'%g', which is not sufficiently close to unity.",
+            "'{:g}', which is not sufficiently close to unity.",
             t.determinant());
     }
 #endif  // NDEBUG
@@ -119,7 +120,7 @@ Eigen::Matrix<double, 3, 3> CoordinateSystem::transformation<3>(
     {
         OGS_FATAL(
             "The determinant of the coordinate system transformation matrix is "
-            "'%g', which is not sufficiently close to unity.",
+            "'{:g}', which is not sufficiently close to unity.",
             t.determinant());
     }
 #endif  // NDEBUG
@@ -144,7 +145,7 @@ Eigen::Matrix<double, 3, 3> CoordinateSystem::transformation_3d(
     {
         OGS_FATAL(
             "The determinant of the coordinate system transformation matrix is "
-            "'%g', which is not sufficiently close to unity.",
+            "'{:g}', which is not sufficiently close to unity.",
             t.determinant());
     }
 #endif  // NDEBUG
diff --git a/ParameterLib/CurveScaledParameter.cpp b/ParameterLib/CurveScaledParameter.cpp
index 117be7f8c81b004025803357398e4f29d083f3ae..94ba48e4cb876f8e764121c2c8aca7b00f7c82b2 100644
--- a/ParameterLib/CurveScaledParameter.cpp
+++ b/ParameterLib/CurveScaledParameter.cpp
@@ -25,18 +25,18 @@ std::unique_ptr<ParameterBase> createCurveScaledParameter(
 
     //! \ogs_file_param{prj__parameters__parameter__CurveScaled__curve}
     auto curve_name = config.getConfigParameter<std::string>("curve");
-    DBUG("Using curve %s", curve_name.c_str());
+    DBUG("Using curve {:s}", curve_name.c_str());
 
     auto const curve_it = curves.find(curve_name);
     if (curve_it == curves.end())
     {
-        OGS_FATAL("Curve `%s' does not exists.", curve_name.c_str());
+        OGS_FATAL("Curve `{:s}' does not exists.", curve_name.c_str());
     }
 
     auto referenced_parameter_name =
         //! \ogs_file_param{prj__parameters__parameter__CurveScaled__parameter}
         config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s", referenced_parameter_name.c_str());
+    DBUG("Using parameter {:s}", referenced_parameter_name.c_str());
 
     // TODO other data types than only double
     return std::make_unique<CurveScaledParameter<double>>(
diff --git a/ParameterLib/FunctionParameter.h b/ParameterLib/FunctionParameter.h
index 98e922648274b8a5d1613ca2797cb980fbadcb87..acfa869a4ce3d4cb63641120c915c79397be7b47 100644
--- a/ParameterLib/FunctionParameter.h
+++ b/ParameterLib/FunctionParameter.h
@@ -61,7 +61,8 @@ struct FunctionParameter final : public Parameter<T>
             parser_t parser;
             if (!parser.compile(_vec_expression_str[i], _vec_expression[i]))
             {
-                OGS_FATAL("Error: %s\tExpression: %s\n", parser.error().c_str(),
+                OGS_FATAL("Error: {:s}\tExpression: {:s}\n",
+                          parser.error().c_str(),
                           _vec_expression_str[i].c_str());
             }
         }
diff --git a/ParameterLib/GroupBasedParameter.cpp b/ParameterLib/GroupBasedParameter.cpp
index 2ed9e87313b78c8451af3146ede0603c012b5914..512eaeb1eed63d4d6e05db0c6bd2a1830a5a4644 100644
--- a/ParameterLib/GroupBasedParameter.cpp
+++ b/ParameterLib/GroupBasedParameter.cpp
@@ -27,7 +27,7 @@ std::unique_ptr<ParameterBase> createGroupBasedParameter(
     std::string const group_id_property_name =
         //! \ogs_file_param{prj__parameters__parameter__Group__group_id_property}
         config.getConfigParameter<std::string>("group_id_property");
-    DBUG("Using group_id_property %s", group_id_property_name.c_str());
+    DBUG("Using group_id_property {:s}", group_id_property_name.c_str());
 
     auto const& group_id_property =
         mesh.getProperties().getPropertyVector<int>(group_id_property_name);
@@ -74,16 +74,16 @@ std::unique_ptr<ParameterBase> createGroupBasedParameter(
         if (itr == group_id_property->end())
         {
             OGS_FATAL(
-                "Specified property index %d does not exist in the property "
-                "vector %s",
+                "Specified property index {:d} does not exist in the property "
+                "vector {:s}",
                 p.first, group_id_property_name.c_str());
         }
 
         if (p.second.size() != n_values)
         {
             OGS_FATAL(
-                "The length of some values (%d) is different from the first "
-                "one (%d). "
+                "The length of some values ({:d}) is different from the first "
+                "one ({:d}). "
                 "The length should be same for all index_values.",
                 p.second.size(), n_values);
         }
diff --git a/ParameterLib/GroupBasedParameter.h b/ParameterLib/GroupBasedParameter.h
index 2728e36ae81aa5b43bf332408bd48d708b124b2d..833ab79289edc37b9386a3708f300204262b88c0 100644
--- a/ParameterLib/GroupBasedParameter.h
+++ b/ParameterLib/GroupBasedParameter.h
@@ -67,7 +67,7 @@ struct GroupBasedParameter final : public Parameter<T>
         auto const& values = _vec_values[index];
         if (values.empty())
         {
-            OGS_FATAL("No data found for the group index %d", index);
+            OGS_FATAL("No data found for the group index {:d}", index);
         }
 
         if (!this->_coordinate_system)
diff --git a/ParameterLib/MeshElementParameter.cpp b/ParameterLib/MeshElementParameter.cpp
index af75cff185a566724b0d65ec93fd44c73198b801..f953c815bed8a4de234c340610c03d685ae330c4 100644
--- a/ParameterLib/MeshElementParameter.cpp
+++ b/ParameterLib/MeshElementParameter.cpp
@@ -23,7 +23,7 @@ std::unique_ptr<ParameterBase> createMeshElementParameter(
     auto const field_name =
         //! \ogs_file_param{prj__parameters__parameter__MeshElement__field_name}
         config.getConfigParameter<std::string>("field_name");
-    DBUG("Using field_name %s", field_name.c_str());
+    DBUG("Using field_name {:s}", field_name.c_str());
 
     // TODO other data types than only double
     auto const& property =
@@ -31,7 +31,7 @@ std::unique_ptr<ParameterBase> createMeshElementParameter(
 
     if (property->getMeshItemType() != MeshLib::MeshItemType::Cell)
     {
-        OGS_FATAL("The mesh property `%s' is not an element property.",
+        OGS_FATAL("The mesh property `{:s}' is not an element property.",
                   field_name.c_str());
     }
 
diff --git a/ParameterLib/MeshNodeParameter.cpp b/ParameterLib/MeshNodeParameter.cpp
index 7b9c745551b526f73c4ba7c4e452b43bee1e3ca0..2ff3833aa46f58b49865da9b107a9cd87eee51ba 100644
--- a/ParameterLib/MeshNodeParameter.cpp
+++ b/ParameterLib/MeshNodeParameter.cpp
@@ -23,7 +23,7 @@ std::unique_ptr<ParameterBase> createMeshNodeParameter(
     auto const field_name =
         //! \ogs_file_param{prj__parameters__parameter__MeshNode__field_name}
         config.getConfigParameter<std::string>("field_name");
-    DBUG("Using field_name %s", field_name.c_str());
+    DBUG("Using field_name {:s}", field_name.c_str());
 
     // TODO other data types than only double
     auto const& property =
@@ -31,7 +31,7 @@ std::unique_ptr<ParameterBase> createMeshNodeParameter(
 
     if (property->getMeshItemType() != MeshLib::MeshItemType::Node)
     {
-        OGS_FATAL("The mesh property `%s' is not a nodal property.",
+        OGS_FATAL("The mesh property `{:s}' is not a nodal property.",
                   field_name.c_str());
     }
 
diff --git a/ParameterLib/Parameter.cpp b/ParameterLib/Parameter.cpp
index 3b8c84405eb396797105d50136444aaa70735b08..a8b7bd3e6f835e6e0b5a925c5dff94ba7ac1226b 100644
--- a/ParameterLib/Parameter.cpp
+++ b/ParameterLib/Parameter.cpp
@@ -48,41 +48,42 @@ std::unique_ptr<ParameterBase> createParameter(
     // Create parameter based on the provided type.
     if (type == "Constant")
     {
-        INFO("ConstantParameter: %s", name.c_str());
+        INFO("ConstantParameter: {:s}", name.c_str());
         return createConstantParameter(name, config);
     }
     if (type == "CurveScaled")
     {
-        INFO("CurveScaledParameter: %s", name.c_str());
+        INFO("CurveScaledParameter: {:s}", name.c_str());
         return createCurveScaledParameter(name, config, curves);
     }
     if (type == "Function")
     {
-        INFO("FunctionParameter: %s", name.c_str());
+        INFO("FunctionParameter: {:s}", name.c_str());
         return createFunctionParameter(name, config, mesh);
     }
     if (type == "Group")
     {
-        INFO("GroupBasedParameter: %s", name.c_str());
+        INFO("GroupBasedParameter: {:s}", name.c_str());
         return createGroupBasedParameter(name, config, mesh);
     }
     if (type == "MeshElement")
     {
-        INFO("MeshElementParameter: %s", name.c_str());
+        INFO("MeshElementParameter: {:s}", name.c_str());
         return createMeshElementParameter(name, config, mesh);
     }
     if (type == "MeshNode")
     {
-        INFO("MeshNodeParameter: %s", name.c_str());
+        INFO("MeshNodeParameter: {:s}", name.c_str());
         return createMeshNodeParameter(name, config, mesh);
     }
     if (type == "TimeDependentHeterogeneousParameter")
     {
-        INFO("TimeDependentHeterogeneousParameter: %s", name.c_str());
+        INFO("TimeDependentHeterogeneousParameter: {:s}", name.c_str());
         return createTimeDependentHeterogeneousParameter(name, config);
     }
 
-    OGS_FATAL("Cannot construct a parameter of given type '%s'.", type.c_str());
+    OGS_FATAL("Cannot construct a parameter of given type '{:s}'.",
+              type.c_str());
 }
 
 boost::optional<std::string> isDefinedOnSameMesh(ParameterBase const& parameter,
diff --git a/ParameterLib/Parameter.h b/ParameterLib/Parameter.h
index bf2ca98f3e321e715879bf9175e9eea2b9dad294..6a835c7c5f233a03621f8c5186f26dad0286afc7 100644
--- a/ParameterLib/Parameter.h
+++ b/ParameterLib/Parameter.h
@@ -118,7 +118,7 @@ protected:
             };
         }
         OGS_FATAL(
-            "Coordinate transformation for a %d-component parameter is not "
+            "Coordinate transformation for a {:d}-component parameter is not "
             "implemented.",
             values.size());
     }
diff --git a/ParameterLib/TimeDependentHeterogeneousParameter.cpp b/ParameterLib/TimeDependentHeterogeneousParameter.cpp
index e3a643781189c38c4bf6dcb720c733a9116b2ac6..063004b449583709a4d95664b3db7762c0b63c69 100644
--- a/ParameterLib/TimeDependentHeterogeneousParameter.cpp
+++ b/ParameterLib/TimeDependentHeterogeneousParameter.cpp
@@ -78,7 +78,7 @@ std::vector<double> TimeDependentHeterogeneousParameter::operator()(
 void TimeDependentHeterogeneousParameter::initialize(
     std::vector<std::unique_ptr<ParameterBase>> const& parameters)
 {
-    DBUG("TimeDependentHeterogeneousParameter init %d time series entries.",
+    DBUG("TimeDependentHeterogeneousParameter init {:d} time series entries.",
          _time_parameter_name_mapping.size());
     for (auto const& time_parameter_map : _time_parameter_name_mapping)
     {
@@ -98,7 +98,7 @@ void TimeDependentHeterogeneousParameter::initialize(
     {
         OGS_FATAL(
             "All referenced parameters in time dependent heterogeneous "
-            "parameter '%s' have to have the same number of components.",
+            "parameter '{:s}' have to have the same number of components.",
             name.c_str());
     }
 }
@@ -128,7 +128,7 @@ std::unique_ptr<ParameterBase> createTimeDependentHeterogeneousParameter(
     if (time_series.empty())
     {
         OGS_FATAL(
-            "Time dependent heterogeneous parameter '%s' doesn't contain "
+            "Time dependent heterogeneous parameter '{:s}' doesn't contain "
             "necessary time series data.",
             name.c_str());
     }
@@ -141,7 +141,7 @@ std::unique_ptr<ParameterBase> createTimeDependentHeterogeneousParameter(
                    p1) { return p0.first < p1.first; }))
     {
         OGS_FATAL(
-            "The points in time in the time series '%s' aren't in ascending "
+            "The points in time in the time series '{:s}' aren't in ascending "
             "order.",
             name.c_str());
     }
diff --git a/ParameterLib/Utils.cpp b/ParameterLib/Utils.cpp
index ab90282693770e1bad3c29091ddc1562452b2fad..58525d1f53a9046a802d0613424f5602bb975ea9 100644
--- a/ParameterLib/Utils.cpp
+++ b/ParameterLib/Utils.cpp
@@ -28,7 +28,7 @@ ParameterBase* findParameterByName(
         return nullptr;
     }
 
-    DBUG("Found parameter `%s'.", (*it)->name.c_str());
+    DBUG("Found parameter `{:s}'.", (*it)->name.c_str());
     return it->get();
 }
 }  // namespace ParameterLib
diff --git a/ParameterLib/Utils.h b/ParameterLib/Utils.h
index a7f7dfa6e48ecbd556a5af82ef9baf1647e22e52..10eef070febfd0740b2a24f798aadf4e98fbcd64 100644
--- a/ParameterLib/Utils.h
+++ b/ParameterLib/Utils.h
@@ -57,7 +57,7 @@ Parameter<ParameterDataType>* findParameterOptional(
         dynamic_cast<Parameter<ParameterDataType>*>(parameter_ptr);
     if (!parameter)
     {
-        OGS_FATAL("The read parameter `%s' is of incompatible type.",
+        OGS_FATAL("The read parameter `{:s}' is of incompatible type.",
                   parameter_name.c_str());
     }
 
@@ -65,8 +65,9 @@ Parameter<ParameterDataType>* findParameterOptional(
         parameter->getNumberOfComponents() != num_components)
     {
         OGS_FATAL(
-            "The read parameter `%s' has the wrong number of components (%lu "
-            "instead of %u).",
+            "The read parameter `{:s}' has the wrong number of components "
+            "({:d} "
+            "instead of {:d}).",
             parameter_name.c_str(), parameter->getNumberOfComponents(),
             num_components);
     }
@@ -78,7 +79,7 @@ Parameter<ParameterDataType>* findParameterOptional(
         {
             OGS_FATAL(
                 "The found parameter is not suitable for the use on the "
-                "required mesh.\n%s",
+                "required mesh.\n{:s}",
                 error->c_str());
         }
     }
@@ -110,7 +111,7 @@ Parameter<ParameterDataType>& findParameter(
     if (!parameter)
     {
         OGS_FATAL(
-            "Could not find parameter `%s' in the provided parameters list.",
+            "Could not find parameter `{:s}' in the provided parameters list.",
             parameter_name.c_str());
     }
     return *parameter;
diff --git a/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp
index 780fb47089ed56390bcb791d7c7e924da222816d..6e958f8dab1fe6af64ee3faf3543462ab12972c9 100644
--- a/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp
@@ -12,7 +12,7 @@
 
 #include <algorithm>
 #include <vector>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MeshLib/MeshSearch/NodeSearch.h"  // for getUniqueNodes
 #include "MeshLib/Node.h"
@@ -47,16 +47,17 @@ ConstraintDirichletBoundaryCondition::ConstraintDirichletBoundaryCondition(
             dof_table_bulk.getNumberOfVariableComponents(variable_id))
     {
         OGS_FATAL(
-            "Variable id or component id too high. Actual values: (%d, "
-            "%d), maximum values: (%d, %d).",
+            "Variable id or component id too high. Actual values: ({:d}, "
+            "{:d}), maximum values: ({:d}, {:d}).",
             variable_id, component_id, dof_table_bulk.getNumberOfVariables(),
             dof_table_bulk.getNumberOfVariableComponents(variable_id));
     }
 
     std::vector<MeshLib::Node*> const& bc_nodes = _bc_mesh.getNodes();
     DBUG(
-        "Found %d nodes for constraint Dirichlet BCs for the variable %d and "
-        "component %d",
+        "Found {:d} nodes for constraint Dirichlet BCs for the variable {:d} "
+        "and "
+        "component {:d}",
         bc_nodes.size(), variable_id, component_id);
 
     MeshLib::MeshSubset bc_mesh_subset{_bc_mesh, bc_nodes};
@@ -219,7 +220,7 @@ void ConstraintDirichletBoundaryCondition::getEssentialBCValues(
     bc_values.ids.emplace_back(current_id);
     bc_values.values.emplace_back(sum / cnt);
 
-    DBUG("Found %d constraint dirichlet boundary condition values.",
+    DBUG("Found {:d} constraint dirichlet boundary condition values.",
          bc_values.ids.size());
 }
 
@@ -240,7 +241,7 @@ createConstraintDirichletBoundaryCondition(
         config.getConfigParameter<std::string>("constraint_type");
     if (constraint_type != "Flux")
     {
-        OGS_FATAL("The constraint type is '%s', but has to be 'Flux'.",
+        OGS_FATAL("The constraint type is '{:s}', but has to be 'Flux'.",
                   constraint_type.c_str());
     }
 
@@ -269,9 +270,10 @@ createConstraintDirichletBoundaryCondition(
         auto const& constraining_process_variable_name =
             process_variables[variable_id].get().getName();
         OGS_FATAL(
-            "<constraining_process_variable> in process variable name '%s' at "
+            "<constraining_process_variable> in process variable name '{:s}' "
+            "at "
             "geometry 'TODO' : The constraining process variable is set as "
-            "'%s', but this is not specified in the project file.",
+            "'{:s}', but this is not specified in the project file.",
             constraining_process_variable_name.c_str(),
             constraining_process_variable.c_str());
     }
@@ -287,7 +289,8 @@ createConstraintDirichletBoundaryCondition(
         constraint_direction_string != "lower")
     {
         OGS_FATAL(
-            "The constraint direction is '%s', but has to be either 'greater' "
+            "The constraint direction is '{:s}', but has to be either "
+            "'greater' "
             "or 'lower'.",
             constraint_direction_string.c_str());
     }
@@ -296,7 +299,7 @@ createConstraintDirichletBoundaryCondition(
 
     //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__ConstraintDirichletBoundaryCondition__parameter}
     auto const param_name = config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s", param_name.c_str());
+    DBUG("Using parameter {:s}", param_name.c_str());
 
     auto& param = ParameterLib::findParameter<double>(param_name, parameters, 1,
                                                       &bc_mesh);
diff --git a/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp
index e6454440924a152e72a22d338a7a138fff6c9bed..b3ca1e122564e07eda0c505c40ab581e3c75556a 100644
--- a/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp
@@ -43,7 +43,8 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition(
         bulk_mesh.isAxiallySymmetric())
     {
         OGS_FATAL(
-            "The boundary mesh %s axially symmetric but the bulk mesh %s. Both "
+            "The boundary mesh {:s} axially symmetric but the bulk mesh {:s}. "
+            "Both "
             "must have an equal axial symmetry property.",
             config.boundary_mesh.isAxiallySymmetric() ? "is" : "is not",
             bulk_mesh.isAxiallySymmetric() ? "is" : "is not");
@@ -130,7 +131,7 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition(
                 config.config, dof_table, bulk_mesh, variable_id,
                 *config.component_id);
     }
-    OGS_FATAL("Unknown boundary condition type: `%s'.", type.c_str());
+    OGS_FATAL("Unknown boundary condition type: `{:s}'.", type.c_str());
 }
 
 }  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
index 9c33483f180f1c8ad935f9c34b80ef5ba87a9bbf..361787d93f78d78b489c6c9945f9c5828c054fc9 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
@@ -11,8 +11,8 @@
 #include "DirichletBoundaryCondition.h"
 
 #include <algorithm>
-#include <logog/include/logog.hpp>
 #include <vector>
+#include "BaseLib/Logging.h"
 
 #include "DirichletBoundaryConditionAuxiliaryFunctions.h"
 
@@ -67,7 +67,7 @@ std::unique_ptr<DirichletBoundaryCondition> createDirichletBoundaryCondition(
 
     //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__Dirichlet__parameter}
     auto const param_name = config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s", param_name.c_str());
+    DBUG("Using parameter {:s}", param_name.c_str());
 
     auto& parameter = ParameterLib::findParameter<double>(
         param_name, parameters, 1, &bc_mesh);
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionAuxiliaryFunctions.cpp b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionAuxiliaryFunctions.cpp
index c3a55caed78f4d9966a79e11b26c1709639fa136..8bdcb355a516286d5ddbdd4cd7498cfb0bd985e2 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionAuxiliaryFunctions.cpp
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionAuxiliaryFunctions.cpp
@@ -33,8 +33,8 @@ void checkParametersOfDirichletBoundaryCondition(
             dof_table_bulk.getNumberOfVariableComponents(variable_id))
     {
         OGS_FATAL(
-            "Variable id or component id too high. Actual values: (%d, "
-            "%d), maximum values: (%d, %d).",
+            "Variable id or component id too high. Actual values: ({:d}, "
+            "{:d}), maximum values: ({:d}, {:d}).",
             variable_id, component_id, dof_table_bulk.getNumberOfVariables(),
             dof_table_bulk.getNumberOfVariableComponents(variable_id));
     }
@@ -44,14 +44,14 @@ void checkParametersOfDirichletBoundaryCondition(
     {
         OGS_FATAL(
             "The required bulk node ids map does not exist in the boundary "
-            "mesh '%s'.",
+            "mesh '{:s}'.",
             bc_mesh.getName().c_str());
     }
 
     DBUG(
-        "Found %d nodes for Dirichlet BCs for the variable %d and "
+        "Found {:d} nodes for Dirichlet BCs for the variable {:d} and "
         "component "
-        "%d",
+        "{:d}",
         bc_mesh.getNodes().size(), variable_id, component_id);
 }
 
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp
index d9323faa67c9d292a3479a6db90cabae2b96c8f5..fd2c99ea7ca2855ccf7de94ab0029c85aa460e3e 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryConditionWithinTimeInterval.cpp
@@ -108,7 +108,7 @@ createDirichletBoundaryConditionWithinTimeInterval(
 
     //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__DirichletWithinTimeInterval__parameter}
     auto const param_name = config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s", param_name.c_str());
+    DBUG("Using parameter {:s}", param_name.c_str());
 
     auto& param = ParameterLib::findParameter<double>(param_name, parameters, 1,
                                                       &bc_mesh);
diff --git a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
index c35cde29da709ebff1b4006f09af4392024d7696..25f7d7db31276e996453a1d8fb58b44f30f77d7d 100644
--- a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
+++ b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
@@ -37,8 +37,9 @@ GenericNaturalBoundaryCondition<BoundaryConditionData,
             dof_table_bulk.getNumberOfVariableComponents(variable_id))
     {
         OGS_FATAL(
-            "Variable id or component id too high. Actual values: (%d, %d), "
-            "maximum values: (%d, %d).",
+            "Variable id or component id too high. Actual values: ({:d}, "
+            "{:d}), "
+            "maximum values: ({:d}, {:d}).",
             variable_id, component_id, dof_table_bulk.getNumberOfVariables(),
             dof_table_bulk.getNumberOfVariableComponents(variable_id));
     }
@@ -48,13 +49,15 @@ GenericNaturalBoundaryCondition<BoundaryConditionData,
     {
         OGS_FATAL(
             "The required bulk node ids map does not exist in the boundary "
-            "mesh '%s'.",
+            "mesh '{:s}'.",
             _bc_mesh.getName().c_str());
     }
 
     std::vector<MeshLib::Node*> const& bc_nodes = _bc_mesh.getNodes();
-    DBUG("Found %d nodes for Natural BCs for the variable %d and component %d",
-         bc_nodes.size(), variable_id, component_id);
+    DBUG(
+        "Found {:d} nodes for Natural BCs for the variable {:d} and component "
+        "{:d}",
+        bc_nodes.size(), variable_id, component_id);
 
     MeshLib::MeshSubset bc_mesh_subset(_bc_mesh, bc_nodes);
 
diff --git a/ProcessLib/BoundaryCondition/HCNonAdvectiveFreeComponentFlowBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/HCNonAdvectiveFreeComponentFlowBoundaryCondition.cpp
index 178e5706c4464ab092e15998faeef9cc0d21b8e5..66b2f47e257ef3528c4843707641ae5d79d5e524 100644
--- a/ProcessLib/BoundaryCondition/HCNonAdvectiveFreeComponentFlowBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/HCNonAdvectiveFreeComponentFlowBoundaryCondition.cpp
@@ -33,8 +33,9 @@ createHCNonAdvectiveFreeComponentFlowBoundaryCondition(
     if (bc_mesh.getDimension() + 1 != global_dim)
     {
         OGS_FATAL(
-            "The dimension (%d) of the given boundary mesh '%s' is not by one "
-            "lower than the bulk dimension (%d).",
+            "The dimension ({:d}) of the given boundary mesh '{:s}' is not by "
+            "one "
+            "lower than the bulk dimension ({:d}).",
             bc_mesh.getDimension(), bc_mesh.getName().c_str(), global_dim);
     }
 
diff --git a/ProcessLib/BoundaryCondition/NeumannBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/NeumannBoundaryCondition.cpp
index 775b9deb96498b0df20247ee0f13b70644444efd..79d4a2679d0047a772dfac5d9d08928a465f2d46 100644
--- a/ProcessLib/BoundaryCondition/NeumannBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/NeumannBoundaryCondition.cpp
@@ -26,7 +26,7 @@ std::unique_ptr<NeumannBoundaryCondition> createNeumannBoundaryCondition(
 
     //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__Neumann__parameter}
     auto const param_name = config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s", param_name.c_str());
+    DBUG("Using parameter {:s}", param_name.c_str());
 
     auto const& param = ParameterLib::findParameter<double>(
         param_name, parameters, 1, &bc_mesh);
@@ -51,7 +51,7 @@ std::unique_ptr<NeumannBoundaryCondition> createNeumannBoundaryCondition(
         auto const area_parameter_name =
             //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__Neumann__area_parameter}
             config.getConfigParameter<std::string>("area_parameter");
-        DBUG("area parameter name '%s'", area_parameter_name.c_str());
+        DBUG("area parameter name '{:s}'", area_parameter_name.c_str());
         integral_measure = &ParameterLib::findParameter<double>(
             area_parameter_name, parameters, 1, &bc_mesh);
     }
@@ -59,8 +59,9 @@ std::unique_ptr<NeumannBoundaryCondition> createNeumannBoundaryCondition(
     if (bc_mesh.getDimension() >= global_dim)
     {
         OGS_FATAL(
-            "The dimension (%d) of the given boundary mesh '%s' is not lower "
-            "than the bulk dimension (%d).",
+            "The dimension ({:d}) of the given boundary mesh '{:s}' is not "
+            "lower "
+            "than the bulk dimension ({:d}).",
             bc_mesh.getDimension(), bc_mesh.getName().c_str(), global_dim);
     }
 
diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
index 3c54a6eca5ad4f4b9fe69a16e58735306efd410a..23bac056da2ba4e68952f82d3100e081b552e438 100644
--- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
+++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
@@ -43,8 +43,8 @@ NormalTractionBoundaryCondition<LocalAssemblerImplementation>::
 
     // BC mesh subset creation
     std::vector<MeshLib::Node*> const bc_nodes = _bc_mesh.getNodes();
-    DBUG("Found %d nodes for Natural BCs for the variable %d", bc_nodes.size(),
-         variable_id);
+    DBUG("Found {:d} nodes for Natural BCs for the variable {:d}",
+         bc_nodes.size(), variable_id);
 
     MeshLib::MeshSubset bc_mesh_subset(_bc_mesh, bc_nodes);
 
@@ -87,7 +87,7 @@ createNormalTractionBoundaryCondition(
     auto const parameter_name =
         //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__NormalTraction__parameter}
         config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s", parameter_name.c_str());
+    DBUG("Using parameter {:s}", parameter_name.c_str());
 
     auto const& pressure = ParameterLib::findParameter<double>(
         parameter_name, parameters, 1, &bc_mesh);
diff --git a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp
index aca477f0f1d4eb80442bc0548992035c26990118..55ee54835ac13255ef548aefe97e6fd15621b488 100644
--- a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp
@@ -11,8 +11,8 @@
 #include "PhaseFieldIrreversibleDamageOracleBoundaryCondition.h"
 
 #include <algorithm>
-#include <logog/include/logog.hpp>
 #include <vector>
+#include "BaseLib/Logging.h"
 
 namespace ProcessLib
 {
diff --git a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h
index 149c7146aa956139f446a2ea6ad54502fcc7778b..9c3bec9254afe3bc5f7184b66bca3a565b46e701 100644
--- a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h
@@ -35,9 +35,9 @@ public:
                 dof_table.getNumberOfVariableComponents(variable_id))
         {
             OGS_FATAL(
-                "Variable id or component id too high. Actual values: (%d, "
-                "%d), "
-                "maximum values: (%d, %d).",
+                "Variable id or component id too high. Actual values: ({:d}, "
+                "{:d}), "
+                "maximum values: ({:d}, {:d}).",
                 variable_id, component_id, dof_table.getNumberOfVariables(),
                 dof_table.getNumberOfVariableComponents(variable_id));
         }
diff --git a/ProcessLib/BoundaryCondition/Python/BHEInflowPythonBoundaryCondition.h b/ProcessLib/BoundaryCondition/Python/BHEInflowPythonBoundaryCondition.h
index 02f80f2fc4edf8788e673db953d9468fb5f4ab3d..57ed204bf26160b0873e4ea4000b0812b1f946e5 100644
--- a/ProcessLib/BoundaryCondition/Python/BHEInflowPythonBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/Python/BHEInflowPythonBoundaryCondition.h
@@ -14,7 +14,6 @@
 #endif  // OGS_USE_PYTHON
 #include <algorithm>
 #include <iostream>
-#include <logog/include/logog.hpp>
 #include <vector>
 
 #include "BHEInflowPythonBoundaryConditionPythonSideInterface.h"
diff --git a/ProcessLib/BoundaryCondition/Python/CMakeLists.txt b/ProcessLib/BoundaryCondition/Python/CMakeLists.txt
index caa5e62b1ea353a0499918e500d4af800ac0ed06..a1a184d68e52885dca2296a6d2a9c049a3ea844a 100644
--- a/ProcessLib/BoundaryCondition/Python/CMakeLists.txt
+++ b/ProcessLib/BoundaryCondition/Python/CMakeLists.txt
@@ -9,14 +9,10 @@ ogs_add_library(ProcessLibBoundaryConditionPython
 target_compile_definitions(ProcessLibBoundaryConditionPython PUBLIC
                            OGS_USE_PYTHON)
 
-target_link_libraries(ProcessLibBoundaryConditionPython
-                      PUBLIC BaseLib
-                             MathLib
-                             MeshLib
-                             NumLib
-                             logog
-                             ${Python3_LIBRARIES}
-                      PRIVATE pybind11::pybind11)
+target_link_libraries(
+    ProcessLibBoundaryConditionPython
+    PUBLIC BaseLib MathLib MeshLib NumLib ${Python3_LIBRARIES}
+    PRIVATE pybind11::pybind11 spdlog::spdlog)
 
 # For the embedded Python module
 ogs_add_library(ProcessLibBoundaryConditionPythonModule
diff --git a/ProcessLib/BoundaryCondition/Python/PythonBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/Python/PythonBoundaryCondition.cpp
index 0217b0b67602e9eb81de15c16f8fa6631f76a6c8..5af5c82004b7294b0833ddaf95eb7c74adf0896e 100644
--- a/ProcessLib/BoundaryCondition/Python/PythonBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/Python/PythonBoundaryCondition.cpp
@@ -33,7 +33,7 @@ public:
             return;
         }
 
-        LOGOG_COUT << std::flush;
+        std::cout << std::flush;
     }
 
     //! Optionally flushes Python's stdout after running Python code.
@@ -125,7 +125,8 @@ void PythonBoundaryCondition::getEssentialBCValues(
                 {
                     // TODO extend Python BC to mixed FEM ansatz functions
                     OGS_FATAL(
-                        "No d.o.f. found for (node=%d, var=%d, comp=%d).  "
+                        "No d.o.f. found for (node={:d}, var={:d}, comp={:d}). "
+                        " "
                         "That might be due to the use of mixed FEM ansatz "
                         "functions, which is currently not supported by "
                         "the implementation of Python BCs. That excludes, "
@@ -220,7 +221,8 @@ std::unique_ptr<PythonBoundaryCondition> createPythonBoundaryCondition(
     if (!scope.contains(bc_object))
     {
         OGS_FATAL(
-            "Function `%s' is not defined in the python script file, or there "
+            "Function `{:s}' is not defined in the python script file, or "
+            "there "
             "was no python script file specified.",
             bc_object.c_str());
     }
@@ -232,8 +234,9 @@ std::unique_ptr<PythonBoundaryCondition> createPythonBoundaryCondition(
         component_id >= dof_table.getNumberOfVariableComponents(variable_id))
     {
         OGS_FATAL(
-            "Variable id or component id too high. Actual values: (%d, %d), "
-            "maximum values: (%d, %d).",
+            "Variable id or component id too high. Actual values: ({:d}, "
+            "{:d}), "
+            "maximum values: ({:d}, {:d}).",
             variable_id, component_id, dof_table.getNumberOfVariables(),
             dof_table.getNumberOfVariableComponents(variable_id));
     }
diff --git a/ProcessLib/BoundaryCondition/Python/PythonBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/Python/PythonBoundaryConditionLocalAssembler.h
index d6a6cd2ea575e7fa1abfc0de57ee29c5cadefb45..c567a55de2c4a8d97f2023b3e5ad615a46a3bdbf 100644
--- a/ProcessLib/BoundaryCondition/Python/PythonBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/Python/PythonBoundaryConditionLocalAssembler.h
@@ -97,7 +97,8 @@ public:
                     {
                         // TODO extend Python BC to mixed FEM ansatz functions
                         OGS_FATAL(
-                            "No d.o.f. found for (node=%d, var=%d, comp=%d).  "
+                            "No d.o.f. found for (node={:d}, var={:d}, "
+                            "comp={:d}).  "
                             "That might be due to the use of mixed FEM ansatz "
                             "functions, which is currently not supported by "
                             "the implementation of Python BCs. That excludes, "
@@ -151,8 +152,8 @@ public:
                 // for cases without Jacobian assembly.
                 OGS_FATAL(
                     "The Python BC must return the derivative of the flux "
-                    "w.r.t. each primary variable. %d components expected. %d "
-                    "components returned from Python.",
+                    "w.r.t. each primary variable. {:d} components expected. "
+                    "{:d} components returned from Python.",
                     num_comp_total, dFlux.size());
             }
 
diff --git a/ProcessLib/BoundaryCondition/RobinBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/RobinBoundaryCondition.cpp
index 0866bdf0bf27536275f31d34154dc76ef2f97556..64f3ebeafeca2363880c84a37c5e2f1a93c25326 100644
--- a/ProcessLib/BoundaryCondition/RobinBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/RobinBoundaryCondition.cpp
@@ -28,8 +28,9 @@ std::unique_ptr<RobinBoundaryCondition> createRobinBoundaryCondition(
     if (bc_mesh.getDimension() >= global_dim)
     {
         OGS_FATAL(
-            "The dimension (%d) of the given boundary mesh '%s' is not lower "
-            "than the bulk dimension (%d).",
+            "The dimension ({:d}) of the given boundary mesh '{:s}' is not "
+            "lower "
+            "than the bulk dimension ({:d}).",
             bc_mesh.getDimension(), bc_mesh.getName().c_str(), global_dim);
     }
 
@@ -49,7 +50,7 @@ std::unique_ptr<RobinBoundaryCondition> createRobinBoundaryCondition(
         auto const area_parameter_name =
             //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__Robin__area_parameter}
             config.getConfigParameter<std::string>("area_parameter");
-        DBUG("area parameter name '%s'", area_parameter_name.c_str());
+        DBUG("area parameter name '{:s}'", area_parameter_name.c_str());
         integral_measure = &ParameterLib::findParameter<double>(
             area_parameter_name, parameters, 1, &bc_mesh);
     }
diff --git a/ProcessLib/BoundaryCondition/VariableDependentNeumannBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/VariableDependentNeumannBoundaryCondition.cpp
index 03d88b26e06559a05a05e58257aa608c04693149..b4e3bd3243044fe2542e56ba37cf2682246f284b 100644
--- a/ProcessLib/BoundaryCondition/VariableDependentNeumannBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/VariableDependentNeumannBoundaryCondition.cpp
@@ -36,8 +36,9 @@ createVariableDependentNeumannBoundaryCondition(
     if (bc_mesh.getDimension() + 1 != global_dim)
     {
         OGS_FATAL(
-            "The dimension (%d) of the given boundary mesh '%s' is not by one "
-            "lower than the bulk dimension (%d).",
+            "The dimension ({:d}) of the given boundary mesh '{:s}' is not by "
+            "one "
+            "lower than the bulk dimension ({:d}).",
             bc_mesh.getDimension(), bc_mesh.getName().c_str(), global_dim);
     }
 
diff --git a/ProcessLib/CMakeLists.txt b/ProcessLib/CMakeLists.txt
index 71ae82110b66b7333bc9302a48c19efd8e9bf116..d2152d627f4358be03bfd3119e4385067476d937 100644
--- a/ProcessLib/CMakeLists.txt
+++ b/ProcessLib/CMakeLists.txt
@@ -19,15 +19,10 @@ append_source_files(SOURCES Utils)
 
 ogs_add_library(ProcessLib ${SOURCES})
 
-target_link_libraries(ProcessLib
-                      PUBLIC BaseLib
-                             MaterialLib
-                             MathLib
-                             MeshGeoToolsLib
-                             MeshLib
-                             NumLib
-                             logog
-                      PRIVATE ParameterLib GitInfoLib)
+target_link_libraries(
+    ProcessLib
+    PUBLIC BaseLib MaterialLib MathLib MeshGeoToolsLib MeshLib NumLib
+    PRIVATE ParameterLib GitInfoLib spdlog::spdlog)
 
 if (OGS_BUILD_PROCESS_ComponentTransport
     OR OGS_BUILD_PROCESS_RichardsComponentTransport)
diff --git a/ProcessLib/CentralDifferencesJacobianAssembler.cpp b/ProcessLib/CentralDifferencesJacobianAssembler.cpp
index d2813c66365ae16418292bf166b9817c9e89804f..2515e051713332e466f47a9ed453c2f01eda00d3 100644
--- a/ProcessLib/CentralDifferencesJacobianAssembler.cpp
+++ b/ProcessLib/CentralDifferencesJacobianAssembler.cpp
@@ -36,8 +36,8 @@ void CentralDifferencesJacobianAssembler::assembleWithJacobian(
     // TODO do not check in every call.
     if (local_x_data.size() % _absolute_epsilons.size() != 0) {
         OGS_FATAL(
-            "The number of specified epsilons (%u) and the number of local "
-            "d.o.f.s (%u) do not match, i.e., the latter is not divisable by "
+            "The number of specified epsilons ({:d}) and the number of local "
+            "d.o.f.s ({:d}) do not match, i.e., the latter is not divisable by "
             "the former.",
             _absolute_epsilons.size(), local_x_data.size());
     }
diff --git a/ProcessLib/CompareJacobiansJacobianAssembler.cpp b/ProcessLib/CompareJacobiansJacobianAssembler.cpp
index 339bd01b9a044dfc046ca6e161f21aed669856a8..e0b8aa1094ebc8370f6d501ba5682a48fb32a5c9 100644
--- a/ProcessLib/CompareJacobiansJacobianAssembler.cpp
+++ b/ProcessLib/CompareJacobiansJacobianAssembler.cpp
@@ -277,7 +277,7 @@ void CompareJacobiansJacobianAssembler::assembleWithJacobian(
 
     if (tol_exceeded)
     {
-        WARN("Compare Jacobians: %s", msg_tolerance.str().c_str());
+        WARN("Compare Jacobians: {:s}", msg_tolerance.str().c_str());
     }
 
     bool const output = tol_exceeded || fatal_error;
@@ -384,7 +384,7 @@ void CompareJacobiansJacobianAssembler::assembleWithJacobian(
     if (fatal_error)
     {
         _log_file << std::flush;
-        OGS_FATAL("%s", msg_fatal.c_str());
+        OGS_FATAL("{:s}", msg_fatal.c_str());
     }
 
     if (tol_exceeded && _fail_on_error)
diff --git a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
index efda052904f141f4ad0944bc2359f01e787eda7a..a14f77355f464b4fe922629cc321d42ab0d4d948 100644
--- a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
+++ b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
@@ -61,7 +61,7 @@ void checkMPLProperties(
             if (!liquid_phase.hasComponent(component_id))
             {
                 OGS_FATAL(
-                    "The component %u in the AqueousLiquid phase isn't "
+                    "The component {:d} in the AqueousLiquid phase isn't "
                     "specified.",
                     component_id);
             }
@@ -121,8 +121,9 @@ std::unique_ptr<Process> createComponentTransportProcess(
     if (it != collected_process_variables.end())
     {
         OGS_FATAL(
-            "Number of components for process variable '%s' should be 1 rather "
-            "than %d.",
+            "Number of components for process variable '{:s}' should be 1 "
+            "rather "
+            "than {:d}.",
             it->get().getName().c_str(),
             it->get().getNumberOfComponents());
     }
@@ -165,8 +166,8 @@ std::unique_ptr<Process> createComponentTransportProcess(
     if (b.size() < mesh.getDimension())
     {
         OGS_FATAL(
-            "specific body force (gravity vector) has %d components, mesh "
-            "dimension is %d",
+            "specific body force (gravity vector) has {:d} components, mesh "
+            "dimension is {:d}",
             b.size(), mesh.getDimension());
     }
     bool const has_gravity = MathLib::toVector(b).norm() > 0;
diff --git a/ProcessLib/CreateJacobianAssembler.cpp b/ProcessLib/CreateJacobianAssembler.cpp
index 9a1e848d1a2529193b76c74a29abb0714c2e8f8f..3b0d5fac9aee8f7e3a53e20e3fe4adeb9126700d 100644
--- a/ProcessLib/CreateJacobianAssembler.cpp
+++ b/ProcessLib/CreateJacobianAssembler.cpp
@@ -41,6 +41,6 @@ std::unique_ptr<AbstractJacobianAssembler> createJacobianAssembler(
         return createCompareJacobiansJacobianAssembler(*config);
     }
 
-    OGS_FATAL("Unknown Jacobian assembler type: `%s'.", type.c_str());
+    OGS_FATAL("Unknown Jacobian assembler type: `{:s}'.", type.c_str());
 }
 }  // namespace ProcessLib
diff --git a/ProcessLib/DeactivatedSubdomain.cpp b/ProcessLib/DeactivatedSubdomain.cpp
index 1156217c67d668c2de15e814a9262d97cef06503..942753e6b822a473dff3793c821b3d4fde59096b 100644
--- a/ProcessLib/DeactivatedSubdomain.cpp
+++ b/ProcessLib/DeactivatedSubdomain.cpp
@@ -12,8 +12,6 @@
  */
 #include "DeactivatedSubdomain.h"
 
-#include <logog/include/logog.hpp>
-
 #include "BaseLib/ConfigTree.h"
 #include "BaseLib/Error.h"
 #include "MeshLib/Elements/Element.h"
diff --git a/ProcessLib/Deformation/SolidMaterialInternalToSecondaryVariables.h b/ProcessLib/Deformation/SolidMaterialInternalToSecondaryVariables.h
index 21a0f9171712323dc3aebaf645a3142fdd09fefb..164e6d8c2f9cffc250de2f47775a986fb8f9a183 100644
--- a/ProcessLib/Deformation/SolidMaterialInternalToSecondaryVariables.h
+++ b/ProcessLib/Deformation/SolidMaterialInternalToSecondaryVariables.h
@@ -42,7 +42,7 @@ void solidMaterialInternalToSecondaryVariables(
         auto const& name = internal_variable.name;
         auto const& fct = internal_variable.getter;
         auto const num_components = internal_variable.num_components;
-        DBUG("Registering internal variable %s.", name.c_str());
+        DBUG("Registering internal variable {:s}.", name.c_str());
 
         auto getIntPtValues =
             [fct, num_components](
diff --git a/ProcessLib/HT/CreateHTProcess.cpp b/ProcessLib/HT/CreateHTProcess.cpp
index e6d39866d8b9c79ef01e8407a5a28ed458b4a19d..67a781f659c2a81cd745d14669d1611dd90d16e4 100644
--- a/ProcessLib/HT/CreateHTProcess.cpp
+++ b/ProcessLib/HT/CreateHTProcess.cpp
@@ -114,8 +114,8 @@ std::unique_ptr<Process> createHTProcess(
     if (b.size() < mesh.getDimension())
     {
         OGS_FATAL(
-            "specific body force (gravity vector) has %d components, mesh "
-            "dimension is %d",
+            "specific body force (gravity vector) has {:d} components, mesh "
+            "dimension is {:d}",
             b.size(), mesh.getDimension());
     }
     bool const has_gravity = MathLib::toVector(b).norm() > 0;
@@ -142,12 +142,12 @@ std::unique_ptr<Process> createHTProcess(
         solid_thermal_expansion = &ParameterLib::findParameter<double>(
             //! \ogs_file_param_special{prj__processes__process__HT__solid_thermal_expansion__thermal_expansion}
             *solid_config, "thermal_expansion", parameters, 1, &mesh);
-        DBUG("Use '%s' as solid thermal expansion.",
+        DBUG("Use '{:s}' as solid thermal expansion.",
              solid_thermal_expansion->name.c_str());
         biot_constant = &ParameterLib::findParameter<double>(
             //! \ogs_file_param_special{prj__processes__process__HT__solid_thermal_expansion__biot_constant}
             *solid_config, "biot_constant", parameters, 1, &mesh);
-        DBUG("Use '%s' as Biot's constant.", biot_constant->name.c_str());
+        DBUG("Use '{:s}' as Biot's constant.", biot_constant->name.c_str());
     }
 
     std::unique_ptr<ProcessLib::SurfaceFluxData> surfaceflux;
diff --git a/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp b/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
index afdc46f252cf903b09a5d272a7b8ced3189e62da..8061591280d055b6f6f8d8e2cd021fcddeb178c4 100644
--- a/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
+++ b/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
@@ -53,7 +53,7 @@ std::unique_ptr<Process> createHeatConductionProcess(
         //! \ogs_file_param_special{prj__processes__process__HEAT_CONDUCTION__thermal_conductivity}
         "thermal_conductivity", parameters, 1, &mesh);
 
-    DBUG("Use '%s' as thermal conductivity parameter.",
+    DBUG("Use '{:s}' as thermal conductivity parameter.",
          thermal_conductivity.name.c_str());
 
     // heat capacity parameter.
@@ -62,7 +62,7 @@ std::unique_ptr<Process> createHeatConductionProcess(
         //! \ogs_file_param_special{prj__processes__process__HEAT_CONDUCTION__heat_capacity}
         "heat_capacity", parameters, 1, &mesh);
 
-    DBUG("Use '%s' as heat capacity parameter.", heat_capacity.name.c_str());
+    DBUG("Use '{:s}' as heat capacity parameter.", heat_capacity.name.c_str());
 
     // density parameter.
     auto& density = ParameterLib::findParameter<double>(
@@ -70,7 +70,7 @@ std::unique_ptr<Process> createHeatConductionProcess(
         //! \ogs_file_param_special{prj__processes__process__HEAT_CONDUCTION__density}
         "density", parameters, 1, &mesh);
 
-    DBUG("Use '%s' as density parameter.", density.name.c_str());
+    DBUG("Use '{:s}' as density parameter.", density.name.c_str());
 
     HeatConductionProcessData process_data{thermal_conductivity, heat_capacity,
                                            density};
diff --git a/ProcessLib/HeatTransportBHE/BHE/BHE_1U.cpp b/ProcessLib/HeatTransportBHE/BHE/BHE_1U.cpp
index 38e0f829ccceab9784f56c548db6bae193b5d559..ea0105d68c8ab240b05b8608c67d517e22b95e73 100644
--- a/ProcessLib/HeatTransportBHE/BHE/BHE_1U.cpp
+++ b/ProcessLib/HeatTransportBHE/BHE/BHE_1U.cpp
@@ -145,7 +145,7 @@ std::pair<double, double> thermalResistancesGroutSoil(double chi,
         }
         DBUG(
             "Warning! Correction procedure was applied due to negative thermal "
-            "resistance! Chi = %f.\n",
+            "resistance! Chi = {:f}.\n",
             m_chi);
 
         R_gs = compute_R_gs(m_chi, R_g);
diff --git a/ProcessLib/HeatTransportBHE/BHE/BHE_2U.cpp b/ProcessLib/HeatTransportBHE/BHE/BHE_2U.cpp
index 75a862340f543929679328c7f9a0d1135d0303ae..3cdcb2bfaeba4bb93d22f25d9c8002dc5d828369 100644
--- a/ProcessLib/HeatTransportBHE/BHE/BHE_2U.cpp
+++ b/ProcessLib/HeatTransportBHE/BHE/BHE_2U.cpp
@@ -165,7 +165,7 @@ std::vector<double> thermalResistancesGroutSoil2U(double chi,
         }
         DBUG(
             "Warning! Correction procedure was applied due to negative thermal "
-            "resistance! Chi = %f.\n",
+            "resistance! Chi = {:f}.\n",
             m_chi);
         R_gs = compute_R_gs_2U(m_chi, R_g);
         R_gg_1 = compute_R_gg_2U(m_chi, R_gs, R_ar_1, R_g);
diff --git a/ProcessLib/HeatTransportBHE/BHE/CreateBHECoaxial.cpp b/ProcessLib/HeatTransportBHE/BHE/CreateBHECoaxial.cpp
index be1986e31e3bcb07ab96469ec9aa4a64f602d863..49b0afeec7d9dfdacd06f05e865aebe645759d65 100644
--- a/ProcessLib/HeatTransportBHE/BHE/CreateBHECoaxial.cpp
+++ b/ProcessLib/HeatTransportBHE/BHE/CreateBHECoaxial.cpp
@@ -36,7 +36,7 @@ parseBHECoaxialConfig(
     auto const bhe_if_use_python_bc_conf =
         //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__use_bhe_pipe_network}
         config.getConfigParameter<bool>("use_bhe_pipe_network", false);
-    DBUG("If using python boundary condition : %s",
+    DBUG("If using python boundary condition : {:s}",
          (bhe_if_use_python_bc_conf) ? "true" : "false");
 
     auto const borehole_geometry =
diff --git a/ProcessLib/HeatTransportBHE/BHE/CreateBHEUType.cpp b/ProcessLib/HeatTransportBHE/BHE/CreateBHEUType.cpp
index 37766ce994dc721a873d2017ce1496d5a4a3957e..5ae29e1670d37c4c3a5de4656d80315fca465740 100644
--- a/ProcessLib/HeatTransportBHE/BHE/CreateBHEUType.cpp
+++ b/ProcessLib/HeatTransportBHE/BHE/CreateBHEUType.cpp
@@ -37,7 +37,7 @@ parseBHEUTypeConfig(
     auto const bhe_if_use_python_bc_conf =
         //! \ogs_file_param{prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__use_bhe_pipe_network}
         config.getConfigParameter<bool>("use_bhe_pipe_network", false);
-    DBUG("If using python boundary condition : %s",
+    DBUG("If using python boundary condition : {:s}",
          (bhe_if_use_python_bc_conf) ? "true" : "false");
 
     auto const borehole_geometry =
diff --git a/ProcessLib/HeatTransportBHE/BHE/CreateFlowAndTemperatureControl.cpp b/ProcessLib/HeatTransportBHE/BHE/CreateFlowAndTemperatureControl.cpp
index abd3a1717588a8dbcaf59f029161642a73b670de..5f5c8de933d9086277e1e1f0c5327e511de3ffd8 100644
--- a/ProcessLib/HeatTransportBHE/BHE/CreateFlowAndTemperatureControl.cpp
+++ b/ProcessLib/HeatTransportBHE/BHE/CreateFlowAndTemperatureControl.cpp
@@ -112,7 +112,7 @@ FlowAndTemperatureControl createFlowAndTemperatureControl(
             building_power_curves, flow_rate,
             refrigerant.specific_heat_capacity, refrigerant.density};
     }
-    OGS_FATAL("FlowAndTemperatureControl type '%s' is not implemented.",
+    OGS_FATAL("FlowAndTemperatureControl type '{:s}' is not implemented.",
               type.c_str());
 }
 }  // namespace BHE
diff --git a/ProcessLib/HeatTransportBHE/BHE/MeshUtils.cpp b/ProcessLib/HeatTransportBHE/BHE/MeshUtils.cpp
index 9164b68a7d7aaa168f084a3287967a45bf0f699e..c24ea808fc7cb5e10d810f05a8c81b052724eec9 100644
--- a/ProcessLib/HeatTransportBHE/BHE/MeshUtils.cpp
+++ b/ProcessLib/HeatTransportBHE/BHE/MeshUtils.cpp
@@ -9,6 +9,8 @@
 
 #include "MeshUtils.h"
 
+#include <set>
+
 #include "BaseLib/Algorithm.h"
 #include "MeshLib/Elements/Element.h"
 #include "MeshLib/Mesh.h"
@@ -54,7 +56,7 @@ BHEMeshData getBHEDataInMesh(MeshLib::Mesh const& mesh)
 
     // finally counting two types of elements
     // They are (i) soil, and (ii) BHE type of elements
-    DBUG("-> found total %d soil elements and %d BHE elements",
+    DBUG("-> found total {:d} soil elements and {:d} BHE elements",
          mesh.getNumberOfElements() - all_bhe_elements.size(),
          all_bhe_elements.size());
 
@@ -68,7 +70,7 @@ BHEMeshData getBHEDataInMesh(MeshLib::Mesh const& mesh)
 
     auto const& bhe_material_ids =
         getUniqueMaterialIds(material_ids, all_bhe_elements);
-    DBUG("-> found %d BHE material groups", bhe_material_ids.size());
+    DBUG("-> found {:d} BHE material groups", bhe_material_ids.size());
 
     // create a vector of BHE elements for each group
     std::vector<std::vector<MeshLib::Element*>> bhe_elements;
@@ -81,7 +83,8 @@ BHEMeshData getBHEDataInMesh(MeshLib::Mesh const& mesh)
                 back_inserter(vec_elements), [&](MeshLib::Element* e) {
                     return material_ids[e->getID()] == bhe_mat_id;
                 });
-        DBUG("-> found %d elements on the BHE_%d", vec_elements.size(), bhe_id);
+        DBUG("-> found {:d} elements on the BHE_{:d}", vec_elements.size(),
+             bhe_id);
     }
 
     // get a vector of BHE nodes
@@ -101,7 +104,7 @@ BHEMeshData getBHEDataInMesh(MeshLib::Mesh const& mesh)
             vec_nodes, [](MeshLib::Node* node1, MeshLib::Node* node2) {
                 return node1->getID() < node2->getID();
             });
-        DBUG("-> found %d nodes on the BHE_%d", vec_nodes.size(), bhe_id);
+        DBUG("-> found {:d} nodes on the BHE_{:d}", vec_nodes.size(), bhe_id);
     }
 
     return {bhe_material_ids, bhe_elements, bhe_nodes};
diff --git a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp
index 64279e35d6e52432f2ed47d6039a37b52b947f87..7d54a4c1ca0ce096643feeebb8d4ffa3feb72472 100644
--- a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp
+++ b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp
@@ -67,7 +67,7 @@ std::unique_ptr<Process> createHeatTransportBHEProcess(
             pv_name.find("temperature_BHE") == std::string::npos)
         {
             OGS_FATAL(
-                "Found a process variable name '%s'. It should be "
+                "Found a process variable name '{:s}'. It should be "
                 "'temperature_soil' or 'temperature_BHE_X'");
         }
         auto variable = std::find_if(variables.cbegin(), variables.cend(),
@@ -78,12 +78,12 @@ std::unique_ptr<Process> createHeatTransportBHEProcess(
         if (variable == variables.end())
         {
             OGS_FATAL(
-                "Could not find process variable '%s' in the provided "
+                "Could not find process variable '{:s}' in the provided "
                 "variables "
-                "list for config tag <%s>.",
+                "list for config tag <{:s}>.",
                 pv_name.c_str(), "process_variable");
         }
-        DBUG("Found process variable '%s' for config tag <%s>.",
+        DBUG("Found process variable '{:s}' for config tag <{:s}>.",
              variable->getName().c_str(), "process_variable");
 
         per_process_variables.emplace_back(
@@ -144,7 +144,7 @@ std::unique_ptr<Process> createHeatTransportBHEProcess(
                 BHE::createBHE1PType<BHE::BHE_1P>(bhe_config, curves));
             continue;
         }
-        OGS_FATAL("Unknown BHE type '%s'.", bhe_type.c_str());
+        OGS_FATAL("Unknown BHE type '{:s}'.", bhe_type.c_str());
     }
     // end of reading BHE parameters -------------------------------------------
 
diff --git a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp
index 2762473f388b62c32c25b33150098c88292c2213..f7aaaa564c06e2b95d02887d178982623a507eef 100644
--- a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp
+++ b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcess.cpp
@@ -44,8 +44,8 @@ HeatTransportBHEProcess::HeatTransportBHEProcess(
         _process_data._vec_BHE_property.size())
     {
         OGS_FATAL(
-            "The number of the given BHE properties (%d) are not consistent "
-            "with the number of BHE groups in the mesh (%d).",
+            "The number of the given BHE properties ({:d}) are not consistent "
+            "with the number of BHE groups in the mesh ({:d}).",
             _process_data._vec_BHE_property.size(),
             _bheMeshData.BHE_mat_IDs.size());
     }
diff --git a/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h b/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h
index f688635254dbacced807a44d7c16284e1abf862c..f5360d5986b1a34f6868b374a2625de7243d4358 100644
--- a/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h
+++ b/ProcessLib/HeatTransportBHE/LocalAssemblers/CreateLocalAssemblers.h
@@ -11,7 +11,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "LocalDataInitializer.h"
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
diff --git a/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h b/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h
index f3d8ca38e3a010877e206c9ef81f1005e23f71e8..09413077b67a03778c53ba02d2269c8337bf3862 100644
--- a/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h
+++ b/ProcessLib/HeatTransportBHE/LocalAssemblers/LocalDataInitializer.h
@@ -199,7 +199,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration or this process requires higher order elements.",
                 type_idx.name());
diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
index b4c8cf25cf569781e375ece9b87794896f83d63b..a2dc0d40cedd1c0f5d2cd70668525bfc3efed885 100644
--- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
@@ -84,26 +84,26 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         variable_u = &process_variables[1][0].get();
     }
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          variable_u->getName().c_str());
 
     if (variable_u->getNumberOfComponents() != DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             variable_u->getName().c_str(),
             variable_u->getNumberOfComponents(),
             DisplacementDim);
     }
 
-    DBUG("Associate pressure with process variable '%s'.",
+    DBUG("Associate pressure with process variable '{:s}'.",
          variable_p->getName().c_str());
     if (variable_p->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "Pressure process variable '%s' is not a scalar variable but has "
-            "%d components.",
+            "Pressure process variable '{:s}' is not a scalar variable but has "
+            "{:d} components.",
             variable_p->getName().c_str(),
             variable_p->getNumberOfComponents());
     }
@@ -123,8 +123,8 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), DisplacementDim);
         }
 
diff --git a/ProcessLib/HydroMechanics/CreateLocalAssemblers.h b/ProcessLib/HydroMechanics/CreateLocalAssemblers.h
index 411ae779688e7fd5cb0ba8cb2029bf37dc83f471..a941597e4530a59c3ddab2b44dbe56bd469112de 100644
--- a/ProcessLib/HydroMechanics/CreateLocalAssemblers.h
+++ b/ProcessLib/HydroMechanics/CreateLocalAssemblers.h
@@ -11,7 +11,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
 
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
index 8df477be704e45dad661f054b071a18ca31fba68..b3950f66a7554cf5d0c9c84e8e0b35a553703732 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
@@ -722,7 +722,7 @@ std::size_t HydroMechanicsLocalAssembler<
     {
         OGS_FATAL(
             "Setting integration point initial conditions; The integration "
-            "order of the local assembler for element %d is different from "
+            "order of the local assembler for element {:d} is different from "
             "the integration order in the initial condition.",
             _element.getID());
     }
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
index 19fecd56e602327ac32c26f9e0582284b9ab109c..31d6c019f19753e360663f37aa3f909652a07b8f 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
@@ -325,8 +325,8 @@ void HydroMechanicsProcess<DisplacementDim>::initializeConcreteProcess(
         if (ip_meta_data.n_components != mesh_property.getNumberOfComponents())
         {
             OGS_FATAL(
-                "Different number of components in meta data (%d) than in "
-                "the integration point field data for '%s': %d.",
+                "Different number of components in meta data ({:d}) than in "
+                "the integration point field data for '{:s}': {:d}.",
                 ip_meta_data.n_components, name.c_str(),
                 mesh_property.getNumberOfComponents());
         }
diff --git a/ProcessLib/HydroMechanics/LocalDataInitializer.h b/ProcessLib/HydroMechanics/LocalDataInitializer.h
index 9810c1533e6397b03338cb4a6afe675837bb9eaa..08695710585ca2f700721583b19f65a011ce4150 100644
--- a/ProcessLib/HydroMechanics/LocalDataInitializer.h
+++ b/ProcessLib/HydroMechanics/LocalDataInitializer.h
@@ -133,7 +133,7 @@ public:
         if (shapefunction_order != 2)
         {
             OGS_FATAL(
-                "The given shape function order %d is not supported.\nOnly "
+                "The given shape function order {:d} is not supported.\nOnly "
                 "shape functions of order 2 are supported.",
                 shapefunction_order);
         }
@@ -207,7 +207,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration or this process requires higher order elements.",
                 type_idx.name());
diff --git a/ProcessLib/LIE/Common/FractureProperty.h b/ProcessLib/LIE/Common/FractureProperty.h
index 631338e9fecc7478c3094fab8d2fc60c3c1a2f01..201fd0bcd01b1ded04a41fc1df0ed6b90e4ee4a8 100644
--- a/ProcessLib/LIE/Common/FractureProperty.h
+++ b/ProcessLib/LIE/Common/FractureProperty.h
@@ -90,8 +90,8 @@ inline void setFractureProperty(int const dim, MeshLib::Element const& e,
     computeNormalVector(e, dim, n);
     frac_prop.R.resize(dim, dim);
     computeRotationMatrix(e, n, dim, frac_prop.R);
-    DBUG("Normal vector of the fracture element %d: [%g, %g, %g]", e.getID(),
-         n[0], n[1], n[2]);
+    DBUG("Normal vector of the fracture element {:d}: [{:g}, {:g}, {:g}]",
+         e.getID(), n[0], n[1], n[2]);
 }
 
 inline BranchProperty createBranchProperty(MeshLib::Node const& branchNode,
diff --git a/ProcessLib/LIE/Common/MeshUtils.cpp b/ProcessLib/LIE/Common/MeshUtils.cpp
index 089c7e039da7a07f1f78b220fa73128af21b5d64..88919f8d72c5cf17688698ecbd9c39cff80488ab 100644
--- a/ProcessLib/LIE/Common/MeshUtils.cpp
+++ b/ProcessLib/LIE/Common/MeshUtils.cpp
@@ -205,7 +205,7 @@ void findFracutreIntersections(
         BaseLib::makeVectorUnique(eles);
     }
 
-    DBUG("-> found %d branchs and %d junctions",
+    DBUG("-> found {:d} branchs and {:d} junctions",
          vec_branch_nodeID_matIDs.size(), vec_junction_nodeID_matIDs.size());
 }
 
@@ -239,7 +239,7 @@ void getFractureMatrixDataInMesh(
             all_fracture_elements.push_back(e);
         }
     }
-    DBUG("-> found total %d matrix elements and %d fracture elements",
+    DBUG("-> found total {:d} matrix elements and {:d} fracture elements",
          vec_matrix_elements.size(), all_fracture_elements.size());
 
     // get fracture material IDs
@@ -253,7 +253,7 @@ void getFractureMatrixDataInMesh(
         vec_fracture_mat_IDs.push_back((*material_ids)[e->getID()]);
     }
     BaseLib::makeVectorUnique(vec_fracture_mat_IDs);
-    DBUG("-> found %d fracture material groups", vec_fracture_mat_IDs.size());
+    DBUG("-> found {:d} fracture material groups", vec_fracture_mat_IDs.size());
 
     // create a vector of fracture elements for each material
     vec_fracture_elements.resize(vec_fracture_mat_IDs.size());
@@ -267,7 +267,7 @@ void getFractureMatrixDataInMesh(
                      [&](MeshLib::Element* e) {
                          return (*material_ids)[e->getID()] == frac_mat_id;
                      });
-        DBUG("-> found %d elements on the fracture %d", vec_elements.size(),
+        DBUG("-> found {:d} elements on the fracture {:d}", vec_elements.size(),
              frac_id);
     }
 
@@ -291,7 +291,8 @@ void getFractureMatrixDataInMesh(
             vec_nodes, [](MeshLib::Node* node1, MeshLib::Node* node2) {
                 return node1->getID() < node2->getID();
             });
-        DBUG("-> found %d nodes on the fracture %d", vec_nodes.size(), frac_id);
+        DBUG("-> found {:d} nodes on the fracture {:d}", vec_nodes.size(),
+             frac_id);
     }
 
     // find branch/junction nodes which connect to multiple fractures
diff --git a/ProcessLib/LIE/Common/PostUtils.cpp b/ProcessLib/LIE/Common/PostUtils.cpp
index 58f84edde45c8e3ebbaa60faaa5f685d3e389f89..5809c62890323e3aef3580df2a04cd61a235d723 100644
--- a/ProcessLib/LIE/Common/PostUtils.cpp
+++ b/ProcessLib/LIE/Common/PostUtils.cpp
@@ -252,7 +252,8 @@ void PostProcessTool::createProperties()
         else
         {
             WARN(
-                "Property '%s' cannot be created because its mesh item type is "
+                "Property '{:s}' cannot be created because its mesh item type "
+                "is "
                 "not supported.",
                 name.c_str());
         }
@@ -311,7 +312,8 @@ void PostProcessTool::copyProperties()
         else
         {
             WARN(
-                "Property '%s' cannot be created because its mesh item type is "
+                "Property '{:s}' cannot be created because its mesh item type "
+                "is "
                 "not supported.",
                 name.c_str());
         }
diff --git a/ProcessLib/LIE/HydroMechanics/CreateHydroMechanicsProcess.cpp b/ProcessLib/LIE/HydroMechanics/CreateHydroMechanicsProcess.cpp
index 9504bd3d231ccbd553a60746b97861667c460ce5..0447440fb8427a650a302141a610c398c60e3d0d 100644
--- a/ProcessLib/LIE/HydroMechanics/CreateHydroMechanicsProcess.cpp
+++ b/ProcessLib/LIE/HydroMechanics/CreateHydroMechanicsProcess.cpp
@@ -66,7 +66,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
             pv_name.find("displacement_jump") != 0)
         {
             OGS_FATAL(
-                "Found a process variable name '%s'. It should be "
+                "Found a process variable name '{:s}'. It should be "
                 "'displacement' or 'displacement_jumpN' or 'pressure'");
         }
         auto variable = std::find_if(variables.cbegin(), variables.cend(),
@@ -77,21 +77,21 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         if (variable == variables.end())
         {
             OGS_FATAL(
-                "Could not find process variable '%s' in the provided "
+                "Could not find process variable '{:s}' in the provided "
                 "variables "
-                "list for config tag <%s>.",
+                "list for config tag <{:s}>.",
                 pv_name.c_str(), "process_variable");
         }
-        DBUG("Found process variable '%s' for config tag <%s>.",
+        DBUG("Found process variable '{:s}' for config tag <{:s}>.",
              variable->getName().c_str(), "process_variable");
 
         if (pv_name.find("displacement") != std::string::npos &&
             variable->getNumberOfComponents() != GlobalDim)
         {
             OGS_FATAL(
-                "Number of components of the process variable '%s' is "
+                "Number of components of the process variable '{:s}' is "
                 "different "
-                "from the displacement dimension: got %d, expected %d",
+                "from the displacement dimension: got {:d}, expected {:d}",
                 variable->getName().c_str(),
                 variable->getNumberOfComponents(),
                 GlobalDim);
@@ -142,7 +142,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__intrinsic_permeability}
         "intrinsic_permeability", parameters, 1, &mesh);
 
-    DBUG("Use '%s' as intrinsic permeability parameter.",
+    DBUG("Use '{:s}' as intrinsic permeability parameter.",
          intrinsic_permeability.name.c_str());
 
     // Storage coefficient
@@ -151,7 +151,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__specific_storage}
         "specific_storage", parameters, 1, &mesh);
 
-    DBUG("Use '%s' as specific storage parameter.",
+    DBUG("Use '{:s}' as specific storage parameter.",
          specific_storage.name.c_str());
 
     // Fluid viscosity
@@ -159,7 +159,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__fluid_viscosity}
         "fluid_viscosity", parameters, 1, &mesh);
-    DBUG("Use '%s' as fluid viscosity parameter.",
+    DBUG("Use '{:s}' as fluid viscosity parameter.",
          fluid_viscosity.name.c_str());
 
     // Fluid density
@@ -167,14 +167,14 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__fluid_density}
         "fluid_density", parameters, 1, &mesh);
-    DBUG("Use '%s' as fluid density parameter.", fluid_density.name.c_str());
+    DBUG("Use '{:s}' as fluid density parameter.", fluid_density.name.c_str());
 
     // Biot coefficient
     auto& biot_coefficient = ParameterLib::findParameter<double>(
         config,
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__biot_coefficient}
         "biot_coefficient", parameters, 1, &mesh);
-    DBUG("Use '%s' as Biot coefficient parameter.",
+    DBUG("Use '{:s}' as Biot coefficient parameter.",
          biot_coefficient.name.c_str());
 
     // Porosity
@@ -182,14 +182,14 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__porosity}
         "porosity", parameters, 1, &mesh);
-    DBUG("Use '%s' as porosity parameter.", porosity.name.c_str());
+    DBUG("Use '{:s}' as porosity parameter.", porosity.name.c_str());
 
     // Solid density
     auto& solid_density = ParameterLib::findParameter<double>(
         config,
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__solid_density}
         "solid_density", parameters, 1, &mesh);
-    DBUG("Use '%s' as solid density parameter.", solid_density.name.c_str());
+    DBUG("Use '{:s}' as solid density parameter.", solid_density.name.c_str());
 
     // Specific body force
     Eigen::Matrix<double, GlobalDim, 1> specific_body_force;
@@ -202,8 +202,8 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), GlobalDim);
         }
 
@@ -245,7 +245,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         {
             OGS_FATAL(
                 "Cannot construct fracture constitutive relation of given type "
-                "'%s'.",
+                "'{:s}'.",
                 frac_type.c_str());
         }
     }
@@ -278,7 +278,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         if (frac_prop->aperture0.isTimeDependent())
         {
             OGS_FATAL(
-                "The initial aperture parameter '%s' must not be "
+                "The initial aperture parameter '{:s}' must not be "
                 "time-dependent.",
                 frac_prop->aperture0.name.c_str());
         }
@@ -297,7 +297,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__initial_effective_stress}
         "initial_effective_stress", parameters,
         MathLib::KelvinVector::KelvinVectorDimensions<GlobalDim>::value, &mesh);
-    DBUG("Use '%s' as initial effective stress parameter.",
+    DBUG("Use '{:s}' as initial effective stress parameter.",
          initial_effective_stress.name.c_str());
 
     // initial effective stress in fracture
@@ -306,7 +306,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__HYDRO_MECHANICS_WITH_LIE__initial_fracture_effective_stress}
         "initial_fracture_effective_stress", parameters, GlobalDim, &mesh);
-    DBUG("Use '%s' as initial fracture effective stress parameter.",
+    DBUG("Use '{:s}' as initial fracture effective stress parameter.",
          initial_fracture_effective_stress.name.c_str());
 
     // deactivation of matrix elements in flow
diff --git a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
index 69f22abdb3794dc6dcd3ef84df737164b1ef6de5..c4982bb7626432741258b7a414d8f7be850bb839 100644
--- a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
@@ -107,7 +107,7 @@ HydroMechanicsProcess<GlobalDim>::HydroMechanicsProcess(
         {
             OGS_FATAL(
                 "Could not get minimum/maximum ranges values for the "
-                "MaterialIDs property in the mesh '%s'.",
+                "MaterialIDs property in the mesh '{:s}'.",
                 mesh.getName().c_str());
         }
 
@@ -195,7 +195,7 @@ void HydroMechanicsProcess<GlobalDim>::constructDofTable()
             vec_var_elements,
             NumLib::ComponentOrder::BY_COMPONENT);
 
-    DBUG("created %d DoF", _local_to_global_index_map->size());
+    DBUG("created {:d} DoF", _local_to_global_index_map->size());
 }
 
 template <int GlobalDim>
diff --git a/ProcessLib/LIE/HydroMechanics/LocalAssembler/CreateLocalAssemblers.h b/ProcessLib/LIE/HydroMechanics/LocalAssembler/CreateLocalAssemblers.h
index 9b83821e27a8525f047797bcb13ccb7d94a3881f..f749059da1d6809ed9317994dd4a3a0f8456c154 100644
--- a/ProcessLib/LIE/HydroMechanics/LocalAssembler/CreateLocalAssemblers.h
+++ b/ProcessLib/LIE/HydroMechanics/LocalAssembler/CreateLocalAssemblers.h
@@ -11,7 +11,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
 
diff --git a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerFracture-impl.h b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerFracture-impl.h
index e7879dcaabd72723bb996c59271a484ab7cc9824..ad016b1f60bf71674f436fa82cba1dd4946c55bb 100644
--- a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerFracture-impl.h
+++ b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerFracture-impl.h
@@ -239,7 +239,8 @@ void HydroMechanicsLocalAssemblerFracture<ShapeFunctionDisplacement,
         if (b_m < 0.0)
         {
             DBUG(
-                "Element %d, gp %d: Fracture aperture is %g, but it must be "
+                "Element {:d}, gp {:d}: Fracture aperture is {:g}, but it must "
+                "be "
                 "non-negative. Setting it to zero.",
                 _element.getID(), ip, b_m);
             b_m = 0;
@@ -369,7 +370,7 @@ void HydroMechanicsLocalAssemblerFracture<
         if (b_m < 0.0)
         {
             DBUG(
-                "Element %d, gp %d: Fracture aperture is %g, but it is "
+                "Element {:d}, gp {:d}: Fracture aperture is {:g}, but it is "
                 "expected to be non-negative.",
                 _element.getID(), ip, b_m);
         }
diff --git a/ProcessLib/LIE/HydroMechanics/LocalAssembler/LocalDataInitializer.h b/ProcessLib/LIE/HydroMechanics/LocalAssembler/LocalDataInitializer.h
index 116eabde703feddc437a97ebee3a13e76f535185..bdc69649fae2dce1c834b51d1c74b00874c1034e 100644
--- a/ProcessLib/LIE/HydroMechanics/LocalAssembler/LocalDataInitializer.h
+++ b/ProcessLib/LIE/HydroMechanics/LocalAssembler/LocalDataInitializer.h
@@ -144,7 +144,7 @@ public:
         if (shapefunction_order != 2)
         {
             OGS_FATAL(
-                "The given shape function order %d is not supported.\nOnly "
+                "The given shape function order {:d} is not supported.\nOnly "
                 "shape functions of order 2 are supported.",
                 shapefunction_order);
         }
@@ -219,7 +219,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration or this process requires higher order elements.",
                 type_idx.name());
diff --git a/ProcessLib/LIE/SmallDeformation/CreateSmallDeformationProcess.cpp b/ProcessLib/LIE/SmallDeformation/CreateSmallDeformationProcess.cpp
index 6de133a5340ddd2842eb9469e572b3b1715a1fbc..9c9d673b092892e9f7318c4d390d3afde5ad7027 100644
--- a/ProcessLib/LIE/SmallDeformation/CreateSmallDeformationProcess.cpp
+++ b/ProcessLib/LIE/SmallDeformation/CreateSmallDeformationProcess.cpp
@@ -57,7 +57,7 @@ std::unique_ptr<Process> createSmallDeformationProcess(
         if (pv_name != "displacement" && pv_name.find("displacement_jump") != 0)
         {
             OGS_FATAL(
-                "Found a process variable name '%s'. It should be "
+                "Found a process variable name '{:s}'. It should be "
                 "'displacement' or 'displacement_jumpN' or "
                 "'displacement_junctionN'");
         }
@@ -74,12 +74,12 @@ std::unique_ptr<Process> createSmallDeformationProcess(
         if (variable == variables.end())
         {
             OGS_FATAL(
-                "Could not find process variable '%s' in the provided "
+                "Could not find process variable '{:s}' in the provided "
                 "variables "
-                "list for config tag <%s>.",
+                "list for config tag <{:s}>.",
                 pv_name.c_str(), "process_variable");
         }
-        DBUG("Found process variable '%s' for config tag <%s>.",
+        DBUG("Found process variable '{:s}' for config tag <{:s}>.",
              variable->getName().c_str(), "process_variable");
 
         per_process_variables.emplace_back(
@@ -91,15 +91,15 @@ std::unique_ptr<Process> createSmallDeformationProcess(
         OGS_FATAL("No displacement jump variables are specified");
     }
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          per_process_variables.back().get().getName().c_str());
 
     if (per_process_variables.back().get().getNumberOfComponents() !=
         DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             per_process_variables.back().get().getName().c_str(),
             per_process_variables.back().get().getNumberOfComponents(),
             DisplacementDim);
@@ -144,7 +144,7 @@ std::unique_ptr<Process> createSmallDeformationProcess(
     {
         OGS_FATAL(
             "Cannot construct fracture constitutive relation of given type "
-            "'%s'.",
+            "'{:s}'.",
             frac_type.c_str());
     }
 
diff --git a/ProcessLib/LIE/SmallDeformation/LocalAssembler/CreateLocalAssemblers.h b/ProcessLib/LIE/SmallDeformation/LocalAssembler/CreateLocalAssemblers.h
index 07f1ddf7162073d2a1de1c00f8c400a8fd5b24f0..39dc70f5feaa8559b552d6feae58408419ef28d0 100644
--- a/ProcessLib/LIE/SmallDeformation/LocalAssembler/CreateLocalAssemblers.h
+++ b/ProcessLib/LIE/SmallDeformation/LocalAssembler/CreateLocalAssemblers.h
@@ -11,7 +11,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
 
diff --git a/ProcessLib/LIE/SmallDeformation/LocalAssembler/LocalDataInitializer.h b/ProcessLib/LIE/SmallDeformation/LocalAssembler/LocalDataInitializer.h
index 8ce1b7045f12a81f9664b81afdbca02263f0116a..8ac3a2d97dd749a0f60dc436fc075cf39e982fae 100644
--- a/ProcessLib/LIE/SmallDeformation/LocalAssembler/LocalDataInitializer.h
+++ b/ProcessLib/LIE/SmallDeformation/LocalAssembler/LocalDataInitializer.h
@@ -248,7 +248,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration or this process requires higher order elements.",
                 type_idx.name());
diff --git a/ProcessLib/LIE/SmallDeformation/LocalAssembler/SmallDeformationLocalAssemblerFracture-impl.h b/ProcessLib/LIE/SmallDeformation/LocalAssembler/SmallDeformationLocalAssemblerFracture-impl.h
index 0b9469d0b69ccaa62d5e4fc81ef3982ada641c98..e1c7c7490d6a0e54129d3f8215567f6777b43999 100644
--- a/ProcessLib/LIE/SmallDeformation/LocalAssembler/SmallDeformationLocalAssemblerFracture-impl.h
+++ b/ProcessLib/LIE/SmallDeformation/LocalAssembler/SmallDeformationLocalAssemblerFracture-impl.h
@@ -315,8 +315,8 @@ void SmallDeformationLocalAssemblerFracture<ShapeFunction, IntegrationMethod,
         if (b_m < 0.0)
         {
             OGS_FATAL(
-                "Element %d, gp %d: Fracture aperture is %g, but it must be "
-                "non-negative.",
+                "Element {:d}, gp {:d}: Fracture aperture is {:g}, but it must "
+                "be non-negative.",
                 _element.getID(), ip, b_m);
         }
 
diff --git a/ProcessLib/LIE/SmallDeformation/SmallDeformationProcess.cpp b/ProcessLib/LIE/SmallDeformation/SmallDeformationProcess.cpp
index fabc61b97cca5edbdd36164853add9040d953b54..9d5bc7b2c002635a6f3bf438c42176cd42365863 100644
--- a/ProcessLib/LIE/SmallDeformation/SmallDeformationProcess.cpp
+++ b/ProcessLib/LIE/SmallDeformation/SmallDeformationProcess.cpp
@@ -59,9 +59,9 @@ SmallDeformationProcess<DisplacementDim>::SmallDeformationProcess(
         _process_data.fracture_properties.size())
     {
         OGS_FATAL(
-            "The number of the given fracture properties (%d) are not "
+            "The number of the given fracture properties ({:d}) are not "
             "consistent"
-            " with the number of fracture groups in a mesh (%d).",
+            " with the number of fracture groups in a mesh ({:d}).",
             _process_data.fracture_properties.size(),
             _vec_fracture_mat_IDs.size());
     }
diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
index 05e90c5f00c9abbb97cf6a9cd17b30b1eec40535..51f34df443a3d738d7f340c7bae4dda990f7129b 100644
--- a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
+++ b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
@@ -93,7 +93,7 @@ std::unique_ptr<Process> createLiquidFlowProcess(
     {
         OGS_FATAL(
             "The gravity axis must be a number between 0 and one less than the "
-            "mesh dimension, which is %d. Read gravity axis %d from input "
+            "mesh dimension, which is {:d}. Read gravity axis {:d} from input "
             "file.",
             mesh.getDimension(), gravity_axis_id_input);
     }
diff --git a/ProcessLib/Output/CreateOutput.cpp b/ProcessLib/Output/CreateOutput.cpp
index 224dcd3c9c6d5fe663ca7845cbbc71d2a542bbeb..a1923fddfd9ab6555633b7f89c362f9c192b957a 100644
--- a/ProcessLib/Output/CreateOutput.cpp
+++ b/ProcessLib/Output/CreateOutput.cpp
@@ -10,9 +10,9 @@
 
 #include "CreateOutput.h"
 
-#include <logog/include/logog.hpp>
 #include <memory>
 #include <tuple>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Algorithm.h"
 #include "BaseLib/ConfigTree.h"
@@ -89,11 +89,11 @@ std::unique_ptr<Output> createOutput(
     {
         if (output_variables.find(out_var) != output_variables.cend())
         {
-            OGS_FATAL("output variable `%s' specified more than once.",
+            OGS_FATAL("output variable `{:s}' specified more than once.",
                       out_var.c_str());
         }
 
-        DBUG("adding output variable `%s'", out_var.c_str());
+        DBUG("adding output variable `{:s}'", out_var.c_str());
         output_variables.insert(out_var);
     }
 
@@ -112,7 +112,7 @@ std::unique_ptr<Output> createOutput(
         {
             mesh_names_for_output.push_back(
                 mesh_config.getValue<std::string>());
-            INFO("Configure mesh '%s' for output.",
+            INFO("Configure mesh '{:s}' for output.",
                  mesh_names_for_output.back().c_str());
         }
     }
diff --git a/ProcessLib/Output/IntegrationPointWriter.cpp b/ProcessLib/Output/IntegrationPointWriter.cpp
index 8e11d1c4f2b4ab62a7e9c1af36fe84032c0be467..8bf1a417ef30e20104e8bfa586ff4e00175c3fa0 100644
--- a/ProcessLib/Output/IntegrationPointWriter.cpp
+++ b/ProcessLib/Output/IntegrationPointWriter.cpp
@@ -81,7 +81,7 @@ static ProcessLib::IntegrationPointMetaData extractIntegrationPointMetaData(
             return {name, md["number_of_components"], md["integration_order"]};
         }
     }
-    OGS_FATAL("No integration point meta data with name '%s' found.",
+    OGS_FATAL("No integration point meta data with name '{:s}' found.",
               name.c_str());
 }
 
@@ -110,7 +110,7 @@ IntegrationPointMetaData getIntegrationPointMetaData(MeshLib::Mesh const& mesh,
             "IntegrationPointMetaData"))
     {
         OGS_FATAL(
-            "Integration point data '%s' is present in the vtk field "
+            "Integration point data '{:s}' is present in the vtk field "
             "data but the required 'IntegrationPointMetaData' array "
             "is not available.",
             name.c_str());
diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp
index 75075e1f8807a5bad62651cd0506e479d3f6b71d..422b082cf7c49b4c245438bc0ecf75b14f3f6c5e 100644
--- a/ProcessLib/Output/Output.cpp
+++ b/ProcessLib/Output/Output.cpp
@@ -14,7 +14,7 @@
 #include <fstream>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "Applications/InSituLib/Adaptor.h"
 #include "BaseLib/FileTools.h"
@@ -40,7 +40,7 @@ int convertVtkDataMode(std::string const& data_mode)
         return 2;
     }
     OGS_FATAL(
-        "Unsupported vtk output file data mode '%s'. Expected Ascii, "
+        "Unsupported vtk output file data mode '{:s}'. Expected Ascii, "
         "Binary, or Appended.",
         data_mode.c_str());
 }
@@ -180,7 +180,7 @@ void Output::outputBulkMesh(OutputFile const& output_file,
                             MeshLib::Mesh const& mesh,
                             double const t) const
 {
-    DBUG("output to %s", output_file.path.c_str());
+    DBUG("output to {:s}", output_file.path.c_str());
 
     process_data->pvd_file.addVTUFile(output_file.name, t);
 
@@ -250,9 +250,8 @@ void Output::doOutputAlways(Process const& process,
             "Need mesh '" + mesh_output_name + "' for the output.");
 
         std::vector<MeshLib::Node*> const& nodes = mesh.getNodes();
-        DBUG(
-            "Found %d nodes for output at mesh '%s'.",
-            nodes.size(), mesh.getName().c_str());
+        DBUG("Found {:d} nodes for output at mesh '{:s}'.", nodes.size(),
+             mesh.getName().c_str());
 
         MeshLib::MeshSubset mesh_subset(mesh, nodes);
         std::vector<std::unique_ptr<NumLib::LocalToGlobalIndexMap>>
@@ -292,12 +291,12 @@ void Output::doOutputAlways(Process const& process,
                                      _output_file_data_mode,
                                      _output_file_compression};
 
-        DBUG("output to %s", output_file.path.c_str());
+        DBUG("output to {:s}", output_file.path.c_str());
 
         makeOutput(output_file.path, mesh, output_file.compression,
                    output_file.data_mode);
     }
-    INFO("[time] Output of timestep %d took %g s.", timestep,
+    INFO("[time] Output of timestep {:d} took {:g} s.", timestep,
          time_output.elapsed());
 }
 
@@ -378,9 +377,9 @@ void Output::doOutputNonlinearIteration(Process const& process,
     std::string const output_file_path =
         BaseLib::joinPaths(_output_directory, output_file_name);
 
-    DBUG("output iteration results to %s", output_file_path.c_str());
+    DBUG("output iteration results to {:s}", output_file_path.c_str());
 
-    INFO("[time] Output took %g s.", time_output.elapsed());
+    INFO("[time] Output took {:g} s.", time_output.elapsed());
 
     makeOutput(output_file_path, process.getMesh(), _output_file_compression,
                _output_file_data_mode);
diff --git a/ProcessLib/Output/ProcessOutput.cpp b/ProcessLib/Output/ProcessOutput.cpp
index 040cf0b88eb92783a847238e0c1b862cfc819e91..db6b1d9936c69cc1a265f31de8b9d144811d8fd5 100644
--- a/ProcessLib/Output/ProcessOutput.cpp
+++ b/ProcessLib/Output/ProcessOutput.cpp
@@ -37,7 +37,7 @@ static void addSecondaryVariableNodes(
     std::string const& output_name,
     MeshLib::Mesh& mesh)
 {
-    DBUG("  secondary variable %s", output_name.c_str());
+    DBUG("  secondary variable {:s}", output_name.c_str());
 
     auto& nodal_values_mesh = *MeshLib::getOrCreateMeshProperty<double>(
         mesh, output_name, MeshLib::MeshItemType::Node,
@@ -46,8 +46,8 @@ static void addSecondaryVariableNodes(
         mesh.getNumberOfNodes() * var.fcts.num_components)
     {
         OGS_FATAL(
-            "Nodal property `%s' does not have the right number of "
-            "components. Expected: %d, actual: %d",
+            "Nodal property `{:s}' does not have the right number of "
+            "components. Expected: {:d}, actual: {:d}",
             output_name.c_str(),
             mesh.getNumberOfNodes() * var.fcts.num_components,
             nodal_values_mesh.size());
@@ -65,8 +65,8 @@ static void addSecondaryVariableNodes(
     if (nodal_values_mesh.size() != global_vector_size)
     {
         OGS_FATAL(
-            "Secondary variable `%s' did not evaluate to the right "
-            "number of components. Expected: %d, actual: %d.",
+            "Secondary variable `{:s}' did not evaluate to the right "
+            "number of components. Expected: {:d}, actual: {:d}.",
             var.name.c_str(), nodal_values_mesh.size(), global_vector_size);
     }
 
@@ -87,7 +87,7 @@ static void addSecondaryVariableResiduals(
         return;
     }
 
-    DBUG("  secondary variable %s residual", output_name.c_str());
+    DBUG("  secondary variable {:s} residual", output_name.c_str());
     auto const& property_name_res = output_name + "_residual";
 
     auto& residuals_mesh = *MeshLib::getOrCreateMeshProperty<double>(
@@ -97,8 +97,9 @@ static void addSecondaryVariableResiduals(
         mesh.getNumberOfElements() * var.fcts.num_components)
     {
         OGS_FATAL(
-            "Cell property `%s' does not have the right number of components. "
-            "Expected: %d, actual: %d",
+            "Cell property `{:s}' does not have the right number of "
+            "components. "
+            "Expected: {:d}, actual: {:d}",
             property_name_res.c_str(),
             mesh.getNumberOfElements() * var.fcts.num_components,
             residuals_mesh.size());
@@ -116,8 +117,8 @@ static void addSecondaryVariableResiduals(
     if (residuals_mesh.size() != global_vector_size)
     {
         OGS_FATAL(
-            "The residual of secondary variable `%s' did not evaluate to the "
-            "right number of components. Expected: %d, actual: %d.",
+            "The residual of secondary variable `{:s}' did not evaluate to the "
+            "right number of components. Expected: {:d}, actual: {:d}.",
             var.name.c_str(), residuals_mesh.size(), global_vector_size);
     }
 
@@ -190,7 +191,7 @@ void processOutputData(
 
         already_output.insert(pv.getName());
 
-        DBUG("  process variable %s", pv.getName().c_str());
+        DBUG("  process variable {:s}", pv.getName().c_str());
 
         auto const num_comp = pv.getNumberOfComponents();
         auto& output_data = *MeshLib::getOrCreateMeshProperty<double>(
@@ -248,7 +249,7 @@ void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh,
                 bool const compress_output, int const data_mode)
 {
     // Write output file
-    DBUG("Writing output to '%s'.", file_name.c_str());
+    DBUG("Writing output to '{:s}'.", file_name.c_str());
     MeshLib::IO::VtuInterface vtu_interface(&mesh, data_mode, compress_output);
     vtu_interface.writeToFile(file_name);
 }
diff --git a/ProcessLib/Output/SecondaryVariable.cpp b/ProcessLib/Output/SecondaryVariable.cpp
index 422cf24147d584593fa8d37a95e58c7ed912fcee..a05fb733d94f8e862ee9fcccb268ac5deb984e59 100644
--- a/ProcessLib/Output/SecondaryVariable.cpp
+++ b/ProcessLib/Output/SecondaryVariable.cpp
@@ -33,7 +33,7 @@ void SecondaryVariableCollection::addSecondaryVariable(
              .second)
     {
         OGS_FATAL(
-            "The secondary variable with internal name `%s' has already been "
+            "The secondary variable with internal name `{:s}' has already been "
             "set up.",
             internal_name.c_str());
     }
@@ -59,7 +59,8 @@ SecondaryVariable const& SecondaryVariableCollection::get(
     if (it == _map_external_to_internal.cend())
     {
         OGS_FATAL(
-            "A secondary variable with external name '%s' has not been set up.",
+            "A secondary variable with external name '{:s}' has not been set "
+            "up.",
             external_name.c_str());
     }
 
@@ -69,7 +70,8 @@ SecondaryVariable const& SecondaryVariableCollection::get(
     if (it2 == _configured_secondary_variables.end())
     {
         OGS_FATAL(
-            "A secondary variable with internal name '%s' has not been set up.",
+            "A secondary variable with internal name '{:s}' has not been set "
+            "up.",
             internal_name.c_str());
     }
 
diff --git a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp
index edaf50c37f81fc4c7fc2bb02439d5d50c9374f61..d73fd0a5fdba643465c087c837f31282f776bd89 100644
--- a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp
+++ b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp
@@ -78,26 +78,27 @@ std::unique_ptr<Process> createPhaseFieldProcess(
         variable_ph = &process_variables[1][0].get();
     }
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          variable_u->getName().c_str());
 
     if (variable_u->getNumberOfComponents() != DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             variable_u->getName().c_str(),
             variable_u->getNumberOfComponents(),
             DisplacementDim);
     }
 
-    DBUG("Associate phase field with process variable '%s'.",
+    DBUG("Associate phase field with process variable '{:s}'.",
          variable_ph->getName().c_str());
     if (variable_ph->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "Phasefield process variable '%s' is not a scalar variable but has "
-            "%d components.",
+            "Phasefield process variable '{:s}' is not a scalar variable but "
+            "has "
+            "{:d} components.",
             variable_ph->getName().c_str(),
             variable_ph->getNumberOfComponents());
     }
@@ -115,42 +116,43 @@ std::unique_ptr<Process> createPhaseFieldProcess(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__residual_stiffness}
         "residual_stiffness", parameters, 1);
-    DBUG("Use '%s' as residual stiffness.", residual_stiffness.name.c_str());
+    DBUG("Use '{:s}' as residual stiffness.", residual_stiffness.name.c_str());
 
     // Crack resistance
     auto& crack_resistance = ParameterLib::findParameter<double>(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__crack_resistance}
         "crack_resistance", parameters, 1);
-    DBUG("Use '%s' as crack resistance.", crack_resistance.name.c_str());
+    DBUG("Use '{:s}' as crack resistance.", crack_resistance.name.c_str());
 
     // Crack length scale
     auto& crack_length_scale = ParameterLib::findParameter<double>(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__crack_length_scale}
         "crack_length_scale", parameters, 1);
-    DBUG("Use '%s' as crack length scale.", crack_length_scale.name.c_str());
+    DBUG("Use '{:s}' as crack length scale.", crack_length_scale.name.c_str());
 
     // Kinetic coefficient
     auto& kinetic_coefficient = ParameterLib::findParameter<double>(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__kinetic_coefficient}
         "kinetic_coefficient", parameters, 1);
-    DBUG("Use '%s' as kinetic coefficient.", kinetic_coefficient.name.c_str());
+    DBUG("Use '{:s}' as kinetic coefficient.",
+         kinetic_coefficient.name.c_str());
 
     // Solid density
     auto& solid_density = ParameterLib::findParameter<double>(
         config,
         //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__solid_density}
         "solid_density", parameters, 1);
-    DBUG("Use '%s' as solid density parameter.", solid_density.name.c_str());
+    DBUG("Use '{:s}' as solid density parameter.", solid_density.name.c_str());
 
     // History field
     auto& history_field = ParameterLib::findParameter<double>(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__PHASE_FIELD__phasefield_parameters__history_field}
         "history_field", parameters, 1);
-    DBUG("Use '%s' as history field.", history_field.name.c_str());
+    DBUG("Use '{:s}' as history field.", history_field.name.c_str());
 
     // Specific body force
     Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
@@ -163,8 +165,8 @@ std::unique_ptr<Process> createPhaseFieldProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), DisplacementDim);
         }
 
@@ -179,7 +181,7 @@ std::unique_ptr<Process> createPhaseFieldProcess(
     {
         OGS_FATAL(
             "hydro_crack_scheme must be 'propagating' or 'static' but "
-            "'%s' was given",
+            "'{:s}' was given",
             crack_scheme->c_str());
     }
 
diff --git a/ProcessLib/PhaseField/PhaseFieldProcess.cpp b/ProcessLib/PhaseField/PhaseFieldProcess.cpp
index 1fd7ef6850d111d49d3af26d6ba7e99b7bd6f38f..3d2f3a03018ccc2a1c7fea6e34085fc9f7c4227b 100644
--- a/ProcessLib/PhaseField/PhaseFieldProcess.cpp
+++ b/ProcessLib/PhaseField/PhaseFieldProcess.cpp
@@ -241,7 +241,7 @@ void PhaseFieldProcess<DisplacementDim>::preTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     const int process_id)
 {
-    DBUG("PreTimestep PhaseFieldProcess %d.", process_id);
+    DBUG("PreTimestep PhaseFieldProcess {:d}.", process_id);
 
     _process_data.injected_volume = t;
 
@@ -281,7 +281,7 @@ void PhaseFieldProcess<DisplacementDim>::postTimestepConcreteProcess(
             _process_data.elastic_energy, _process_data.surface_energy,
             _process_data.pressure_work, _coupled_solutions);
 
-        INFO("Elastic energy: %g Surface energy: %g Pressure work: %g ",
+        INFO("Elastic energy: {:g} Surface energy: {:g} Pressure work: {:g} ",
              _process_data.elastic_energy, _process_data.surface_energy,
              _process_data.pressure_work);
     }
@@ -311,7 +311,7 @@ void PhaseFieldProcess<DisplacementDim>::postNonLinearSolverConcreteProcess(
             pv.getActiveElementIDs(), dof_tables, x, t,
             _process_data.crack_volume, _coupled_solutions);
 
-        INFO("Integral of crack: %g", _process_data.crack_volume);
+        INFO("Integral of crack: {:g}", _process_data.crack_volume);
 
         if (_process_data.propagating_crack)
         {
@@ -321,7 +321,7 @@ void PhaseFieldProcess<DisplacementDim>::postNonLinearSolverConcreteProcess(
             _process_data.pressure_error =
                 std::fabs(_process_data.pressure_old - _process_data.pressure) /
                 _process_data.pressure;
-            INFO("Internal pressure: %g and Pressure error: %.4e",
+            INFO("Internal pressure: {:g} and Pressure error: {:.4e}",
                  _process_data.pressure, _process_data.pressure_error);
             auto& u = *_coupled_solutions->coupled_xs[0];
             MathLib::LinAlg::scale(const_cast<GlobalVector&>(u),
diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp
index c0962a92dca70876a320bc5fcf718f78d73b92cd..0c40e28cbfd343fbdb7fa04b2c942995ea0a291c 100644
--- a/ProcessLib/Process.cpp
+++ b/ProcessLib/Process.cpp
@@ -123,7 +123,7 @@ void Process::setInitialConditions(const int process_id, double const t,
         ParameterLib::SpatialPosition pos;
 
         auto const& pv = per_process_variables[variable_id];
-        DBUG("Set the initial condition of variable %s of process %d.",
+        DBUG("Set the initial condition of variable {:s} of process {:d}.",
              pv.get().getName().data(), process_id);
 
         auto const& ic = pv.get().getInitialCondition();
diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp
index 05e5466a53d9f4b990100acaf9005d3be3f82552..025c073b408a0945038807e35a421ed7982aa10d 100644
--- a/ProcessLib/ProcessVariable.cpp
+++ b/ProcessLib/ProcessVariable.cpp
@@ -11,8 +11,8 @@
 #include "ProcessVariable.h"
 
 #include <algorithm>
-#include <logog/include/logog.hpp>
 #include <utility>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/Algorithm.h"
 #include "BaseLib/TimeInterval.h"
@@ -81,7 +81,8 @@ MeshLib::Mesh const& findMeshInConfig(
             return mesh->getName() == mesh_name;
         },
         "Required mesh with name '" + mesh_name + "' not found.");
-    DBUG("Found mesh '%s' with id %d.", mesh.getName().c_str(), mesh.getID());
+    DBUG("Found mesh '{:s}' with id {:d}.", mesh.getName().c_str(),
+         mesh.getID());
 
     return mesh;
 }
@@ -107,11 +108,11 @@ ProcessVariable::ProcessVariable(
           config.getConfigParameter<std::string>("initial_condition"),
           parameters, _n_components, &mesh))
 {
-    DBUG("Constructing process variable %s", _name.c_str());
+    DBUG("Constructing process variable {:s}", _name.c_str());
 
     if (_shapefunction_order < 1 || 2 < _shapefunction_order)
     {
-        OGS_FATAL("The given shape function order %d is not supported",
+        OGS_FATAL("The given shape function order {:d} is not supported",
                   _shapefunction_order);
     }
 
@@ -141,7 +142,7 @@ ProcessVariable::ProcessVariable(
     }
     else
     {
-        INFO("No boundary conditions for process variable '%s' found.",
+        INFO("No boundary conditions for process variable '{:s}' found.",
              _name.c_str());
     }
 
@@ -171,7 +172,8 @@ ProcessVariable::ProcessVariable(
     }
     else
     {
-        INFO("No source terms for process variable '%s' found.", _name.c_str());
+        INFO("No source terms for process variable '{:s}' found.",
+             _name.c_str());
     }
 }
 
diff --git a/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp b/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
index 9fe62954be07a5e47b7243fcce696dcd1d428b1c..80131807a3fd8975de51fb553df8d1d4f6da7374 100644
--- a/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
+++ b/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
@@ -90,7 +90,7 @@ std::unique_ptr<Process> createRichardsComponentTransportProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__RichardsComponentTransport__fluid_reference_density}
         "fluid_reference_density", parameters, 1, &mesh);
-    DBUG("Use '%s' as fluid_reference_density parameter.",
+    DBUG("Use '{:s}' as fluid_reference_density parameter.",
          fluid_reference_density.name.c_str());
 
     // Parameter for the longitudinal solute dispersivity.
@@ -99,7 +99,7 @@ std::unique_ptr<Process> createRichardsComponentTransportProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__RichardsComponentTransport__molecular_diffusion_coefficient}
         "molecular_diffusion_coefficient", parameters, 1, &mesh);
-    DBUG("Use '%s' as molecular diffusion coefficient parameter.",
+    DBUG("Use '{:s}' as molecular diffusion coefficient parameter.",
          molecular_diffusion_coefficient.name.c_str());
 
     // Parameter for the longitudinal solute dispersivity.
@@ -108,7 +108,7 @@ std::unique_ptr<Process> createRichardsComponentTransportProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__RichardsComponentTransport__solute_dispersivity_longitudinal}
         "solute_dispersivity_longitudinal", parameters, 1, &mesh);
-    DBUG("Use '%s' as longitudinal solute dispersivity parameter.",
+    DBUG("Use '{:s}' as longitudinal solute dispersivity parameter.",
          solute_dispersivity_longitudinal.name.c_str());
 
     // Parameter for the transverse solute dispersivity.
@@ -117,7 +117,7 @@ std::unique_ptr<Process> createRichardsComponentTransportProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__RichardsComponentTransport__solute_dispersivity_transverse}
         "solute_dispersivity_transverse", parameters, 1, &mesh);
-    DBUG("Use '%s' as transverse solute dispersivity parameter.",
+    DBUG("Use '{:s}' as transverse solute dispersivity parameter.",
          solute_dispersivity_transverse.name.c_str());
 
     // Parameter for the retardation factor.
@@ -141,8 +141,8 @@ std::unique_ptr<Process> createRichardsComponentTransportProcess(
     if (b.size() < mesh.getDimension())
     {
         OGS_FATAL(
-            "specific body force (gravity vector) has %d components, mesh "
-            "dimension is %d",
+            "specific body force (gravity vector) has {:d} components, mesh "
+            "dimension is {:d}",
             b.size(), mesh.getDimension());
     }
     bool const has_gravity = MathLib::toVector(b).norm() > 0;
diff --git a/ProcessLib/RichardsMechanics/CreateLocalAssemblers.h b/ProcessLib/RichardsMechanics/CreateLocalAssemblers.h
index 74047067c12735106e728ff67e7efb44e7cdb42e..6275ff59da5ee8c07d35085174e3f3b63f051f2d 100644
--- a/ProcessLib/RichardsMechanics/CreateLocalAssemblers.h
+++ b/ProcessLib/RichardsMechanics/CreateLocalAssemblers.h
@@ -11,7 +11,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
 
diff --git a/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp
index 94904fc36cea426086b8a5940dfa3d011357328c..fd29c02fff88f1c98b1e0fadee1e7407b1c3e319 100644
--- a/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp
+++ b/ProcessLib/RichardsMechanics/CreateRichardsMechanicsProcess.cpp
@@ -109,26 +109,26 @@ std::unique_ptr<Process> createRichardsMechanicsProcess(
         variable_u = &process_variables[1][0].get();
     }
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          variable_u->getName().c_str());
 
     if (variable_u->getNumberOfComponents() != DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             variable_u->getName().c_str(),
             variable_u->getNumberOfComponents(),
             DisplacementDim);
     }
 
-    DBUG("Associate pressure with process variable '%s'.",
+    DBUG("Associate pressure with process variable '{:s}'.",
          variable_p->getName().c_str());
     if (variable_p->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "Pressure process variable '%s' is not a scalar variable but has "
-            "%d components.",
+            "Pressure process variable '{:s}' is not a scalar variable but has "
+            "{:d} components.",
             variable_p->getName().c_str(),
             variable_p->getNumberOfComponents());
     }
@@ -148,8 +148,8 @@ std::unique_ptr<Process> createRichardsMechanicsProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), DisplacementDim);
         }
 
diff --git a/ProcessLib/RichardsMechanics/LocalDataInitializer.h b/ProcessLib/RichardsMechanics/LocalDataInitializer.h
index af6f2974b6247b66a27c5568ef070a9bcbb327d6..aa449f7fed9d34f2a01c74f29546e0ea1ab10258 100644
--- a/ProcessLib/RichardsMechanics/LocalDataInitializer.h
+++ b/ProcessLib/RichardsMechanics/LocalDataInitializer.h
@@ -128,7 +128,7 @@ public:
         : _dof_table(dof_table)
     {
         if (shapefunction_order < 1 || 2 < shapefunction_order)
-            OGS_FATAL("The given shape function order %d is not supported",
+            OGS_FATAL("The given shape function order {:d} is not supported",
                       shapefunction_order);
 
         if (shapefunction_order == 1)
@@ -288,7 +288,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration.",
                 type_idx.name());
diff --git a/ProcessLib/SmallDeformation/CreateLocalAssemblers.h b/ProcessLib/SmallDeformation/CreateLocalAssemblers.h
index a3e434221b164ff96c4c274a29db48dd69902691..89dccb7eb96c4a585e85c2252f02257d015d1381 100644
--- a/ProcessLib/SmallDeformation/CreateLocalAssemblers.h
+++ b/ProcessLib/SmallDeformation/CreateLocalAssemblers.h
@@ -11,7 +11,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
 
diff --git a/ProcessLib/SmallDeformation/CreateSmallDeformationProcess.cpp b/ProcessLib/SmallDeformation/CreateSmallDeformationProcess.cpp
index ca7bed6ffe9e4892d139bc544aee20305d56353b..0c2fbc56f1095c3ea4f7c9e793e7cc8c0bf77d94 100644
--- a/ProcessLib/SmallDeformation/CreateSmallDeformationProcess.cpp
+++ b/ProcessLib/SmallDeformation/CreateSmallDeformationProcess.cpp
@@ -50,15 +50,15 @@ std::unique_ptr<Process> createSmallDeformationProcess(
         {//! \ogs_file_param_special{prj__processes__process__SMALL_DEFORMATION__process_variables__process_variable}
          "process_variable"});
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          per_process_variables.back().get().getName().c_str());
 
     if (per_process_variables.back().get().getNumberOfComponents() !=
         DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             per_process_variables.back().get().getName().c_str(),
             per_process_variables.back().get().getNumberOfComponents(),
             DisplacementDim);
@@ -76,7 +76,7 @@ std::unique_ptr<Process> createSmallDeformationProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__SMALL_DEFORMATION__solid_density}
         "solid_density", parameters, 1, &mesh);
-    DBUG("Use '%s' as solid density parameter.", solid_density.name.c_str());
+    DBUG("Use '{:s}' as solid density parameter.", solid_density.name.c_str());
 
     // Specific body force
     Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
@@ -89,8 +89,8 @@ std::unique_ptr<Process> createSmallDeformationProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), DisplacementDim);
         }
 
diff --git a/ProcessLib/SmallDeformation/LocalDataInitializer.h b/ProcessLib/SmallDeformation/LocalDataInitializer.h
index dfa6299c3ffdcdefe4daab064e7050c40e7af4ad..719965d966c7c4db32cb50626ed1ae159eb7ba06 100644
--- a/ProcessLib/SmallDeformation/LocalDataInitializer.h
+++ b/ProcessLib/SmallDeformation/LocalDataInitializer.h
@@ -229,7 +229,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration or this process requires higher order elements.",
                 type_idx.name());
diff --git a/ProcessLib/SmallDeformation/SmallDeformationFEM.h b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
index 0d8c4d11dc1cccab3488a4f313a3dda4b573375c..187df453018f03db4710828297ebaaa57dbd94b0 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationFEM.h
+++ b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
@@ -170,8 +170,8 @@ public:
         {
             OGS_FATAL(
                 "Setting integration point initial conditions; The integration "
-                "order of the local assembler for element %d is different from "
-                "the integration order in the initial condition.",
+                "order of the local assembler for element {:d} is different "
+                "from the integration order in the initial condition.",
                 _element.getID());
         }
 
@@ -181,7 +181,7 @@ public:
             {
                 OGS_FATAL(
                     "Setting initial conditions for stress from integration "
-                    "point data and from a parameter '%s' is not possible "
+                    "point data and from a parameter '{:s}' is not possible "
                     "simultaneously.",
                     _process_data.initial_stress->name.c_str());
             }
diff --git a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
index 45378644dc36f5730a8e1cf3e01cb4b29bc5eef5..cf28cba0a1db39937e09c171c5114c4e9fe8df19 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
+++ b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
@@ -164,8 +164,8 @@ void SmallDeformationProcess<DisplacementDim>::initializeConcreteProcess(
         if (ip_meta_data.n_components != mesh_property.getNumberOfComponents())
         {
             OGS_FATAL(
-                "Different number of components in meta data (%d) than in "
-                "the integration point field data for '%s': %d.",
+                "Different number of components in meta data ({:d}) than in "
+                "the integration point field data for '{:s}': {:d}.",
                 ip_meta_data.n_components, name.c_str(),
                 mesh_property.getNumberOfComponents());
         }
diff --git a/ProcessLib/SmallDeformationNonlocal/CreateSmallDeformationNonlocalProcess.cpp b/ProcessLib/SmallDeformationNonlocal/CreateSmallDeformationNonlocalProcess.cpp
index 07f37bf827ba8a4174f4e5934d642bf5b0dbb3ad..4c362b8d90ebf353e9aa89073d6993c5d3dce0ec 100644
--- a/ProcessLib/SmallDeformationNonlocal/CreateSmallDeformationNonlocalProcess.cpp
+++ b/ProcessLib/SmallDeformationNonlocal/CreateSmallDeformationNonlocalProcess.cpp
@@ -50,15 +50,15 @@ std::unique_ptr<Process> createSmallDeformationNonlocalProcess(
         {//! \ogs_file_param_special{prj__processes__process__SMALL_DEFORMATION_NONLOCAL__process_variables__process_variable}
          "process_variable"});
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          per_process_variables.back().get().getName().c_str());
 
     if (per_process_variables.back().get().getNumberOfComponents() !=
         DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             per_process_variables.back().get().getName().c_str(),
             per_process_variables.back().get().getNumberOfComponents(),
             DisplacementDim);
@@ -76,7 +76,7 @@ std::unique_ptr<Process> createSmallDeformationNonlocalProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__SMALL_DEFORMATION_NONLOCAL__solid_density}
         "solid_density", parameters, 1, &mesh);
-    DBUG("Use '%s' as solid density parameter.", solid_density.name.c_str());
+    DBUG("Use '{:s}' as solid density parameter.", solid_density.name.c_str());
 
     // Specific body force
     Eigen::Matrix<double, DisplacementDim, 1> specific_body_force;
@@ -89,8 +89,8 @@ std::unique_ptr<Process> createSmallDeformationNonlocalProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), DisplacementDim);
         }
 
diff --git a/ProcessLib/SmallDeformationNonlocal/Damage.h b/ProcessLib/SmallDeformationNonlocal/Damage.h
index e3b495d5e182c222373c0cfa4776a2cacefcc391..d1e08e32ea6eced6322b16748040d3087c8301f6 100644
--- a/ProcessLib/SmallDeformationNonlocal/Damage.h
+++ b/ProcessLib/SmallDeformationNonlocal/Damage.h
@@ -10,8 +10,9 @@
 
 #pragma once
 
+#include <spdlog/spdlog.h>
+
 #include <Eigen/Eigenvalues>
-#include <logog/include/logog.hpp>
 
 #include "MaterialLib/SolidModels/Ehlers.h"
 
@@ -28,7 +29,7 @@ inline double calculateDamage(double const kappa_d, double const alpha_d,
 
     if (damage < 0. || damage >= 1.)
     {
-        OGS_FATAL("Damage value %g outside of [0,1) interval.", damage);
+        OGS_FATAL("Damage value {:g} outside of [0,1) interval.", damage);
     }
 
     return damage;
diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
index e68074db2d9c2d089da89df8f6b49ff116ac3bb2..18cf1aacdece4e81fdcbebc72e7a634a89676aa2 100644
--- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
+++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
@@ -150,8 +150,8 @@ public:
         {
             OGS_FATAL(
                 "Setting integration point initial conditions; The integration "
-                "order of the local assembler for element %d is different from "
-                "the integration order in the initial condition.",
+                "order of the local assembler for element {:d} is different "
+                "from the integration order in the initial condition.",
                 _element.getID());
         }
 
@@ -177,7 +177,7 @@ public:
             {
                 OGS_FATAL(
                     "CellData for kappa_d initial conditions has wrong number "
-                    "of components. 1 expected, got %d.",
+                    "of components. 1 expected, got {:d}.",
                     value.size());
             }
             setKappaD(value[0]);
diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
index 800ec956fae7871cd0ea19f7fe031dfe5717965b..fe0ebec10689b4267adc5c6d3efc5f17d56b8ee8 100644
--- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
+++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
@@ -167,8 +167,9 @@ void SmallDeformationNonlocalProcess<DisplacementDim>::
                 mesh_property.getNumberOfComponents())
             {
                 OGS_FATAL(
-                    "Different number of components in meta data (%d) than in "
-                    "the integration point field data for '%s': %d.",
+                    "Different number of components in meta data ({:d}) than "
+                    "in "
+                    "the integration point field data for '{:s}': {:d}.",
                     ip_meta_data.n_components, name.c_str(),
                     mesh_property.getNumberOfComponents());
             }
@@ -327,7 +328,7 @@ SmallDeformationNonlocalProcess<DisplacementDim>::postIterationConcreteProcess(
         pv.getActiveElementIDs(), *_local_to_global_index_map, x,
         _process_data.crack_volume);
 
-    INFO("Integral of crack: %g", _process_data.crack_volume);
+    INFO("Integral of crack: {:g}", _process_data.crack_volume);
 
     return NumLib::IterationResult::SUCCESS;
 }
diff --git a/ProcessLib/SourceTerms/CreateLineSourceTerm.cpp b/ProcessLib/SourceTerms/CreateLineSourceTerm.cpp
index 7c35c39d8d887a42f3bcf61797c134321656cc01..e616b93b79ace99d82f87679c68a9c36f0c02ac4 100644
--- a/ProcessLib/SourceTerms/CreateLineSourceTerm.cpp
+++ b/ProcessLib/SourceTerms/CreateLineSourceTerm.cpp
@@ -38,7 +38,7 @@ std::unique_ptr<SourceTerm> createLineSourceTerm(
     auto& line_source_term = ParameterLib::findParameter<double>(
         line_source_term_parameter_name, parameters, 1, &source_term_mesh);
 
-    DBUG("Using '%s' as line source term parameter.",
+    DBUG("Using '{:s}' as line source term parameter.",
          line_source_term.name.c_str());
 
     return std::make_unique<LineSourceTerm>(
diff --git a/ProcessLib/SourceTerms/CreateNodalSourceTerm.cpp b/ProcessLib/SourceTerms/CreateNodalSourceTerm.cpp
index 1ca28d9ffd5dfaec29089eac5a31c0ac2ff1ca11..8bcd02e2c6dd27d3822451abfa6a59ada6655200 100644
--- a/ProcessLib/SourceTerms/CreateNodalSourceTerm.cpp
+++ b/ProcessLib/SourceTerms/CreateNodalSourceTerm.cpp
@@ -10,7 +10,7 @@
 
 #include "CreateNodalSourceTerm.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "ParameterLib/Utils.h"
@@ -32,7 +32,7 @@ std::unique_ptr<SourceTerm> createNodalSourceTerm(
 
     //! \ogs_file_param{prj__process_variables__process_variable__source_terms__source_term__Nodal__parameter}
     auto const param_name = config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s as nodal source term.", param_name.c_str());
+    DBUG("Using parameter {:s} as nodal source term.", param_name.c_str());
 
     auto& param = ParameterLib::findParameter<double>(param_name, parameters, 1,
                                                       &st_mesh);
diff --git a/ProcessLib/SourceTerms/CreateSourceTerm.cpp b/ProcessLib/SourceTerms/CreateSourceTerm.cpp
index 4dee77dd747d95b125b5feebde320ec1dbd88207..0f0b3c5f48a0be3ec680105a00dff588428f0a7f 100644
--- a/ProcessLib/SourceTerms/CreateSourceTerm.cpp
+++ b/ProcessLib/SourceTerms/CreateSourceTerm.cpp
@@ -38,8 +38,8 @@ std::unique_ptr<SourceTerm> createSourceTerm(
             dof_table_bulk.getNumberOfVariableComponents(variable_id))
     {
         OGS_FATAL(
-            "Variable id or component id too high. Actual values: (%d, "
-            "%d), maximum values: (%d, %d).",
+            "Variable id or component id too high. Actual values: ({:d}, "
+            "{:d}), maximum values: ({:d}, {:d}).",
             variable_id, *config.component_id,
             dof_table_bulk.getNumberOfVariables(),
             dof_table_bulk.getNumberOfVariableComponents(variable_id));
@@ -50,14 +50,15 @@ std::unique_ptr<SourceTerm> createSourceTerm(
     {
         OGS_FATAL(
             "The required bulk node ids map does not exist in the "
-            "source term mesh '%s'.",
+            "source term mesh '{:s}'.",
             source_term_mesh.getName().c_str());
     }
     std::vector<MeshLib::Node*> const& source_term_nodes =
         source_term_mesh.getNodes();
     DBUG(
-        "Found %d nodes for source term at mesh '%s' for the variable %d and "
-        "component %d",
+        "Found {:d} nodes for source term at mesh '{:s}' for the variable {:d} "
+        "and "
+        "component {:d}",
         source_term_nodes.size(), source_term_mesh.getName().c_str(),
         variable_id, *config.component_id);
 
@@ -120,7 +121,6 @@ std::unique_ptr<SourceTerm> createSourceTerm(
 #endif
     }
 
-
-    OGS_FATAL("Unknown source term type: `%s'.", type.c_str());
+    OGS_FATAL("Unknown source term type: `{:s}'.", type.c_str());
 }
 }  // namespace ProcessLib
diff --git a/ProcessLib/SourceTerms/CreateVolumetricSourceTerm.cpp b/ProcessLib/SourceTerms/CreateVolumetricSourceTerm.cpp
index aee2fc163d7e2169cae1cf5fff0e87907990f55d..127bf7c1ed40cea08516d5c7e9ad837aa2fc9d1a 100644
--- a/ProcessLib/SourceTerms/CreateVolumetricSourceTerm.cpp
+++ b/ProcessLib/SourceTerms/CreateVolumetricSourceTerm.cpp
@@ -38,7 +38,7 @@ std::unique_ptr<SourceTerm> createVolumetricSourceTerm(
         volumetric_source_term_parameter_name, parameters, 1,
         &source_term_mesh);
 
-    DBUG("Using '%s' as volumetric source term parameter.",
+    DBUG("Using '{:s}' as volumetric source term parameter.",
          volumetric_source_term.name.c_str());
 
     return std::make_unique<VolumetricSourceTerm>(
diff --git a/ProcessLib/SourceTerms/Python/CMakeLists.txt b/ProcessLib/SourceTerms/Python/CMakeLists.txt
index 0406ad087e4ef2451382a5eb08d39feb307d3ea0..90cfd48520beb028400af4e550eb41bb8cb8eee5 100644
--- a/ProcessLib/SourceTerms/Python/CMakeLists.txt
+++ b/ProcessLib/SourceTerms/Python/CMakeLists.txt
@@ -8,14 +8,10 @@ ogs_add_library(ProcessLibSourceTermPython
 
 target_compile_definitions(ProcessLibSourceTermPython PUBLIC OGS_USE_PYTHON)
 
-target_link_libraries(ProcessLibSourceTermPython
-                      PUBLIC BaseLib
-                             MathLib
-                             MeshLib
-                             NumLib
-                             logog
-                             ${Python3_LIBRARIES}
-                      PRIVATE pybind11::pybind11)
+target_link_libraries(
+    ProcessLibSourceTermPython
+    PUBLIC BaseLib MathLib MeshLib NumLib ${Python3_LIBRARIES}
+    PRIVATE pybind11::pybind11 spdlog::spdlog)
 
 # For the embedded Python module
 ogs_add_library(ProcessLibSourceTermPythonModule PythonSourceTermModule.cpp
diff --git a/ProcessLib/SourceTerms/Python/CreatePythonSourceTerm.cpp b/ProcessLib/SourceTerms/Python/CreatePythonSourceTerm.cpp
index c09eef6e82344cc395063d4311335e3d1da9a7f0..c5dc819bac6d1279c0b474fe04bfab2b3c62fe71 100644
--- a/ProcessLib/SourceTerms/Python/CreatePythonSourceTerm.cpp
+++ b/ProcessLib/SourceTerms/Python/CreatePythonSourceTerm.cpp
@@ -44,7 +44,8 @@ std::unique_ptr<SourceTerm> createPythonSourceTerm(
     if (!scope.contains(source_term_object))
     {
         OGS_FATAL(
-            "Function `%s' is not defined in the python script file, or there "
+            "Function `{:s}' is not defined in the python script file, or "
+            "there "
             "was no python script file specified.",
             source_term_object.c_str());
     }
diff --git a/ProcessLib/SourceTerms/Python/PythonSourceTerm.cpp b/ProcessLib/SourceTerms/Python/PythonSourceTerm.cpp
index faaadf249d497bf9549d9a037ab205f3576f5b53..1d5127363841f80b922e2a66f5520766cef336a8 100644
--- a/ProcessLib/SourceTerms/Python/PythonSourceTerm.cpp
+++ b/ProcessLib/SourceTerms/Python/PythonSourceTerm.cpp
@@ -34,7 +34,7 @@ public:
             return;
         }
 
-        LOGOG_COUT << std::flush;
+        std::cout << std::flush;
     }
 
     //! Optionally flushes Python's stdout after running Python code.
diff --git a/ProcessLib/SourceTerms/Python/PythonSourceTermLocalAssembler.h b/ProcessLib/SourceTerms/Python/PythonSourceTermLocalAssembler.h
index 1e5c7e3316cb32dc715e23abf14cd466932a3b63..afa1c555a3fb2651c9b1a3f5140a67dd214257bc 100644
--- a/ProcessLib/SourceTerms/Python/PythonSourceTermLocalAssembler.h
+++ b/ProcessLib/SourceTerms/Python/PythonSourceTermLocalAssembler.h
@@ -130,7 +130,8 @@ public:
                     {
                         // TODO extend Python BC to mixed FEM ansatz functions
                         OGS_FATAL(
-                            "No d.o.f. found for (node=%d, var=%d, comp=%d).  "
+                            "No d.o.f. found for (node={:d}, var={:d}, "
+                            "comp={:d}).  "
                             "That might be due to the use of mixed FEM ansatz "
                             "functions, which is currently not supported by "
                             "the implementation of Python BCs. That excludes, "
@@ -172,8 +173,8 @@ public:
                 // assembly.
                 OGS_FATAL(
                     "The Python source term must return the derivative of "
-                    "the flux w.r.t. each primary variable. %d components "
-                    "expected. %d components returned from Python.",
+                    "the flux w.r.t. each primary variable. {:d} components "
+                    "expected. {:d} components returned from Python.",
                     num_comp_total, dflux.size());
             }
 
diff --git a/ProcessLib/SurfaceFlux/SurfaceFluxData.h b/ProcessLib/SurfaceFlux/SurfaceFluxData.h
index c576b94ec9120b0ef28e8f0d8cb32103824c93da..d103e7a7e0eda75d56ebd251b6214d1414333079 100644
--- a/ProcessLib/SurfaceFlux/SurfaceFluxData.h
+++ b/ProcessLib/SurfaceFlux/SurfaceFluxData.h
@@ -10,11 +10,11 @@
 
 #pragma once
 
-#include <logog/include/logog.hpp>
-
 #include <memory>
 #include <string>
 
+#include "BaseLib/FileTools.h"
+#include "BaseLib/Logging.h"
 #include "MeshLib/IO/readMeshFromFile.h"
 // TODO used for output, if output classes are ready this has to be changed
 #include "MeshLib/IO/writeMeshToFile.h"
@@ -42,8 +42,9 @@ struct SurfaceFluxData
           output_mesh_file_name(std::move(surfaceflux_output_mesh_file_name))
     {
         DBUG(
-            "read surfaceflux meta data:\n\tsurfaceflux mesh:'%s'\n\tproperty "
-            "name: '%s'\n\toutput to: '%s'",
+            "read surfaceflux meta data:\n\tsurfaceflux "
+            "mesh:'{:s}'\n\tproperty "
+            "name: '{:s}'\n\toutput to: '{:s}'",
             mesh_name.c_str(), property_vector_name.c_str(),
             output_mesh_file_name.c_str());
     }
diff --git a/ProcessLib/TES/TESLocalAssemblerInner-impl.h b/ProcessLib/TES/TESLocalAssemblerInner-impl.h
index 879c16d4077edfd66d0eba0c8b7af493b809637e..57e09e391faaa030f85718a05d93921282764e24 100644
--- a/ProcessLib/TES/TESLocalAssemblerInner-impl.h
+++ b/ProcessLib/TES/TESLocalAssemblerInner-impl.h
@@ -13,7 +13,7 @@
 
 #pragma once
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/Function/Interpolation.h"
 
diff --git a/ProcessLib/TES/TESProcess.cpp b/ProcessLib/TES/TESProcess.cpp
index b1537e7e9757923dc5362d98ef31ac0be74dc553..191f8593bd9e2085ad2ff52bd736948198c99e6b 100644
--- a/ProcessLib/TES/TESProcess.cpp
+++ b/ProcessLib/TES/TESProcess.cpp
@@ -65,8 +65,8 @@ TESProcess::TESProcess(
                     //! \ogs_file_special
                     config.getConfigParameterOptional<double>(p.first))
             {
-                DBUG("setting parameter `%s' to value `%g'", p.first.c_str(),
-                     *par);
+                DBUG("setting parameter `{:s}' to value `{:g}'",
+                     p.first.c_str(), *par);
                 *p.second = *par;
             }
         }
@@ -88,8 +88,8 @@ TESProcess::TESProcess(
                     //! \ogs_file_special
                     config.getConfigParameterOptional<double>(p.first))
             {
-                INFO("setting parameter `%s' to value `%g'", p.first.c_str(),
-                     *par);
+                INFO("setting parameter `{:s}' to value `{:g}'",
+                     p.first.c_str(), *par);
                 *p.second = Trafo{*par};
             }
         }
@@ -102,7 +102,7 @@ TESProcess::TESProcess(
     {
         DBUG(
             "setting parameter `solid_hydraulic_permeability' to isotropic "
-            "value `%g'",
+            "value `{:g}'",
             *par);
         const auto dim = mesh.getDimension();
         _assembly_params.solid_perm_tensor =
@@ -119,7 +119,7 @@ TESProcess::TESProcess(
             //! \ogs_file_param{prj__processes__process__TES__output_element_matrices}
             config.getConfigParameterOptional<bool>("output_element_matrices"))
     {
-        DBUG("output_element_matrices: %s", (*param) ? "true" : "false");
+        DBUG("output_element_matrices: {:s}", (*param) ? "true" : "false");
 
         _assembly_params.output_element_matrices = *param;
     }
@@ -130,7 +130,7 @@ TESProcess::TESProcess(
     //! \ogs_file_param{prj__processes__process__TES__output_global_matrix}
     config.getConfigParameterOptional<bool>("output_global_matrix"))
     {
-        DBUG("output_global_matrix: %s", (*param) ? "true" : "false");
+        DBUG("output_global_matrix: {:s}", (*param) ? "true" : "false");
 
         this->_process_output.output_global_matrix = *param;
     }
@@ -307,7 +307,7 @@ NumLib::IterationResult TESProcess::postIterationConcreteProcess(
     }
 
     // TODO remove
-    DBUG("ts %lu iteration %lu (in current ts: %lu) try %u accepted",
+    DBUG("ts {:d} iteration {:d} (in current ts: {:d}) try {:d} accepted",
          _assembly_params.timestep, _assembly_params.total_iteration,
          _assembly_params.iteration_in_current_timestep,
          _assembly_params.number_of_try_of_iteration);
diff --git a/ProcessLib/TES/TESReactionAdaptor.cpp b/ProcessLib/TES/TESReactionAdaptor.cpp
index bec12f56709835c7e6d860a0f7a9f33c0d8a0a18..94c3ac4651aacee33948e63e5a226cde9429cd1f 100644
--- a/ProcessLib/TES/TESReactionAdaptor.cpp
+++ b/ProcessLib/TES/TESReactionAdaptor.cpp
@@ -10,7 +10,7 @@
 
 #include <cassert>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MathLib/Nonlinear/Root1D.h"
 #include "MathLib/ODE/ODESolverBuilder.h"
diff --git a/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPMaterialProperties.cpp b/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPMaterialProperties.cpp
index 124fceffeea375b2b70254470534e2d93109c043..1b3cc617c3eaaac5a114bb1b2edc2f7d26201480 100644
--- a/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPMaterialProperties.cpp
+++ b/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPMaterialProperties.cpp
@@ -10,8 +10,8 @@
 
 #include "CreateThermalTwoPhaseFlowWithPPMaterialProperties.h"
 
-#include <logog/include/logog.hpp>
 #include <tuple>
+#include "BaseLib/Logging.h"
 
 #include "MaterialLib/Fluid/FluidProperty.h"
 #include "MaterialLib/Fluid/SpecificHeatCapacity/CreateSpecificFluidHeatCapacityModel.h"
diff --git a/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPProcess.cpp b/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPProcess.cpp
index 5cb158103f65c469c3db49ef4c0a0cbdd90808be..8dc554241a71365df7cefef9ac2016bb84d316d0 100644
--- a/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPProcess.cpp
+++ b/ProcessLib/ThermalTwoPhaseFlowWithPP/CreateThermalTwoPhaseFlowWithPPProcess.cpp
@@ -89,14 +89,14 @@ std::unique_ptr<Process> createThermalTwoPhaseFlowWithPPProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__TWOPHASE_FLOW_THERMAL__density_solid}
         "density_solid", parameters, 1, &mesh);
-    DBUG("Use '%s' as density_solid parameter.", density_solid.name.c_str());
+    DBUG("Use '{:s}' as density_solid parameter.", density_solid.name.c_str());
 
     // Parameter for the latent heat of evaporation.
     auto& latent_heat_evaporation = ParameterLib::findParameter<double>(
         config,
         //! \ogs_file_param_special{prj__processes__process__TWOPHASE_FLOW_THERMAL__latent_heat_evaporation}
         "latent_heat_evaporation", parameters, 1, &mesh);
-    DBUG("Use '%s' as latent_heat_evaporation parameter.",
+    DBUG("Use '{:s}' as latent_heat_evaporation parameter.",
          latent_heat_evaporation.name.c_str());
 
     //! \ogs_file_param{prj__processes__process__TWOPHASE_FLOW_THERMAL__material_property}
diff --git a/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPMaterialProperties.cpp b/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPMaterialProperties.cpp
index 7b734822a3d86abf020c899a661eca4c163f4220..dd1596465a9a8a420b73dc71c567a562f92e984d 100644
--- a/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPMaterialProperties.cpp
+++ b/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPMaterialProperties.cpp
@@ -10,7 +10,7 @@
 
 #include "ThermalTwoPhaseFlowWithPPMaterialProperties.h"
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "MaterialLib/Fluid/FluidProperty.h"
 #include "MaterialLib/PorousMedium/Porosity/Porosity.h"
diff --git a/ProcessLib/ThermoHydroMechanics/CreateLocalAssemblers.h b/ProcessLib/ThermoHydroMechanics/CreateLocalAssemblers.h
index 891708b2e738a0d4230782bab658290b56774de4..a4e349a62267121f06e94aa633748015fbb99f7b 100644
--- a/ProcessLib/ThermoHydroMechanics/CreateLocalAssemblers.h
+++ b/ProcessLib/ThermoHydroMechanics/CreateLocalAssemblers.h
@@ -9,13 +9,12 @@
 
 #pragma once
 
-#include <vector>
-
-#include <logog/include/logog.hpp>
+#include <spdlog/spdlog.h>
 
-#include "NumLib/DOF/LocalToGlobalIndexMap.h"
+#include <vector>
 
 #include "LocalDataInitializer.h"
+#include "NumLib/DOF/LocalToGlobalIndexMap.h"
 
 namespace ProcessLib
 {
diff --git a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp
index a0d7118f78d1829574eb170650a125c1e22bca10..e6ff892c8f08ea122a4b7f14405c6c7c19f7a0d0 100644
--- a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp
+++ b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp
@@ -89,37 +89,37 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess(
         variable_u = &process_variables[2][0].get();
     }
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          variable_u->getName().c_str());
 
     if (variable_u->getNumberOfComponents() != DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             variable_u->getName().c_str(),
             variable_u->getNumberOfComponents(),
             DisplacementDim);
     }
 
-    DBUG("Associate pressure with process variable '%s'.",
+    DBUG("Associate pressure with process variable '{:s}'.",
          variable_p->getName().c_str());
     if (variable_p->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "Pressure process variable '%s' is not a scalar variable but has "
-            "%d components.",
+            "Pressure process variable '{:s}' is not a scalar variable but has "
+            "{:d} components.",
             variable_p->getName().c_str(),
             variable_p->getNumberOfComponents());
     }
 
-    DBUG("Associate temperature with process variable '%s'.",
+    DBUG("Associate temperature with process variable '{:s}'.",
          variable_T->getName().c_str());
     if (variable_T->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "temperature process variable '%s' is not a scalar variable but "
-            "has %d components.",
+            "temperature process variable '{:s}' is not a scalar variable but "
+            "has {:d} components.",
             variable_T->getName().c_str(),
             variable_T->getNumberOfComponents());
     }
@@ -133,7 +133,7 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_HYDRO_MECHANICS__reference_temperature}
         "reference_temperature", parameters, 1, &mesh);
-    DBUG("Use '%s' as reference temperature parameter.",
+    DBUG("Use '{:s}' as reference temperature parameter.",
          reference_temperature.name.c_str());
 
     // Specific body force
@@ -147,8 +147,8 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), DisplacementDim);
         }
 
diff --git a/ProcessLib/ThermoHydroMechanics/LocalDataInitializer.h b/ProcessLib/ThermoHydroMechanics/LocalDataInitializer.h
index 531230d06c640095c28971e9a2583ddc997be493..856c30309960d807721ad82189d9a443a43040c0 100644
--- a/ProcessLib/ThermoHydroMechanics/LocalDataInitializer.h
+++ b/ProcessLib/ThermoHydroMechanics/LocalDataInitializer.h
@@ -128,7 +128,7 @@ public:
         : _dof_table(dof_table)
     {
         if (shapefunction_order < 1 || 2 < shapefunction_order)
-            OGS_FATAL("The given shape function order %d is not supported",
+            OGS_FATAL("The given shape function order {:d} is not supported",
                       shapefunction_order);
 
         if (shapefunction_order == 1)
@@ -288,7 +288,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration.",
                 type_idx.name());
diff --git a/ProcessLib/ThermoMechanicalPhaseField/CreateThermoMechanicalPhaseFieldProcess.cpp b/ProcessLib/ThermoMechanicalPhaseField/CreateThermoMechanicalPhaseFieldProcess.cpp
index fff64ddbad753b43ed1dff3c181604ecd7575a52..ecde722f9678187fb73a90ae82b85acdda5871d1 100644
--- a/ProcessLib/ThermoMechanicalPhaseField/CreateThermoMechanicalPhaseFieldProcess.cpp
+++ b/ProcessLib/ThermoMechanicalPhaseField/CreateThermoMechanicalPhaseFieldProcess.cpp
@@ -78,38 +78,39 @@ std::unique_ptr<Process> createThermoMechanicalPhaseFieldProcess(
     ProcessVariable* variable_ph =
         &process_variables[process_variables.size() - 1][0].get();
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          variable_u->getName().c_str());
 
     if (variable_u->getNumberOfComponents() != DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             variable_u->getName().c_str(),
             variable_u->getNumberOfComponents(),
             DisplacementDim);
     }
 
-    DBUG("Associate phase field with process variable '%s'.",
+    DBUG("Associate phase field with process variable '{:s}'.",
          variable_ph->getName().c_str());
     if (variable_ph->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "Phasefield process variable '%s' is not a scalar variable but has "
-            "%d components.",
+            "Phasefield process variable '{:s}' is not a scalar variable but "
+            "has "
+            "{:d} components.",
             variable_ph->getName().c_str(),
             variable_ph->getNumberOfComponents());
     }
 
-    DBUG("Associate temperature with process variable '%s'.",
+    DBUG("Associate temperature with process variable '{:s}'.",
          variable_T->getName().c_str());
     if (variable_T->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "Temperature process variable '%s' is not a scalar variable but "
+            "Temperature process variable '{:s}' is not a scalar variable but "
             "has "
-            "%d components.",
+            "{:d} components.",
             variable_T->getName().c_str(),
             variable_T->getNumberOfComponents());
     }
@@ -131,35 +132,36 @@ std::unique_ptr<Process> createThermoMechanicalPhaseFieldProcess(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__phasefield_parameters__residual_stiffness}
         "residual_stiffness", parameters, 1, &mesh);
-    DBUG("Use '%s' as residual stiffness.", residual_stiffness.name.c_str());
+    DBUG("Use '{:s}' as residual stiffness.", residual_stiffness.name.c_str());
 
     // Crack resistance
     auto& crack_resistance = ParameterLib::findParameter<double>(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__phasefield_parameters__crack_resistance}
         "crack_resistance", parameters, 1, &mesh);
-    DBUG("Use '%s' as crack resistance.", crack_resistance.name.c_str());
+    DBUG("Use '{:s}' as crack resistance.", crack_resistance.name.c_str());
 
     // Crack length scale
     auto& crack_length_scale = ParameterLib::findParameter<double>(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__phasefield_parameters__crack_length_scale}
         "crack_length_scale", parameters, 1, &mesh);
-    DBUG("Use '%s' as crack length scale.", crack_length_scale.name.c_str());
+    DBUG("Use '{:s}' as crack length scale.", crack_length_scale.name.c_str());
 
     // Kinetic coefficient
     auto& kinetic_coefficient = ParameterLib::findParameter<double>(
         phasefield_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__phasefield_parameters__kinetic_coefficient}
         "kinetic_coefficient", parameters, 1, &mesh);
-    DBUG("Use '%s' as kinetic coefficient.", kinetic_coefficient.name.c_str());
+    DBUG("Use '{:s}' as kinetic coefficient.",
+         kinetic_coefficient.name.c_str());
 
     // Solid density
     auto& solid_density = ParameterLib::findParameter<double>(
         config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__reference_solid_density}
         "solid_density", parameters, 1, &mesh);
-    DBUG("Use '%s' as solid density parameter.", solid_density.name.c_str());
+    DBUG("Use '{:s}' as solid density parameter.", solid_density.name.c_str());
 
     // Linear thermal expansion coefficient
     auto& linear_thermal_expansion_coefficient = ParameterLib::findParameter<
@@ -167,7 +169,7 @@ std::unique_ptr<Process> createThermoMechanicalPhaseFieldProcess(
         thermal_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__thermal_parameters__linear_thermal_expansion_coefficient}
         "linear_thermal_expansion_coefficient", parameters, 1, &mesh);
-    DBUG("Use '%s' as linear thermal expansion coefficient.",
+    DBUG("Use '{:s}' as linear thermal expansion coefficient.",
          linear_thermal_expansion_coefficient.name.c_str());
 
     // Specific heat capacity
@@ -175,7 +177,7 @@ std::unique_ptr<Process> createThermoMechanicalPhaseFieldProcess(
         thermal_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__thermal_parameters__specific_heat_capacity}
         "specific_heat_capacity", parameters, 1, &mesh);
-    DBUG("Use '%s' as specific heat capacity.",
+    DBUG("Use '{:s}' as specific heat capacity.",
          specific_heat_capacity.name.c_str());
 
     // Thermal conductivity
@@ -183,14 +185,14 @@ std::unique_ptr<Process> createThermoMechanicalPhaseFieldProcess(
         thermal_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__thermal_parameters__thermal_conductivity}
         "thermal_conductivity", parameters, 1, &mesh);
-    DBUG("Use '%s' as thermal conductivity parameter.",
+    DBUG("Use '{:s}' as thermal conductivity parameter.",
          thermal_conductivity.name.c_str());
     // Residual thermal conductivity
     auto& residual_thermal_conductivity = ParameterLib::findParameter<double>(
         thermal_parameters_config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICAL_PHASE_FIELD__thermal_parameters__residual_thermal_conductivity}
         "residual_thermal_conductivity", parameters, 1, &mesh);
-    DBUG("Use '%s' as residual thermal conductivity parameter.",
+    DBUG("Use '{:s}' as residual thermal conductivity parameter.",
          residual_thermal_conductivity.name.c_str());
     // Reference temperature
     const auto reference_temperature =
@@ -208,8 +210,8 @@ std::unique_ptr<Process> createThermoMechanicalPhaseFieldProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 specific_body_force.size(), DisplacementDim);
         }
 
diff --git a/ProcessLib/ThermoMechanics/CreateThermoMechanicsProcess.cpp b/ProcessLib/ThermoMechanics/CreateThermoMechanicsProcess.cpp
index 58ff41e47621c331ca382ae1b3641c0181d63afc..d870ca24a02b977e4f4d40f5f19060a086735f0d 100644
--- a/ProcessLib/ThermoMechanics/CreateThermoMechanicsProcess.cpp
+++ b/ProcessLib/ThermoMechanics/CreateThermoMechanicsProcess.cpp
@@ -88,26 +88,26 @@ std::unique_ptr<Process> createThermoMechanicsProcess(
         mechanics_process_id = 1;
     }
 
-    DBUG("Associate displacement with process variable '%s'.",
+    DBUG("Associate displacement with process variable '{:s}'.",
          variable_u->getName().c_str());
 
     if (variable_u->getNumberOfComponents() != DisplacementDim)
     {
         OGS_FATAL(
-            "Number of components of the process variable '%s' is different "
-            "from the displacement dimension: got %d, expected %d",
+            "Number of components of the process variable '{:s}' is different "
+            "from the displacement dimension: got {:d}, expected {:d}",
             variable_u->getName().c_str(),
             variable_u->getNumberOfComponents(),
             DisplacementDim);
     }
 
-    DBUG("Associate temperature with process variable '%s'.",
+    DBUG("Associate temperature with process variable '{:s}'.",
          variable_T->getName().c_str());
     if (variable_T->getNumberOfComponents() != 1)
     {
         OGS_FATAL(
-            "Pressure process variable '%s' is not a scalar variable but has "
-            "%d components.",
+            "Pressure process variable '{:s}' is not a scalar variable but has "
+            "{:d} components.",
             variable_T->getName().c_str(),
             variable_T->getNumberOfComponents());
     }
@@ -123,7 +123,7 @@ std::unique_ptr<Process> createThermoMechanicsProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICS__reference_solid_density}
         "reference_solid_density", parameters, 1, &mesh);
-    DBUG("Use '%s' as solid density parameter.",
+    DBUG("Use '{:s}' as solid density parameter.",
          reference_solid_density.name.c_str());
 
     // Linear thermal expansion coefficient
@@ -132,21 +132,21 @@ std::unique_ptr<Process> createThermoMechanicsProcess(
         config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICS__linear_thermal_expansion_coefficient}
         "linear_thermal_expansion_coefficient", parameters, 1, &mesh);
-    DBUG("Use '%s' as linear thermal expansion coefficient.",
+    DBUG("Use '{:s}' as linear thermal expansion coefficient.",
          linear_thermal_expansion_coefficient.name.c_str());
     // Specific heat capacity
     auto& specific_heat_capacity = ParameterLib::findParameter<double>(
         config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICS__specific_heat_capacity}
         "specific_heat_capacity", parameters, 1, &mesh);
-    DBUG("Use '%s' as specific heat capacity parameter.",
+    DBUG("Use '{:s}' as specific heat capacity parameter.",
          specific_heat_capacity.name.c_str());
     // Thermal conductivity // TODO To be changed as tensor input.
     auto& thermal_conductivity = ParameterLib::findParameter<double>(
         config,
         //! \ogs_file_param_special{prj__processes__process__THERMO_MECHANICS__thermal_conductivity}
         "thermal_conductivity", parameters, 1, &mesh);
-    DBUG("Use '%s' as thermal conductivity parameter.",
+    DBUG("Use '{:s}' as thermal conductivity parameter.",
          thermal_conductivity.name.c_str());
 
     // Specific body force
@@ -160,8 +160,8 @@ std::unique_ptr<Process> createThermoMechanicsProcess(
         {
             OGS_FATAL(
                 "The size of the specific body force vector does not match the "
-                "displacement dimension. Vector size is %d, displacement "
-                "dimension is %d",
+                "displacement dimension. Vector size is {:d}, displacement "
+                "dimension is {:d}",
                 b.size(), DisplacementDim);
         }
 
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h
index 151519d8522ac8477629325eec94fdfcccdd6b9a..3f0da00f734a5b075fb061c6f6c4e3d2aa895f92 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h
@@ -93,7 +93,7 @@ std::size_t ThermoMechanicsLocalAssembler<
     {
         OGS_FATAL(
             "Setting integration point initial conditions; The integration "
-            "order of the local assembler for element %d is different from "
+            "order of the local assembler for element {:d} is different from "
             "the integration order in the initial condition.",
             _element.getID());
     }
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
index aff022094cccb27c6bfb0acab3a403e5182d4926..ec56734caed55a2b9ba9fe15376bbea237cf1ed3 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
@@ -230,8 +230,8 @@ void ThermoMechanicsProcess<DisplacementDim>::initializeConcreteProcess(
         if (ip_meta_data.n_components != mesh_property.getNumberOfComponents())
         {
             OGS_FATAL(
-                "Different number of components in meta data (%d) than in "
-                "the integration point field data for '%s': %d.",
+                "Different number of components in meta data ({:d}) than in "
+                "the integration point field data for '{:s}': {:d}.",
                 ip_meta_data.n_components, name.c_str(),
                 mesh_property.getNumberOfComponents());
         }
diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp
index e14acebcb78a0bce09e4c6886e856f5862ff1ede..2c58ce687992957dadee27d2a21d51e8c3c4704f 100644
--- a/ProcessLib/TimeLoop.cpp
+++ b/ProcessLib/TimeLoop.cpp
@@ -366,7 +366,7 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t,
                                      std::numeric_limits<double>::epsilon())
             {
                 WARN(
-                    "Time step %d was rejected %d times "
+                    "Time step {:d} was rejected {:d} times "
                     "and it will be repeated with a reduced step size.",
                     accepted_steps + 1, _repeating_times_of_rejected_step);
                 time_disc->popState(x);
@@ -405,7 +405,7 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t,
         if (_last_step_rejected)
         {
             OGS_FATAL(
-                "The new step size of %g is the same as that of the previous "
+                "The new step size of {:g} is the same as that of the previous "
                 "rejected time step. \nPlease re-run ogs with a proper "
                 "adjustment in the numerical settings, \ne.g those for "
                 "time stepper, local or global non-linear solver.",
@@ -413,7 +413,7 @@ double TimeLoop::computeTimeStepping(const double prev_dt, double& t,
         }
         else
         {
-            DBUG("The time stepping is stabilized with the step size of %g.",
+            DBUG("The time stepping is stabilized with the step size of {:g}.",
                  dt);
         }
     }
@@ -455,7 +455,7 @@ void TimeLoop::initialize()
         BaseLib::RunTime time_phreeqc;
         time_phreeqc.start();
         _chemical_system->executeInitialCalculation(_process_solutions);
-        INFO("[time] Phreeqc took %g s.", time_phreeqc.elapsed());
+        INFO("[time] Phreeqc took {:g} s.", time_phreeqc.elapsed());
     }
 
     // All _per_process_data share the first process.
@@ -508,8 +508,9 @@ bool TimeLoop::loop()
 
         const std::size_t timesteps = accepted_steps + 1;
         // TODO(wenqing): , input option for time unit.
-        INFO("=== Time stepping at step #%u and time %g with step size %g",
-             timesteps, t, dt);
+        INFO(
+            "=== Time stepping at step #{:d} and time {:g} with step size {:g}",
+            timesteps, t, dt);
 
         // Check element deactivation:
         for (auto& process_data : _per_process_data)
@@ -536,7 +537,7 @@ bool TimeLoop::loop()
                 solveUncoupledEquationSystems(t, dt, timesteps);
         }
 
-        INFO("[time] Time step #%u took %g s.", timesteps,
+        INFO("[time] Time step #{:d} took {:g} s.", timesteps,
              time_timestep.elapsed());
 
         dt = computeTimeStepping(prev_dt, t, accepted_steps, rejected_steps);
@@ -557,16 +558,16 @@ bool TimeLoop::loop()
         if (dt < std::numeric_limits<double>::epsilon())
         {
             WARN(
-                "Time step size of %g is too small.\n"
-                "Time stepping stops at step %u and at time of %g.",
+                "Time step size of {:g} is too small.\n"
+                "Time stepping stops at step {:d} and at time of {:g}.",
                 dt, timesteps, t);
             break;
         }
     }
 
     INFO(
-        "The whole computation of the time stepping took %u steps, in which\n"
-        "\t the accepted steps are %u, and the rejected steps are %u.\n",
+        "The whole computation of the time stepping took {:d} steps, in which\n"
+        "\t the accepted steps are {:d}, and the rejected steps are {:d}.\n",
         accepted_steps + rejected_steps, accepted_steps, rejected_steps);
 
     // output last time step
@@ -605,7 +606,7 @@ static NumLib::NonlinearSolverStatus solveMonolithicProcess(
     auto const nonlinear_solver_status =
         solveOneTimeStepOneProcess(x, timestep_id, t, dt, process_data, output);
 
-    INFO("[time] Solving process #%u took %g s in time step #%u ",
+    INFO("[time] Solving process #{:d} took {:g} s in time step #{:d} ",
          process_data.process_id, time_timestep_process.elapsed(), timestep_id);
 
     return nonlinear_solver_status;
@@ -655,8 +656,9 @@ NumLib::NonlinearSolverStatus TimeLoop::solveUncoupledEquationSystems(
         process_data->nonlinear_solver_status = nonlinear_solver_status;
         if (!nonlinear_solver_status.error_norms_met)
         {
-            ERR("The nonlinear solver failed in time step #%u at t = %g s for "
-                "process #%u.",
+            ERR("The nonlinear solver failed in time step #{:d} at t = {:g} s "
+                "for "
+                "process #{:d}.",
                 timestep_id, t, process_id);
 
             if (!process_data->timestepper->canReduceTimestepSize())
@@ -725,15 +727,16 @@ TimeLoop::solveCoupledEquationSystemsByStaggeredScheme(
             process_data->nonlinear_solver_status = nonlinear_solver_status;
 
             INFO(
-                "[time] Solving process #%u took %g s in time step #%u "
-                " coupling iteration #%u",
+                "[time] Solving process #{:d} took {:g} s in time step #{:d} "
+                " coupling iteration #{:d}",
                 process_id, time_timestep_process.elapsed(), timestep_id,
                 global_coupling_iteration);
 
             if (!nonlinear_solver_status.error_norms_met)
             {
-                ERR("The nonlinear solver failed in time step #%u at t = %g s "
-                    "for process #%u.",
+                ERR("The nonlinear solver failed in time step #{:d} at t = "
+                    "{:g} s "
+                    "for process #{:d}.",
                     timestep_id, t, process_id);
 
                 if (!process_data->timestepper->canReduceTimestepSize())
@@ -782,7 +785,7 @@ TimeLoop::solveCoupledEquationSystemsByStaggeredScheme(
     {
         WARN(
             "The coupling iterations reaches its maximum number in time step"
-            "#%u at t = %g s",
+            "#{:d} at t = {:g} s",
             timestep_id, t);
     }
 
@@ -796,7 +799,7 @@ TimeLoop::solveCoupledEquationSystemsByStaggeredScheme(
         BaseLib::RunTime time_phreeqc;
         time_phreeqc.start();
         _chemical_system->doWaterChemistryCalculation(_process_solutions, dt);
-        INFO("[time] Phreeqc took %g s.", time_phreeqc.elapsed());
+        INFO("[time] Phreeqc took {:g} s.", time_phreeqc.elapsed());
     }
 
     postTimestepForAllProcesses(t, dt, _per_process_data, _process_solutions);
diff --git a/ProcessLib/TimeLoop.h b/ProcessLib/TimeLoop.h
index 0fb6c5527b36fe8439802ec8c98f9827636df776..792a7507abd8e57257312bb765103ff6965d6dc3 100644
--- a/ProcessLib/TimeLoop.h
+++ b/ProcessLib/TimeLoop.h
@@ -13,7 +13,7 @@
 #include <functional>
 #include <memory>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/ODESolver/NonlinearSolver.h"
 #include "NumLib/TimeStepping/Algorithms/TimeStepAlgorithm.h"
diff --git a/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp
index dc4f150508803b1e91d9b405f42c80f95bb734b8..f11fce34fb70ce3d8742ee2f16a1a40b900ae5c9 100644
--- a/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp
+++ b/ProcessLib/TwoPhaseFlowWithPrho/CreateTwoPhaseFlowPrhoMaterialProperties.cpp
@@ -9,8 +9,8 @@
  */
 
 #include "CreateTwoPhaseFlowPrhoMaterialProperties.h"
-#include <logog/include/logog.hpp>
 #include "BaseLib/Algorithm.h"
+#include "BaseLib/Logging.h"
 #include "MaterialLib/Fluid/FluidProperty.h"
 #include "MaterialLib/PorousMedium/Porosity/Porosity.h"
 #include "MaterialLib/PorousMedium/Storage/Storage.h"
diff --git a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp
index 2a4ae2113db9c31b75afc50983e9b43e8918f2fa..98ef4430bddb669c1f85f67bdee3ee89d6f51413 100644
--- a/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp
+++ b/ProcessLib/TwoPhaseFlowWithPrho/TwoPhaseFlowWithPrhoMaterialProperties.cpp
@@ -9,8 +9,8 @@
  */
 
 #include "TwoPhaseFlowWithPrhoMaterialProperties.h"
-#include <logog/include/logog.hpp>
 #include <utility>
+#include "BaseLib/Logging.h"
 #include "MaterialLib/Fluid/FluidProperty.h"
 #include "MaterialLib/PorousMedium/Porosity/Porosity.h"
 #include "MaterialLib/PorousMedium/Storage/Storage.h"
diff --git a/ProcessLib/Utils/CreateLocalAssemblers.h b/ProcessLib/Utils/CreateLocalAssemblers.h
index fad22797bec6f3e89c7851b73142f1f9b358de39..df4798282cb3fdd7b483a9b64230e6515170fc18 100644
--- a/ProcessLib/Utils/CreateLocalAssemblers.h
+++ b/ProcessLib/Utils/CreateLocalAssemblers.h
@@ -11,7 +11,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/DOF/LocalToGlobalIndexMap.h"
 
diff --git a/ProcessLib/Utils/LocalDataInitializer.h b/ProcessLib/Utils/LocalDataInitializer.h
index 8b227fcbf1a7e72a21d9c9a0a0042fd459ff06fc..570d82965d1f95c9bab789a1c4b445da87e43e21 100644
--- a/ProcessLib/Utils/LocalDataInitializer.h
+++ b/ProcessLib/Utils/LocalDataInitializer.h
@@ -132,7 +132,7 @@ public:
         : _dof_table(dof_table)
     {
         if (shapefunction_order < 1 || 2 < shapefunction_order)
-            OGS_FATAL("The given shape function order %d is not supported",
+            OGS_FATAL("The given shape function order {:d} is not supported",
                       shapefunction_order);
 
         if (shapefunction_order == 1)
@@ -325,7 +325,7 @@ public:
         {
             OGS_FATAL(
                 "You are trying to build a local assembler for an unknown mesh "
-                "element type (%s)."
+                "element type ({:s})."
                 " Maybe you have disabled this mesh element type in your build "
                 "configuration.",
                 type_idx.name());
diff --git a/ProcessLib/Utils/ProcessUtils.cpp b/ProcessLib/Utils/ProcessUtils.cpp
index 232a7a183b2fb074c9c3eb65ba2eb917c2f9375b..86a3d2009ceee45bcc50c11daf085361f9744d93 100644
--- a/ProcessLib/Utils/ProcessUtils.cpp
+++ b/ProcessLib/Utils/ProcessUtils.cpp
@@ -28,12 +28,12 @@ ProcessLib::ProcessVariable& findVariableByName(
     if (variable == variables.end())
     {
         OGS_FATAL(
-            "There is no entry of the defined process variable '%s' in the "
+            "There is no entry of the defined process variable '{:s}' in the "
             "provided variables list (see tag <process_variables>). A "
-            "definition is required for config tag <%s>.",
+            "definition is required for config tag <{:s}>.",
             name.c_str(), tag.c_str());
     }
-    DBUG("Found process variable '%s' for config tag <%s>.",
+    DBUG("Found process variable '{:s}' for config tag <{:s}>.",
          variable->getName().c_str(), tag.c_str());
 
     // Const cast is needed because of variables argument constness.
@@ -86,7 +86,7 @@ std::vector<std::reference_wrapper<ProcessVariable>> findProcessVariables(
 
     if (var_names.empty())
     {
-        OGS_FATAL("No entity is found with config tag <%s>.", tag.c_str());
+        OGS_FATAL("No entity is found with config tag <{:s}>.", tag.c_str());
     }
 
     std::vector<std::string> cached_var_names;
@@ -102,7 +102,7 @@ std::vector<std::reference_wrapper<ProcessVariable>> findProcessVariables(
 
     if (cached_var_names.size() != var_names.size())
     {
-        OGS_FATAL("Found duplicates with config tag <%s>.", tag.c_str());
+        OGS_FATAL("Found duplicates with config tag <{:s}>.", tag.c_str());
     }
 
     return vars;
diff --git a/Tests/BaseLib/TestConfigTree.cpp b/Tests/BaseLib/TestConfigTree.cpp
index ab71ca1f7b74d20f3ea33fd203840a1601dbe9ee..4d5dbc15811af292a86f93bc422b35425ff344ba 100644
--- a/Tests/BaseLib/TestConfigTree.cpp
+++ b/Tests/BaseLib/TestConfigTree.cpp
@@ -8,7 +8,7 @@
  */
 
 #include <gtest/gtest.h>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <boost/property_tree/xml_parser.hpp>
 #include <numeric>
@@ -44,7 +44,7 @@ public:
             // move construction/assignment
             EXPECT_EQ("FILENAME", filename);
 
-            DBUG("error <%s> : %s", path.c_str(), message.c_str());
+            DBUG("error <{:s}> : {:s}", path.c_str(), message.c_str());
             _error = true;
             throw Exc(); // throw in order to stop normal execution
         };
@@ -62,7 +62,7 @@ public:
             // move construction/assignment
             EXPECT_EQ("FILENAME", filename);
 
-            DBUG("warning <%s> : %s", path.c_str(), message.c_str());
+            DBUG("warning <{:s}> : {:s}", path.c_str(), message.c_str());
             _warning = true;
         };
     }
diff --git a/Tests/FileIO/TestBoostGmlInterface.cpp b/Tests/FileIO/TestBoostGmlInterface.cpp
index acdeca0fd1ef298c32ba3a9d1b62a1d917749279..3b8ea261eeec941a3f4ee0fa85cd5dad1033657d 100644
--- a/Tests/FileIO/TestBoostGmlInterface.cpp
+++ b/Tests/FileIO/TestBoostGmlInterface.cpp
@@ -14,14 +14,13 @@
 
 #include <cstdio>
 
-#include "gtest/gtest.h"
-
+#include "BaseLib/StringTools.h"
+#include "GeoLib/GEOObjects.h"
+#include "GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.h"
+#include "InfoLib/TestInfo.h"
 #include "Tests/FileIO/TestGmlInterface.h"
-
 #include "filesystem.h"
-#include "InfoLib/TestInfo.h"
-#include "GeoLib/IO/XmlIO/Boost/BoostXmlGmlInterface.h"
-#include "GeoLib/GEOObjects.h"
+#include "gtest/gtest.h"
 
 TEST_F(TestGmlInterface, BoostXmlGmlWriterReaderTest)
 {
diff --git a/Tests/FileIO_Qt/TestQtGmlInterface.cpp b/Tests/FileIO_Qt/TestQtGmlInterface.cpp
index bf361f4e7af36506ba80617219b003bd243ac2cc..b033576b4ea0480a902e0feacdb37d19a56537cf 100644
--- a/Tests/FileIO_Qt/TestQtGmlInterface.cpp
+++ b/Tests/FileIO_Qt/TestQtGmlInterface.cpp
@@ -14,14 +14,13 @@
 
 #include <cstdio>
 
-#include "gtest/gtest.h"
-
+#include "BaseLib/StringTools.h"
+#include "GeoLib/GEOObjects.h"
+#include "GeoLib/IO/XmlIO/Qt/XmlGmlInterface.h"
+#include "InfoLib/TestInfo.h"
 #include "Tests/FileIO/TestGmlInterface.h"
-
 #include "filesystem.h"
-#include "InfoLib/TestInfo.h"
-#include "GeoLib/IO/XmlIO/Qt/XmlGmlInterface.h"
-#include "GeoLib/GEOObjects.h"
+#include "gtest/gtest.h"
 
 TEST_F(TestGmlInterface, QtXmlGmlWriterReaderTest)
 {
diff --git a/Tests/GeoLib/IO/TestGLIReader.cpp b/Tests/GeoLib/IO/TestGLIReader.cpp
index d71c3f1aa47864065e82de07b3f65cc6dbddc482..9058d7d8b9122609bed0f3fb78426e048fffa253 100644
--- a/Tests/GeoLib/IO/TestGLIReader.cpp
+++ b/Tests/GeoLib/IO/TestGLIReader.cpp
@@ -10,15 +10,15 @@
  *
  */
 
-#include <fstream>
 #include <cstdio>
+#include <fstream>
 
-#include "gtest/gtest.h"
-
-#include "filesystem.h"
-#include "InfoLib/TestInfo.h"
 #include "Applications/FileIO/Legacy/OGSIOVer4.h"
+#include "BaseLib/StringTools.h"
 #include "GeoLib/GEOObjects.h"
+#include "InfoLib/TestInfo.h"
+#include "filesystem.h"
+#include "gtest/gtest.h"
 
 class OGSIOVer4InterfaceTest : public ::testing::Test
 {
diff --git a/Tests/MathLib/TestGaussLegendreIntegration.cpp b/Tests/MathLib/TestGaussLegendreIntegration.cpp
index 835747e379d58e064bf715333426bd3d7c81901e..7ee755de9db1fa90b2b667fb953841988deae9c6 100644
--- a/Tests/MathLib/TestGaussLegendreIntegration.cpp
+++ b/Tests/MathLib/TestGaussLegendreIntegration.cpp
@@ -417,7 +417,7 @@ std::unique_ptr<FBase> getF(unsigned polynomial_order)
             return std::make_unique<FQuad>();
     }
 
-    OGS_FATAL("unsupported polynomial order: %d.", polynomial_order);
+    OGS_FATAL("unsupported polynomial order: {:d}.", polynomial_order);
 }
 
 }  // namespace GaussLegendreTest
@@ -455,7 +455,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib, IntegrationGaussLegendreTet)
 
     for (unsigned integration_order : {1, 2, 3})
     {
-        DBUG("\n==== integration order: %u.\n", integration_order);
+        DBUG("\n==== integration order: {:d}.\n", integration_order);
         GaussLegendreTest::IntegrationTestProcess pcs_tet(*mesh_tet,
                                                           integration_order);
 
@@ -466,7 +466,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib, IntegrationGaussLegendreTet)
                 break;
             }
 
-            DBUG("  == polynomial order: %u.", polynomial_order);
+            DBUG("  == polynomial order: {:d}.", polynomial_order);
             auto f = GaussLegendreTest::getF(polynomial_order);
 
             auto const integral_tet = pcs_tet.integrate(f->getClosure());
@@ -484,7 +484,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib, IntegrationGaussLegendreHex)
 
     for (unsigned integration_order : {1, 2, 3})
     {
-        DBUG("\n==== integration order: %u.\n", integration_order);
+        DBUG("\n==== integration order: {:d}.\n", integration_order);
         GaussLegendreTest::IntegrationTestProcess pcs_hex(*mesh_hex,
                                                           integration_order);
 
@@ -495,7 +495,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib, IntegrationGaussLegendreHex)
                 break;
             }
 
-            DBUG("  == polynomial order: %u.", polynomial_order);
+            DBUG("  == polynomial order: {:d}.", polynomial_order);
             auto f = GaussLegendreTest::getF(polynomial_order);
 
             auto const integral_hex = pcs_hex.integrate(f->getClosure());
@@ -516,7 +516,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(
 
     for (unsigned integration_order : {1, 2, 3})
     {
-        DBUG("\n==== integration order: %u.\n", integration_order);
+        DBUG("\n==== integration order: {:d}.\n", integration_order);
         GaussLegendreTest::IntegrationTestProcess pcs_tet(*mesh_tet,
                                                           integration_order);
 
@@ -525,7 +525,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(
              polynomial_order < 2 * integration_order;
              ++polynomial_order)
         {
-            DBUG("  == polynomial order: %u.", polynomial_order);
+            DBUG("  == polynomial order: {:d}.", polynomial_order);
             GaussLegendreTest::F3DSeparablePolynomial f(polynomial_order);
 
             auto const integral_tet = pcs_tet.integrate(f.getClosure());
@@ -544,7 +544,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib,
 
     for (unsigned integration_order : {1, 2, 3, 4})
     {
-        DBUG("\n==== integration order: %u.\n", integration_order);
+        DBUG("\n==== integration order: {:d}.\n", integration_order);
         GaussLegendreTest::IntegrationTestProcess pcs_hex(*mesh_hex,
                                                           integration_order);
 
@@ -553,7 +553,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib,
              polynomial_order < 2 * integration_order;
              ++polynomial_order)
         {
-            DBUG("  == polynomial order: %u.", polynomial_order);
+            DBUG("  == polynomial order: {:d}.", polynomial_order);
             GaussLegendreTest::F3DSeparablePolynomial f(polynomial_order);
 
             auto const integral_hex = pcs_hex.integrate(f.getClosure());
@@ -572,7 +572,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib,
 
     for (unsigned integration_order : {1, 2, 3})
     {
-        DBUG("\n==== integration order: %u.\n", integration_order);
+        DBUG("\n==== integration order: {:d}.\n", integration_order);
         GaussLegendreTest::IntegrationTestProcess pcs_tet(*mesh_tet,
                                                           integration_order);
 
@@ -581,7 +581,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib,
              polynomial_order < 2 * integration_order;
              ++polynomial_order)
         {
-            DBUG("  == polynomial order: %u.", polynomial_order);
+            DBUG("  == polynomial order: {:d}.", polynomial_order);
             GaussLegendreTest::F3DNonseparablePolynomial f(polynomial_order);
 
             auto const integral_tet = pcs_tet.integrate(f.getClosure());
@@ -600,7 +600,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib,
 
     for (unsigned integration_order : {1, 2, 3, 4})
     {
-        DBUG("\n==== integration order: %u.\n", integration_order);
+        DBUG("\n==== integration order: {:d}.\n", integration_order);
         GaussLegendreTest::IntegrationTestProcess pcs_hex(*mesh_hex,
                                                           integration_order);
 
@@ -609,7 +609,7 @@ OGS_DONT_TEST_THIS_IF_PETSC(MathLib,
              polynomial_order < 2 * integration_order;
              ++polynomial_order)
         {
-            DBUG("  == polynomial order: %u.", polynomial_order);
+            DBUG("  == polynomial order: {:d}.", polynomial_order);
             GaussLegendreTest::F3DNonseparablePolynomial f(polynomial_order);
 
             auto const integral_hex = pcs_hex.integrate(f.getClosure());
diff --git a/Tests/MathLib/TestNonlinear1D.cpp b/Tests/MathLib/TestNonlinear1D.cpp
index 12827a3c27013b2e43a7d179ca4016d6671fcf6b..8974cc2a7206f9ec2733781ec151fc43a13d33ec 100644
--- a/Tests/MathLib/TestNonlinear1D.cpp
+++ b/Tests/MathLib/TestNonlinear1D.cpp
@@ -7,10 +7,10 @@
  *
  */
 
+#include <gtest/gtest.h>
 #include <limits>
 #include <type_traits>
-#include <gtest/gtest.h>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 #include "MathLib/Nonlinear/Root1D.h"
 
 double f(double x)
@@ -33,7 +33,7 @@ TYPED_TEST(MathLibRegulaFalsi, QuadraticFunction)
     auto rf = NL::makeRegulaFalsi<TypeParam>(f, -0.1, 1.1);
     double old_range = rf.getRange();
 
-    DBUG(" 0 -- x ~ %23.16g, range = %23.16g", rf.getResult(), old_range);
+    DBUG(" 0 -- x ~ {:23.16g}, range = {:23.16g}", rf.getResult(), old_range);
 
     for (unsigned n=0; n<10; ++n)
     {
@@ -42,7 +42,8 @@ TYPED_TEST(MathLibRegulaFalsi, QuadraticFunction)
         // expect that the interval of the root search shrinks
         EXPECT_GT(old_range, range);
         old_range = range;
-        DBUG("%2i -- x ~ %23.16g, range = %23.16g", n+1, rf.getResult(), range);
+        DBUG("{:2d} -- x ~ {:23.16g}, range = {:23.16g}", n + 1, rf.getResult(),
+             range);
 
         if (range < std::numeric_limits<double>::epsilon())
         {
diff --git a/Tests/MathLib/TestODESolver.cpp b/Tests/MathLib/TestODESolver.cpp
index c1376b9f225f54d4bafc9a5342e6d6219f864db7..d9d0ec8ae61b1748091e70e9b46e3283576d5c80 100644
--- a/Tests/MathLib/TestODESolver.cpp
+++ b/Tests/MathLib/TestODESolver.cpp
@@ -8,7 +8,7 @@
  */
 
 #include <gtest/gtest.h>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 #include "MathLib/ODE/ODESolverBuilder.h"
@@ -99,8 +99,10 @@ std::unique_ptr<MathLib::ODE::ODESolver<NumEquations>> make_ode_solver(
 void check(const double time_reached, const double y, const double y_dot,
            const double time, const double y_ana, const double y_dot_ana)
 {
-    DBUG("t: %14.7g, y: %14.7g, diff: %14.7g, y_dot: %14.7g, diff: %14.7g",
-         time_reached, y, y - y_ana, y_dot, y_dot - y_dot_ana);
+    DBUG(
+        "t: {:14.7g}, y: {:14.7g}, diff: {:14.7g}, y_dot: {:14.7g}, diff: "
+        "{:14.7g}",
+        time_reached, y, y - y_ana, y_dot, y_dot - y_dot_ana);
     (void)y_dot_ana;  // Avoid unused variable warning when DBUG output is
                       // disabled.
 
diff --git a/Tests/MeshGeoToolsLib/TestGeoMapper.cpp b/Tests/MeshGeoToolsLib/TestGeoMapper.cpp
index e19a7748bad1bd2c2a00488b4298d143906f68d8..610910a1e60b6fc1ed68424bfd28425dc8071bd4 100644
--- a/Tests/MeshGeoToolsLib/TestGeoMapper.cpp
+++ b/Tests/MeshGeoToolsLib/TestGeoMapper.cpp
@@ -69,8 +69,8 @@ TEST_F(MeshGeoToolsLibGeoMapper, PointsOnSurfaceMesh)
             {
                 if (std::abs(std::cos(p[0]+p[1]) - p[2]) >= eps)
                 {
-                    INFO("std::cos(%f + %f) = %f, %f",
-                        p[0], p[1], cos(p[0]+p[1]), p[2]);
+                    INFO("std::cos({:f} + {:f}) = {:f}, {:f}", p[0], p[1],
+                         cos(p[0] + p[1]), p[2]);
                     return false;
                 }
             }
diff --git a/Tests/NumLib/ODEs.h b/Tests/NumLib/ODEs.h
index 5475f24f87648c0759a81b5efe4014e661e8a5b4..cf37bf1c9e9e1a9de4586defb0dfadec3df13c9a 100644
--- a/Tests/NumLib/ODEs.h
+++ b/Tests/NumLib/ODEs.h
@@ -305,10 +305,10 @@ public:
 
         // Eigen::MatrixXd J(Jac.getRawMatrix());
 
-        // INFO("t: %e, x: %e, y: %e, z: %e, dxdot/dx: %e", t, x, y, z, dxdot_dx);
-        // std::cout << "Jacobian:\n" << J << "\n";
+        // INFO("t: {:e}, x: {:e}, y: {:e}, z: {:e}, dxdot/dx: {:e}", t, x, y,
+        // z, dxdot_dx); std::cout << "Jacobian:\n" << J << "\n";
 
-        // INFO("Det J: %e <<<", J.determinant());
+        // INFO("Det J: {:e} <<<", J.determinant());
     }
 
     MathLib::MatrixSpecifications getMatrixSpecifications(
diff --git a/Tests/NumLib/TestComponentNorms.cpp b/Tests/NumLib/TestComponentNorms.cpp
index 031307f06c130fa06ff4c5b2a72c15c25ebd04ca..5395ba7d19d56b32e20db323831750a78dd99c77 100644
--- a/Tests/NumLib/TestComponentNorms.cpp
+++ b/Tests/NumLib/TestComponentNorms.cpp
@@ -9,7 +9,7 @@
 
 #include <gtest/gtest.h>
 #include <limits>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #ifdef USE_PETSC
 #include "InfoLib/TestInfo.h"
@@ -128,7 +128,7 @@ TEST(MPITest_NumLib, ComponentNormSingleComponent)
 
     using VNT = MathLib::VecNormType;
     for (auto norm_type : {VNT::NORM1, VNT::NORM2, VNT::INFINITY_N}) {
-        DBUG("norm type: %s.",
+        DBUG("norm type: {:s}.",
              MathLib::convertVecNormTypeToString(norm_type).c_str());
         do_test(num_components, norm_type, tolerance,
                 [](double /*n_total*/, double n) { return n; },
diff --git a/Tests/NumLib/TestExtrapolation.cpp b/Tests/NumLib/TestExtrapolation.cpp
index f4e6540ca725b1e9e8fb903d4f6752f44ee988d9..e32f6867d4d8fe4c398ab8ea8c96b8393c404cd4 100644
--- a/Tests/NumLib/TestExtrapolation.cpp
+++ b/Tests/NumLib/TestExtrapolation.cpp
@@ -235,7 +235,7 @@ void extrapolate(
     ASSERT_EQ(nelements, residual.size());
 
     auto const res_norm = LinAlg::normMax(residual);
-    DBUG("maximum norm of residual: %g", res_norm);
+    DBUG("maximum norm of residual: {:g}", res_norm);
     EXPECT_GT(tolerance_res, res_norm);
 
     auto delta_x = MathLib::MatrixVectorTraits<GlobalVector>::newInstance(
@@ -243,7 +243,7 @@ void extrapolate(
     LinAlg::axpy(*delta_x, -1.0, x_extra);  // delta_x = x_expected - x_extra
 
     auto const dx_norm = LinAlg::normMax(*delta_x);
-    DBUG("maximum norm of delta x:  %g", dx_norm);
+    DBUG("maximum norm of delta x:  {:g}", dx_norm);
     EXPECT_GT(tolerance_dx, dx_norm);
 }
 
@@ -279,7 +279,7 @@ TEST(NumLib, DISABLED_Extrapolation)
 
         auto const nnodes = mesh->getNumberOfNodes();
         auto const nelements = mesh->getNumberOfElements();
-        DBUG("number of nodes: %lu, number of elements: %lu", nnodes,
+        DBUG("number of nodes: {:d}, number of elements: {:d}", nnodes,
              nelements);
 
         ExtrapolationTest::ExtrapolationTestProcess pcs(*mesh,
diff --git a/Tests/NumLib/TestODEInt.cpp b/Tests/NumLib/TestODEInt.cpp
index ca6d00bc2edab2e3bb9bfc5acc0f20f64f1d4b7c..aa91edc15291236f871b7de898ae1e9b5072f913 100644
--- a/Tests/NumLib/TestODEInt.cpp
+++ b/Tests/NumLib/TestODEInt.cpp
@@ -13,8 +13,8 @@
 #include <memory>
 #include <typeinfo>
 
-#include <logog/include/logog.hpp>
 #include <boost/property_tree/xml_parser.hpp>
+#include "BaseLib/Logging.h"
 
 #include "InfoLib/TestInfo.h"
 #include "NumLib/NumericsConfig.h"
@@ -87,7 +87,7 @@ public:
         const double delta_t = (num_timesteps == 0) ? -1.0
                                                     : ((t_end-t0) / num_timesteps);
 
-        DBUG("Running test with %u timesteps of size %g s.", num_timesteps,
+        DBUG("Running test with {:d} timesteps of size {:g} s.", num_timesteps,
              delta_t);
 
         // initial condition
diff --git a/Tests/NumLib/TestTimeSteppingEvolutionaryPIDcontroller.cpp b/Tests/NumLib/TestTimeSteppingEvolutionaryPIDcontroller.cpp
index 36d36be8bbe3ea3a6e1b5e998a779404d7afd449..7d03e7fed91a05681d3a0df9ca041b042fc6a491 100644
--- a/Tests/NumLib/TestTimeSteppingEvolutionaryPIDcontroller.cpp
+++ b/Tests/NumLib/TestTimeSteppingEvolutionaryPIDcontroller.cpp
@@ -14,7 +14,7 @@
 #include <memory>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "BaseLib/ConfigTree.h"
 
diff --git a/Tests/NumLib/TestTimeSteppingFixed.cpp b/Tests/NumLib/TestTimeSteppingFixed.cpp
index c1104be261b959bddebb8714cf6f5812dc9e5b2c..20e4be4e51a00b306190e0fcb2f6d095108df3ee 100644
--- a/Tests/NumLib/TestTimeSteppingFixed.cpp
+++ b/Tests/NumLib/TestTimeSteppingFixed.cpp
@@ -13,7 +13,7 @@
 
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/TimeStepping/Algorithms/FixedTimeStepping.h"
 #include "NumLib/TimeStepping/TimeStep.h"
diff --git a/Tests/NumLib/TestTimeSteppingIterationNumber.cpp b/Tests/NumLib/TestTimeSteppingIterationNumber.cpp
index d9c9ab49fab1f7848762918b1a2a4ffa1878e84f..d64a4cee3420554e1b7c63eb7495ffb83cee351f 100644
--- a/Tests/NumLib/TestTimeSteppingIterationNumber.cpp
+++ b/Tests/NumLib/TestTimeSteppingIterationNumber.cpp
@@ -14,7 +14,7 @@
 #include <utility>
 #include <vector>
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/TimeStepping/TimeStep.h"
 #include "NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.h"
diff --git a/Tests/NumLib/TimeLoopSingleODE.h b/Tests/NumLib/TimeLoopSingleODE.h
index 16bf82f688ebb9bc365860591eee3e0ac0036908..33155d4660bbd3376e64881fa7e1b5e63e559d28 100644
--- a/Tests/NumLib/TimeLoopSingleODE.h
+++ b/Tests/NumLib/TimeLoopSingleODE.h
@@ -113,7 +113,7 @@ NumLib::NonlinearSolverStatus TimeLoopSingleODE<NLTag>::loop(
     {
         ++timestep;
 
-        // INFO("time: %e, delta_t: %e", t, delta_t);
+        // INFO("time: {:e}, delta_t: {:e}", t, delta_t);
         time_disc.nextTimestep(t, delta_t);
 
         int const process_id = 0;
@@ -136,7 +136,8 @@ NumLib::NonlinearSolverStatus TimeLoopSingleODE<NLTag>::loop(
 
     if (!nonlinear_solver_status.error_norms_met)
     {
-        ERR("Nonlinear solver failed in timestep #%u at t = %g s", timestep, t);
+        ERR("Nonlinear solver failed in timestep #{:d} at t = {:g} s", timestep,
+            t);
     }
     return nonlinear_solver_status;
 }
diff --git a/Tests/NumLib/TimeSteppingTestingTools.h b/Tests/NumLib/TimeSteppingTestingTools.h
index 45a2ba8ebcc7450f10daa11e6e8df9c822391394..916474f930cd3cd0626551c0328a64bc509cac70 100644
--- a/Tests/NumLib/TimeSteppingTestingTools.h
+++ b/Tests/NumLib/TimeSteppingTestingTools.h
@@ -11,7 +11,7 @@
 
 #pragma once
 
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include "NumLib/TimeStepping/TimeStep.h"
 
@@ -42,7 +42,7 @@ std::vector<double> timeStepping(T_TIME_STEPPING& algorithm,
         }
 
         NumLib::TimeStep t = algorithm.getTimeStep();
-        //INFO("t: n=%d,t=%g,dt=%g", t.steps(), t.current(), t.dt());
+        // INFO("t: n={:d},t={:g},dt={:g}", t.steps(), t.current(), t.dt());
         if (obj)
         {
             (*obj)(algorithm);  // do something
diff --git a/Tests/ParameterLib/Parameter.cpp b/Tests/ParameterLib/Parameter.cpp
index fdb387ff4c648e6a7b44fb4c58430a3537922ed1..ababafa72d26265bf2b6da050bde886e4d25379a 100644
--- a/Tests/ParameterLib/Parameter.cpp
+++ b/Tests/ParameterLib/Parameter.cpp
@@ -8,7 +8,7 @@
  */
 
 #include <gtest/gtest.h>
-#include <logog/include/logog.hpp>
+#include "BaseLib/Logging.h"
 
 #include <boost/property_tree/xml_parser.hpp>
 #include <numeric>
@@ -138,8 +138,9 @@ bool testNodalValuesOfElement(
                 double const expected_value = get_expected_value(e, i);
                 if (expected_value != nodal_values(i, 0))
                 {
-                    ERR("Mismatch for element %d, node %d; Expected %g, got "
-                        "%g.",
+                    ERR("Mismatch for element {:d}, node {:d}; Expected {:g}, "
+                        "got "
+                        "{:g}.",
                         e->getID(), i, expected_value, nodal_values(i, 0));
                     return false;
                 }
diff --git a/Tests/ProcessLib/TestJacobianAssembler.cpp b/Tests/ProcessLib/TestJacobianAssembler.cpp
index b17d1280f1eeeaf95c55cd68084b3d0af8f0405c..bab762d985ec2ed0af8b5d2ac39f59825ebde64c 100644
--- a/Tests/ProcessLib/TestJacobianAssembler.cpp
+++ b/Tests/ProcessLib/TestJacobianAssembler.cpp
@@ -576,7 +576,7 @@ private:
         ASSERT_EQ(x.size()*x.size(), Jac_data_cd.size());
         ASSERT_EQ(x.size()*x.size(), Jac_data_ana.size());
         for (std::size_t i=0; i<x.size()*x.size(); ++i) {
-            // DBUG("%lu, %g, %g", i, Jac_data_ana[i], Jac_data_cd[i]);
+            // DBUG("{:d}, {:g}, {:g}", i, Jac_data_ana[i], Jac_data_cd[i]);
             EXPECT_NEAR(Jac_data_ana[i], Jac_data_cd[i], LocAsm::getTol());
         }
     }
diff --git a/Tests/testrunner.cpp b/Tests/testrunner.cpp
index 8f90a1d694879c897c71c33bf6d740e7e94fb0df..8b674fc9d9e60514d4612271462757a7454afc9b 100644
--- a/Tests/testrunner.cpp
+++ b/Tests/testrunner.cpp
@@ -12,15 +12,15 @@
  *
  */
 
-// ** INCLUDES **
-#include <clocale>
+#include <spdlog/spdlog.h>
 
-#include "gtest/gtest.h"
+#include <clocale>
 
-#include "Applications/ApplicationsLib/LogogSetup.h"
 #include "Applications/ApplicationsLib/LinearSolverLibrarySetup.h"
+#include "BaseLib/Error.h"
+#include "BaseLib/Logging.h"
 #include "NumLib/DOF/GlobalMatrixProviders.h"
-#include "BaseLib/TemplateLogogFormatterSuppressedGCC.h"
+#include "gtest/gtest.h"
 
 #ifdef OGS_BUILD_GUI
 #include <QCoreApplication>
@@ -51,24 +51,22 @@ int main(int argc, char* argv[])
     QCoreApplication app(argc, argv, false);
 #endif
 
-    // Attention: Order matters!
-    // logog_setup must be created first, then the linear_solver_library_setup,
-    // because destruction order is the reverse of the creation order and the
-    // destructor of linear_solver_library_setup might print log messages.
-    // The methods on logog_setup must be called after the construction of
-    // linear_solver_library_setup since they require, e.g., that MPI_Init()
-    // has been called before.
-
-    ApplicationsLib::LogogSetup logog_setup;
-
     ApplicationsLib::LinearSolverLibrarySetup linear_solver_library_setup(
                 argc, argv);
 
-    logog_setup.setFormatter(
-        std::make_unique<BaseLib::TemplateLogogFormatterSuppressedGCC<
-            TOPIC_LEVEL_FLAG | TOPIC_FILE_NAME_FLAG |
-            TOPIC_LINE_NUMBER_FLAG>>());
-    logog_setup.setLevel(logLevel);
+    BaseLib::setConsoleLogLevel(logLevel);
+    spdlog::set_pattern("%^%l:%$ %v");
+    spdlog::set_error_handler([](const std::string& msg) {
+        std::cerr << "spdlog error: " << msg << std::endl;
+        OGS_FATAL("spdlog logger error occured.");
+    });
+#ifdef USE_PETSC
+    {  // Can be called only after MPI_INIT.
+        int mpi_rank;
+        MPI_Comm_rank(PETSC_COMM_WORLD, &mpi_rank);
+        spdlog::set_pattern(fmt::format("[{}] %^%l:%$ %v", mpi_rank));
+    }
+#endif
 
     try
     {
diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt
index d91cfa8db44f748ffda4b2501941cf7b4ed74111..016efa661f5d6101daa4d514d16ea54a0ad7c368 100644
--- a/ThirdParty/CMakeLists.txt
+++ b/ThirdParty/CMakeLists.txt
@@ -1,5 +1,5 @@
-add_subdirectory(logog)
-set(DISABLE_WARNINGS_TARGETS logog)
+add_subdirectory(spdlog)
+set(DISABLE_WARNINGS_TARGETS spdlog)
 
 set(gtest_force_shared_crt ON CACHE INTERNAL "") # Use dynamic MSVC runtime
 set(INSTALL_GTEST OFF CACHE INTERNAL "")
diff --git a/ThirdParty/ReadMe.md b/ThirdParty/ReadMe.md
index 8562dd872e3cc990697abdcc6446263dae3470f1..02fd52e623bbd97bcbc3aedeb51867fc3583ef32 100644
--- a/ThirdParty/ReadMe.md
+++ b/ThirdParty/ReadMe.md
@@ -1,17 +1,5 @@
 # Third-party libraries #
 
-## logog ##
-
-For details how to use logog see the [OGS devguide](http://devguide.opengeosys.com/logging/) and the [logog documentation](http://johnwbyrd.github.com/logog/).
-
-[logog](http://johnwbyrd.github.com/logog/) is integrated as a [git-subtree](https://github.com/apenwarr/git-subtree) and can be updated with (executed in the sources root):
-
-    git-subtree pull -P ThirdParty/logog --squash https://github.com/johnwbyrd/logog.git
-
-It was initially integrated with:
-
-    git-subtree add -P ThirdParty/logog --squash https://github.com/johnwbyrd/logog.git master
-
 ## RapidXML ##
 
 Is used for XML-IO. Is integrated directly.
@@ -40,3 +28,7 @@ tests are too large.
 ## exprtk ##
 
 Header only c++ mathematical expression parsing and evaluation library
+
+## spdlog ##
+
+Very fast, header-only/compiled, C++ logging library.
diff --git a/ThirdParty/logog/CMakeLists.txt b/ThirdParty/logog/CMakeLists.txt
deleted file mode 100644
index c32fbf5676c3128efd53127087b2d33461e15763..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/CMakeLists.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-# logog needs thread support on linux
-find_package( Threads )
-add_library( logog
-	src/api.cpp
-	src/checkpoint.cpp
-	src/formatter.cpp
-	src/lobject.cpp
-	src/lstring.cpp
-	src/message.cpp
-	src/mutex.cpp
-	src/node.cpp
-	src/platform.cpp
-	src/socket.cpp
-	src/statics.cpp
-	src/target.cpp
-	src/timer.cpp
-	src/topic.cpp
-	src/unittest.cpp
-)
-target_include_directories(logog SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
-if(BUILD_SHARED_LIBS)
-    install(TARGETS logog LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
-endif()
diff --git a/ThirdParty/logog/doc/make-doxygen.bat b/ThirdParty/logog/doc/make-doxygen.bat
deleted file mode 100644
index ec6f2db2a281b30389f824ef95bfd6ef90f026a5..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/doc/make-doxygen.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-cd ..
-bin\win32\dev\doxygen.exe
\ No newline at end of file
diff --git a/ThirdParty/logog/doc/overview.dox b/ThirdParty/logog/doc/overview.dox
deleted file mode 100644
index 0baf43db1b99c2dab35e61a0342f1c0d38dfa17e..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/doc/overview.dox
+++ /dev/null
@@ -1,991 +0,0 @@
-/*
-
-Online documentation is available at http://www.logog.org.
-
-This is a documentation file for logog, written in doxygen format.  It's not
-intended to be read by a human; rather, it's intended to be read by the 
-doxygen formatting tool to generate help in a number of user-readable formats.
-
-If you wish to generate a local copy of the html documentation, then 
-install the doxygen utility from http://www.doxygen.org , and run the 
-utility from the root of the logog installation folder.  A folder
-named doc/html will be created with complete html documentation for the
-current release of logog.
-
-*/
-
-namespace logog {
-
-/*!
-\mainpage logog - logger optimized for games
-
-\htmlonly
-<a href="http://www.github.com/johnwbyrd/logog">
-<img src="download.jpg" width=120 height=90 alt="Download logog" >
-</a>
-\endhtmlonly
-
-\section introduction Introduction 
-
-logog is a portable C++ library to 
-facilitate logging of real-time events in performance-oriented 
-applications, such as games. It is especially appropriate for projects 
-that have constrained memory and constrained CPU requirements. 
-
-The latest documentation for logog is online at <a href="http://www.logog.org">
-http://www.logog.org</a>.  You can download the latest tarball or zipfile 
-<a href="http://www.github.com/johnwbyrd/logog">here</a>.
-
-For the impatient, you can add logging functionality into your program
-within five minutes by reading the \ref quickstart section.
-
-\subsection gettingstarted Getting started
-
-- \ref quickstart
-- \ref requirements
-- \ref supportedplatforms
-- \ref features
-
-\subsection basic Basic functionality
-
-- \ref loggingevents
-- \ref levels 
-
-\subsection advancedfeatures Advanced functionality
-
-- \ref categoriesgroups
-- \ref multipletargets
-- \ref deferredoutput
-- \ref addingnewtargets
-- \ref customformatting
-- \ref memorymanager
-- \ref unicodesupport
-- \ref performance
-- \ref leakdetection
-
-\subsection relatedtopics Related topics
-
-- \ref porting
-- \ref unittesting 
-- \ref othersystems
-- \ref license
-
-\subsection gettinghelp Getting help
-
-- \ref community
-
-\htmlonly
-<table border=0 style="background-color: #fff; padding: 5px;" cellspacing=0>
-  <tr><td>
-  <img src="http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif"
-         height=30 width=140 alt="Google Groups">
-  </td></tr>
-  <tr><td style="padding-left: 5px">
-  <b>Subscribe to Logog</b>
-  </td></tr>
-  <form action="http://groups.google.com/group/logog/boxsubscribe">
-  <input type=hidden name="hl" value="en">
-  <tr><td style="padding-left: 5px;">
-  Email: <input type=text name=email>
-  <input type=submit name="sub" value="Subscribe">
-  </td></tr>
-</form>
-<tr><td align=right>
-  <a href="http://groups.google.com/group/logog?hl=en">Visit this group</a>
-</td></tr>
-</table>
-\endhtmlonly
-
-
-\page features Features 
-
-Why yet another logging library?  Because professional games have
-very specific logging requirements that aren't met by any previous
-logging system.
-
-logog supports the following features: 
-
-- High performance. It is possible to disable all logging functionality 
-entirely within logog. In this case logog incurs zero performance 
-penalty on executing code. All logging functions compile to no-ops in 
-the case where the logging level is set to disabled. When logging is 
-enabled, the do-not-log control path requires exactly one boolean 
-comparison. All performance-critical operations have been constructed to 
-have constant time or near constant time performance. logog was designed 
-to assume that no memory or CPU time is available for logging on a final 
-release build of software. When compiling in final release mode, logog 
-is designed to compile completely away -- zero memory allocations, zero 
-CPU cycles spent.
-
-- Logging to arbitrary destinations. Log messages can be sent to stdout, 
-stderr, a log file or into memory, or any combination of these. Logging 
-classes are highly extensible, so logging to new destinations is easy to 
-add. 
-
-- Multiple simultaneous logging criteria. Messages can be simultaneously 
-logged to different log targets with different requirements: by file, by 
-category, by log level, or by group. Substring matching permits 
-regexp-like behavior on logging criteria. 
-
-- Limited external dependencies. logog only requires a reasonably modern 
-standards-compliant C++ compiler (tr1 or later). logog has limited 
-dependencies on STL.  Those dependencies have been orchestrated to mitigate
-the negative performance impacts of the STL.  Additionally, those dependencies
-have been abstracted into macros so that STL can easily be replaced with a somewhat
-compatible template library of your own choosing.
-
-- Highly granular control over which message types are logged.  Control 
-over these messages may be determined at compile-time for maximal 
-performance, or at run-time for interactively enabling or disabling log 
-message types during execution. Messages may be logged by source file, 
-group, category, or message contents. 
-
-- Support for advanced logging requirements. logog's pub-sub 
-architecture means that logging can occur simultaneously to multiple log 
-targets, each with its own logging criteria. Stable base classes permit 
-new logging targets to be easily added. 
-
-- Extremely configurable memory usage and policy. All memory allocations 
-happen after initialization time via a user-supplied memory manager (or 
-the default std::allocator). In other words, you can configure ALL 
-memory allocations to occur from custom malloc() and free() style 
-functions of your own authorship. 
-
-- All allocated memory is freed after the shutdown -- logog does not 
-leak memory.  A special compilation flag (LOGOG_LEAK_DETECTION) audits
-every allocation and free within logog to discover and fix memory leaks therein.
-Additionally, if you don't trust logog's internal leak detector, support exists
-for auditing leaks with Microsoft's CRT library with LOGOG_LEAK_DETECTION_MICROSOFT.
-
-- Support for POSIX-type and Windows-type operating systems.
-Support for proprietary game consoles is implicit or latent; the system
-has been demonstrated to work on Xbox 360 and PS3 (with certain proprietary header
-files).  Support for other OSes is straightforward; all OS dependencies are encapsulated in 
-macros.  
-
-- Support for multithreading. Multiple thread sources are permitted to 
-send logging messages at the same time. 
-
-- Support for re-entrancy. If triggering a log message indirectly causes 
-another log message to be triggered, either through the memory allocator 
-or some other user-based policy, logog is not permitted to hang in a 
-multithreaded environment. 
-
-- Unicode (wide-character) support for all strings; define LOGOG_UNICODE 
-and all strings go from char-based to wchar-based. 
-
-- Verbose documentation.  By far the best documented logging system
-available.  logog uses doxygen comments throughout.
-
-- Extremely permissive license. logog is released under the MIT License, 
-so it may be used freely in commercial as well as open-source projects, 
-with proper attribution to logog's authors (Gigantic Software). 
-
-\page quickstart Quick start 
-
-The logog system is a set of C++ header files and C++ source files.
-To use them, compile all the C++ source files into a single library.
-The compiler will need to reference the files in the include directory
-when compiling the logog library.
-
-\par Build the logog library
-
-To make this easier, logog has been set up to compile using CMake, available 
-at http://www.cmake.org/ .
-CMake is a free cross-platform build system, and executables are available for
-most major platforms and development environments.  Download and install CMake
-in order to generate a build for your platform.
-
-For example, to build the project and libraries on Visual Studio 2008, find and launch
-the Visual Studio 2008 Command Prompt at <b>Microsoft Visual Studio 2008 / Visual Studio Tools /
-Visual Studio 2008 Command Prompt.</b>
-
-Then, to create the appropriate project files, create an empty directory, make that 
-directory the current directory, and run the CMake command with the logog directory as 
-a parameter:
-
-\code
-mkdir logog-build
-cd logog-build
-cmake [path-to-logog-top-directory]
-\endcode
-
-At this point, your directory will contain appropriate project and solution files for your 
-platform.  Once the solution is building, the CMake program is no longer needed.
-Compile and link the library for your own platform using the makefile or project files generated
-for your platform.
-
-\par Your Hello, Logog! program
-
-Here is a working logog example that initializes logog, outputs some sample messages and then
-terminates.
-
-\snippet test.cpp HelloLogog
-
-The most common mistake when getting started with logog is creating a Cerr or Cout
-object and not destroying the object before LOGOG_SHUTDOWN().  This is a usage
-error and will be detected as heap corruption by most debuggers.
-
-\par Integrate logog into your own project
-
-To use the logging library in your own project, put the following line 
-at the top of your source file(s): 
-
-\code
-#include "logog.hpp"
-\endcode
-
-Additionally, make sure to add logog's /include path into the directories
-your build process searches.
-
-At the beginning of your program, initialize logog exactly once, with this
-macro:
-
-\code
-LOGOG_INITIALIZE();
-\endcode
-
-\par Choose one or more output types
-
-To tell logog what type of output should be logged, you must first create a logog::Cerr,
-a logog::Cout, or a logog::LogFile object.  Once this object is instantiated,
-all messages will be routed to that target.  For example:
-
-\code
-logog::Cerr errOutput;
-\endcode
-
-Or:
-
-\code
-logog::LogFile errFile("log.txt");
-\endcode
-
-It's only necessary to create one target per process, immediately after initializing
-logog; you don't need to instance a different Cout, Cerr or LogFile for each class or each file.
-
-\par Start logging events
-
-To log a message in your code, use one of the following macros, in order 
-of severity. Arguments are assumed to be sprintf-style varargs: 
-
-\snippet macro.hpp Shorthand
-
-Note the funny spellings on DBUG and ERR to avoid conflicting with existing macros
-on Windows platforms.
-
-If it turns out that the names of these macros conflict with your existing code,
-then before including the logog.hpp file, define the following constant:
-
-\code
-#define LOGOG_USE_PREFIX 1
-\endcode
-
-If you enable that prefix, you may log with the following macros instead:
-
-\code
-LOGOG_DEBUG( __VA_ARGS__ )
-LOGOG_INFO( __VA_ARGS__ )
-LOGOG_WARN3( __VA_ARGS__ )
-LOGOG_WARN2( __VA_ARGS__ )
-LOGOG_WARN1( __VA_ARGS__ )
-LOGOG_WARN( __VA_ARGS__ )
-LOGOG_ERROR( __VA_ARGS__ )
-LOGOG_ALERT( __VA_ARGS__ )
-LOGOG_CRITICAL( __VA_ARGS__ )
-LOGOG_EMERGENCY( __VA_ARGS__ )
-\endcode
-
-An example usage follows:
-
-\code 
-int foo = 9001;
-int maxfoo = 9000;
-
-if ( foo > maxfoo )
-{
-	WARN("Foo is over %d!  Current value is %d.", maxfoo, foo );
-	WARN("Since this is a warning, by default all builds will log this message!");
-}
-
-const char *pMessage = "message"
-INFO( "This is an informational %s.", pMessage );
-\endcode
-
-At this point, your Target object (in this case, the errOutput object) should
-be destroyed.  Falling out of scope is the easiest way to achieve this.
-
-Then, terminate your program and logging with the following message:
-
-\code
-LOGOG_SHUTDOWN();
-\endcode
-
-Lastly, compile and link with the logog library you created earlier.
-
-\page loggingevents Logging events in your code
-
-In order to log events in your code, it's important to first understand the logging
-levels that are available to you.  Out of the box, logog comes with these logging 
-levels, which are compatible with the syslog standard:
-
-\snippet const.hpp Level Constants
-
-So, the lower the level number is, the more important the logging message is.
-
-To log an event in your code, there exists macros for each of the logging
-levels.  So, for example, to log an event of level WARN3, you would use the 
-following macro in your code:
-
-\code
-LOGOG_WARN3("Disk reads are taking %d milliseconds to complete!", nMilliseconds );
-\endcode
-
-It can get laborious to type the LOGOG_ prefix on all log messages, so, if the
-LOGOG_USE_PREFIX macro is not defined, you may use these shorter alternate
-logging forms:
-
-\snippet macro.hpp Shorthand
-
-If you want to generate a log message of some user-specified level, check out
-the LOGOG_LEVEL_MESSAGE macro.
-
-Keep in mind that you must instantiate at least one Target object in your application
-for log messages to have any effect.
-
-\page levels Verbosity levels of logging
-
-During early stages of product development, you may want to spread DBUG()
-and INFO() type messages liberally across your code base in order to detect
-bugs earlier in the process.  However, as your code develops you will 
-want to omit these instructions entirely, as too many log messages will
-slow down your program.
-
-To omit all logging messages of lower than a specific level at compilation time,
-\#define the LOGOG_LEVEL constant to be some value from the following list:
-
-\snippet const.hpp Level Constants
-
-All logging macros of a lower level will be omitted.
-
-You may enable all logging messages in the following manner before loading 
-logog.hpp:
-
-\code
-#define LOGOG_LEVEL LOGOG_LEVEL_ALL
-\endcode
-
-And you may disable all logging messages with this before logog.hpp:
-
-\code
-#define LOGOG_LEVEL LOGOG_LEVEL_NONE
-\endcode
-
-The standard warnings apply to incrementing or changing variables within a macro.
-For example:
-
-\code
-INFO("The core has exploded %d times", nExploded++);
-\endcode
-
-The nExploded variable will only be incremented if LOGOG_LEVEL is set to LOGOG_LEVEL_INFO
-or lower.
-
-\page filters Filters and their uses
-
-A Filter is a special type of Topic that accepts messages from a publisher
-and routes them forward to another Topic, based on criteria decided by the Filter.
-When logog is initialized, it creates one default filter that automatically forwards
-all messages to all Target objects.  This default behavior can be modified in 
-to generate more complicated logging behaviors.
-
-You can get a reference to the default filter with GetDefaultFilter().  You
-can also instantiate your own filters before you start logging messages
-and messages will automatically find and route through them as well.
-
-Messages attempt to publish themselves to all filters when the message is 
-instantiated.  Filters automatically attempt to publish themselves
-to all targets when the filter is instantiated.
-
-\page categoriesgroups Organizing and filtering log messages by types
-
-Areas of a program such as a game can be broken down into a set of functional
-areas.  Some areas might include AI, audio, graphics, input and the file system.
-
-The logog system allows you to store two dimensions of information with each message
-that further type the message.  These dimensions are referred to as the 
-<b>category</b> and the <b>group</b> of the message.  The ultimate meaning of 
-these fields is up to you.
-
-To define the current group for all messages following a certain point in your
-code, \#define the LOGOG_GROUP constant to the name of the group, surrounded
-by double quotes.  Likewise \#define the LOGOG_CATEGORY constant to the name 
-of the category surrounded by double quotes.
-
-Your compiler may need the \#undef macro to undefine the previous setting of 
-a constant before \#define'ing it to something else.
-
-If you wish to set further messages to no specific category or group, \#define
-either LOGOG_CATEGORY or LOGOG_GROUP to NULL as necessary.
-
-\snippet test.cpp GroupCategory1
-
-A Filter can be told to route only messages matching a specified category or 
-group.  To do this, call the Filter::Category() or Filter::Group() methods on
-a specific filter.  That filter will then only pass messages matching 
-the criteria you've set.
-
-\snippet test.cpp GroupCategory2
-
-\page multipletargets Logging to permutations of multiple targets
-
-It's possible to create multiple filters with multiple criteria on each filter
-and then route each filter to a separate target.  This permits advanced logging
-of different types of events to different log targets.
-
-A filter will automatically attempt to publish itself to all targets.  You can
-change this behavior by calling UnpublishToMultiple( AllTargets() ) on that filter,
-followed by PublishTo() to publish that filter to an output of your choice.
-
-\snippet test.cpp GroupCategory4
-
-\page deferredoutput Deferring logging output
-
-Writing debug output can take a lot of time on most platforms.  
-Especially in programs that produce copious debug output, logging can slow 
-a program's operation considerably.
-
-To get around this behavior, use the LogBuffer class.  To Create a LogBuffer,
-you provide a pointer to the ultimate Target you want to write to, such as 
-a Cerr or a LogFile, as well as the size of the LogBuffer.  Logging then occurs
-solely to the LogBuffer, and no output is written to the Target until the 
-LogBuffer is destroyed, or the LogBuffer::Dump() method is called.
-
-\page customformatting Custom formatting of log messages
-
-The Formatter object is responsible for rendering a particular Topic into a human-readable
-format.  A default Formatter is created by default for you based on the flavor of the compile 
-target.  See FormatterGCC and FormatterMSVC objects for examples.
-
-If you want log messages in your own custom format, subclass the Formatter::Format 
-method into your own custom class, and write your own formatting function for a topic.
-See FormatterMSVC::Format and FormatterGCC::Format for examples.
-
-If all you want to do is enable or disable a certain type of output on your formatter -- for example, to remove file and line number information from
-all your output lines -- then there's a very simple way of doing this.
-The Formatter class implements a Formatter::GetTopicFlags() function that
-in the default case queries the topic in order to find out which fields
-to render.  You can if you wish override this default behavior for a custom
-formatter in order to always or never render specific fields.
-
-The following example overrides the standard FormatterMSVC formatter in
-order to never show file and line number information on the output.
-
-\snippet test.cpp FormatterCustom1
-
-If you wish, you can force a formatter to output the current date and time as 
-part of their format.  You can do this by calling the Formatter::SetShowTimeOfDay function
-with a value of true, as follows:
-
-\snippet test.cpp DateAndTimeLogging
-
-\page addingnewtargets Adding new logging output targets
-
-To add a new type of logging output, such as a network socket or a printer,
-create a subclass of the Target class, and implement your own Output()
-function that renders the information to your output device.
-
-\snippet target.cpp Cout
-
-Then, instance your new class after your call to LOGOG_INITIALIZE() but 
-before messages are invoked.
-
-\page memorymanager Implementing a custom memory manager
-
-All memory allocated by logog, by default, goes through the system malloc()
-and free() routines.  However, many games prefer to implement their
-own memory management systems in order to track memory usage in detail.
-
-In this case, logog can be made to allocate memory via a callback into 
-your own custom code.  In order to implement this callback, 
-allocate an INIT_PARAMS structure on the stack, and then replace
-the m_pfMalloc and m_pfFree pointers to pointers to your own custom
-allocation and free routines.  (It's fine to allocate an INIT_PARAMS structure
-on the stack.)
-Then, when calling the LOGOG_INITIALIZE() macro, provide the address
-of the INIT_PARAMS structure as a parameter.  The INIT_PARAMS structure
-may then be freed.
-
-\snippet api.hpp INIT_PARAMS
-
-\page leakdetection Memory leak detection
-
-A memory leak detection mechanism has been built into logog that tracks all
-internal memory allocations and matches them with corresponding frees.
-The system also detects incorrect reallocations and double frees.  This 
-system only needs to be enabled if you suspect that logog is leaking memory.
-
-To enable this checking, \#define the LOGOG_LEAK_DETECTION constant at compilation
-time before \#include'ing logog.hpp, and then recompile both the logog library and your 
-code.  Additionally, if you want a detailed report about memory allocations
-and frees at the time they occur, enable the LOGOG_REPORT_ALLOCATIONS flag during
-compilation for an action-packed report during run time.
-
-If you don't trust logog's built-in leak detector and are using a Microsoft
-toolset, Microsoft may have enabled support for your platform to detect
-leaks using the CRT library.  If you want to try to use the Microsoft leak
-detector to find leaks in logog, then \#define the LOGOG_LEAK_DETECTION_MICROSOFT constant at 
-compile time before \#include'ing logog, and recompile both the logog library
-and your application.  See http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
-for more details on how Microsoft implements CRT leak detection.
-
-It's not recommended to leave either of these options on for general use.
-Memory leak detection will slow down logog; additionally, memory leak 
-detection avoids logog's custom memory manager, in order
-to avoid an infinite recursion.
-
-Don't try to enable both LOGOG_LEAK_DETECTION and LOGOG_LEAK_DETECTION_MICROSOFT
-at the same time.
-
-\page unicodesupport Unicode support
-
-The logog library may be compiled either in ANSI mode or in Unicode mode.  By default,
-logog is compiled as an ANSI library.  In this case, multibyte characters are 
-not permitted in log messages.  To enable Unicode support, define the LOGOG_UNICODE
-flag in logog.hpp before compiling the logog library.
-
-Defining this flag sets wchar_t as the base type for all logog character operations.
-On Windows like platforms, a wchar_t is two bytes, and on Posix-like platforms this 
-may be two bytes or four bytes.
-
-Because Unicode support is based around wchar_t, the exact format of the Unicode 
-output depends on the endianness of the target platform as well as the size of 
-wchar_t.  If logog is creating a new output log file, logog tries to add a Unicode 
-BOM to the start of the file, if wchar_t is either two or four bytes in length.
-In this case, logog can write a UTF-16 or UTF-32 BOM, in either little or big 
-endian format.  See LogFile::WriteUnicodeBOM() for more information on how this 
-BOM is written.  More information on what a BOM does is available at 
-http://unicode.org/faq/utf_bom.html .
-
-Defining LOGOG_UNICODE has several effects on logog.  First, this forces all
-logging functions to expect to receive string parameters as arrays of the 
-local wchar_t type instead of char types.  In other words, the LOGOG_CHAR 
-base type is redefined to wchar_t instead of char.  Second, this forces logog to route all
-Cout messages to wcout, and all Cerr messages to wcerr.
-
-A convenience macro, _LG(), is available (if you haven't defined LOGOG_USE_PREFIX)
-for easily switching your constant strings from ANSI to Unicode, based on the compilation
-value of LOGOG_UNICODE.  To use this macro, and hence to have all your code compile
-in both ANSI and Unicode modes, log in the following fashion:
-
-\code
-INFO(_LG("This informational message is displayed in both ANSI and Unicode builds."));
-WARN(LOGOG_CONST_STRING("And this one works regardless of the LOGOG_USE_PREFIX setting."));
-\endcode
-
-Mixing and matching both Unicode and ANSI messages in one application is not currently
-supported, as most compilers do not implement this functionality.
-
-<b>Windows specific issues</b>
-
-Windows platforms have special considerations when logging to the console with 
-wide characters via wcout or wcerr.  Because logog shares the console with its
-host application, it does not initialize the console in any way.  On Windows
-flavored platforms, the console must be initialized in a Unicode-friendly way.
-See http://blogs.msdn.com/b/michkap/archive/2008/03/18/8306597.aspx for details
-about how this might work.  
-
-One way of initializing a Windows console for Unicode support, which seems to 
-work, is as follows:
-
-\snippet test.cpp WindowsUnicodeSetup
-
-See also Microsoft's documentation at http://msdn.microsoft.com/en-us/library/tw4k6df8.aspx .
-
-\page pubsub Publisher-subscriber functionality
-
-Topic objects are a base class that provides publisher-subscriber
-features to subclasses.  Most classes in logog descend from the
-Topic class.
-
-Topics are capable of sending other topics (or themselves) to other
-subscribers, as well as receiving another topic from a publisher.
-See Topic::Send() and Topic::Receive() for more details.
-
-You can cause a Topic to send itself to its subscribers by calling
-Topic::Transmit().
-
-Topics can publish, unpublish, subscribe and unsubscribe themselves
-from other topics.  See Topic::Publish(), Topic::Unpublish(),
-Topic::Subscribe(), Topic::Unsubscribe() for more details.
-
-Topics can also do all these tasks to lists of other topics.
-See Topic::PublishToMultiple(), Topic::UnpublishToMultiple(),
-Topic::SubscribeToMultiple(), Topic::UnsubscribeToMultiple().
-
-\snippet test.cpp Subscription
-
-\page architecture Internal architecture 
-
-The logog system uses a publisher-subscriber model in order to handle 
-message flow from source to destination. While the higher-level class 
-architecture takes care of typical message routing, the standard message 
-flow can be changed to support advanced logging models. 
-
-A key base class is the Topic class. Topics contain strings and numeric 
-information representing a file name, line number, a free-form group 
-name, a free-form category name, and a free-form message string. Topics 
-know how to transmit and receive themselves to and from other topics, 
-but they don't know how to discover those other topics. They do know how 
-to negotiate with another topic in order to discover whether they should 
-subscribe to that other topic -- see Topic::CanSubscribeCheckTopic() for 
-details. Topics implement the core functionality of subscribing and 
-publishing. Topics can subscribe to multiple other topics, and they can 
-publish to multiple other topics. 
-
-Some Topic behavior, especially the subscriber-publisher behavior and 
-cross-thread locking, is subsumed into the Node class. Nodes should 
-generally not be instanced by themselves, as they are not sufficiently 
-functional to be useful. 
-
-Topics are subclassed into TopicSource and TopicSink classes. 
-TopicSources can only publish, and TopicSinks can only subscribe. 
-
-A Target is a TopicSink that is capable of rendering its subscriptions 
-to a logical output device. Targets include the Cout, Cerr, and the 
-OutputDebug classes. To make logog send output to some arbitrary new 
-destination, create a new Target subclass and override the 
-Target::Output() method, and instance a new element of your class at the 
-top of your program. 
-
-A Filter is a Topic that functions basically as a subscriber and a 
-publisher. It's used to limit the scope of incoming messages to a 
-particular type, group, or category. For example, a Filter may be used 
-to permit only messages with a level of LOGOG_LEVEL_WARN or higher to be 
-logged. Other messages are dropped. By default a filter will attempt to 
-subscribe itself to all existing Targets; however, this behavior may be 
-changed by overriding the Initialize() method within your Target 
-subclass, or by manually calling Target::Unpublish() on each Target that 
-you want the Filter to not publish to. 
-
-This design permits more advanced logging models. For example, it's 
-possible to have two Filters, one which filters for error messages and 
-logs those to the console, versus informational and warning messages, 
-which are logged to a file. Note that the routing of any of the 
-higher-level classes such as Filter or Output by simply instantiating a 
-Topic and manually calling PublishTo() and SubscribeTo() to the desired 
-inputs and outputs. 
-
-A Message is a sub-sub-class of TopicSource that knows how to publish 
-itself automatically to any outstanding Filter objects. A program will 
-typically instance a set of static Message objects and use them to 
-indicate execution of a certain point in the program. 
-
-String types receive their own custom class. Since logog spends a lot of 
-time shuffling strings from class to class, this permits string copies 
-to be fast constant-time operations (a copy of pointers). 
-
-All statically allocated elements are stored inside the Statics class. 
-This permits all items to be tracked and freed, thus assuring no memory 
-leaks. 
-
-In order to support cross-platform, multithread-safe support, logog 
-implements a Thread class, a Timer class, and a Mutex class. These of 
-course can be customized to support future platforms. 
-
-\page performance Performance topics
-
-Multiple memory allocations and frees are the bane of performance-oriented
-code.  STL is particularly naughty in this regard.
-
-To that end, logog attempts to do as few allocations as possible at run-time.
-Message objects are allocated exactly once, when a message macro is run for
-the first time.  Publisher-subscriber negotiation occurs at this time
-as well, which is when the pub-sub lists in the Filter objects get updated.
-This process happens only once per message, regardless of the number of times
-the message is invoked.  Therefore, messages that are never executed never
-allocate any memory, and the memory-allocation penalty for a message is incurred
-exactly once, the first time the message is transmitted.
-
-A platform-specific vsprintf() type function is used to convert the varargs
-in a message into a final destination string.  I looked at this problem
-for quite a while, and it seems that this method provides the best performance
-guarantees without relying on a large external library, such as Boost, or
-increasing the code size significantly.  A template-based approach for 
-running vsprintf type functions would theoretically be faster than calling
-vsprintf(); however, this would require the inclusion of a significant
-amount of template-based code to handle all the possible situations that
-vsprintf() must deal with.  This would likely double the existing code size;
-so I erred on the size of keeping logog smaller and more self-contained.
-
-If, after all that, you want to replace vsprintf() for your platform, it is
-called in only one place in the logog source code (in String.cpp).
-
-Because logog spends so much time passing strings around, logog provides a
-custom string class that internally represents strings as fixed buffers.
-This helps reduce the repeated allocations and frees that std::string is notorious
-for.
-
-Because most logging outputs can be slow, logog provides a LogBuffer class to
-help with \ref deferredoutput .
-
-\page locking Multithread locking and mutexes
-
-The Mutex object is responsible for multithread safety in logog.  All
-platforms support a Mutex object.  Only one thread may acquire
-a Mutex object at one time.  Other threads fall into a wait state until
-the locking thread releases the Mutex.
-
-The ScopedLock object is a convenient way to represent a Mutex lock
-as part of an object's auto scope.  To use a ScopedLock, create 
-a Mutex lock on a known thread, then create a ScopedLock with the
-previously defined Lock as a parameter.  Code is guaranteed to be
-single threaded within the scope of the ScopedLock.
-
-\snippet test.cpp SimpleLocking
-
-\page porting Porting logog 
-
-Porting logog should be a straightforward affair, if you follow these 
-guidelines. 
-
-First of all, you'll need to choose a flavor of operating system for 
-your platform. Nearly all OSes will fall into one of two flavors: 
-POSIX-like and Windows-like. platform.hpp tries to detect the local OS 
-and compile for it; you may need to change the detection logic for your 
-new platform.  You'll need to set either LOGOG_FLAVOR_POSIX or LOGOG_FLAVOR_WINDOWS
-before loading platform.hpp.
-
-The files containing platform dependent code are as follows. 
-
-- platform.hpp. In addition to detecting the build flavor, platform.hpp 
-also sets some macros for STL usage. All STL calls are routed through 
-the macros in platform.hpp. As of this writing, the STL templates are 
-available in tr1; you may need to tweak this if you're depending on a C++x11
-compiler.
-
-\snippet platform.hpp STLTypes
-
-- mutex.hpp. You'll need to write macros for your own LOGOG_MUTEX_* 
-calls:
-
-\snippet mutex.hpp Mutex
-
-- thread.hpp.  Write macros for LOGOG_THREAD, LOGOG_THREAD_CREATE and 
-LOGOG_THREAD_JOIN.  Since logog does not actually initiate multiple threads,
-this step can technically be skipped; however, unless threads are implemented
-for a target platform, the unit tests will fail.
-
-\snippet thread.hpp Thread
-
-- timer.hpp. Add code for the Timer initializer and the Get() function. 
-
-\snippet timer.cpp TimerGet
-
-Lastly, verify that unittest.cpp compiles and executes with a zero 
-return code. 
-
-\page requirements Requirements 
-
-logog assumes the existence of a C99 compliant C++ compiler. It uses 
-variadic macros in the C99 style, so any compiler that does not understand
-__VA_ARGS__ style message passing will not work.  The vast majority of 
-semi-modern compilers do.
-
-logog also has limited dependencies on STL.  These dependencies are represented
-by \#defines in the file platform.hpp.  If your STL lacks support for any 
-of these containers, or if you're using another STL-like container system,
-you may replace these \#defines and they will be used as logog's standard
-containers.
-
-\snippet platform.hpp STLTypes
-
-\page supportedplatforms Supported platforms
-
-logog has been demonstrated to work with the following platforms:
-
-- Microsoft Visual Studio 2008
-- Microsoft Visual Studio 2010 (x64 and x86)
-- Ubuntu 10.04 LTS
-- MacOS 10.7
-- Xbox 360
-- Sony PlayStation 3
-
-It is expected that logog should work on any reasonably
-POSIX-compliant or Windows-compliant operating system with minimal changes.
-Please see \ref porting for more information on support for alternative platforms.
-
-Since the console implementations are proprietary to the 
-platform holders, implementation details for these platforms have not been
-publicly provided.  However they may be provided to authorized and licensed
-platform developers if the platform holder permits; contact us if you're a
-licensed developer.
-
-\page license License agreement 
-
-logog is Copyright (c) 2011, Gigantic Software. 
-
-Permission is hereby granted, free of charge, to any person obtaining a 
-copy of this software and associated documentation files (the 
-"Software"), to deal in the Software without restriction, including 
-without limitation the rights to use, copy, modify, merge, publish, 
-distribute, sublicense, and/or sell copies of the Software, and to 
-permit persons to whom the Software is furnished to do so, subject to 
-the following conditions: 
-
-The above copyright notice and this permission notice shall be included 
-in all copies or substantial portions of the Software. 
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
-
-\page community Community and support
-
-Two mailing lists exist for general support and development discussion related to
-logog.  The first is for general logog questions and answers.  This mailing list is
-visible at 
-<a href="http://groups.google.com/group/logog">http://groups.google.com/group/logog</a>.
-All users of logog are invited to join this mailing list for general discussion and help.
-
-\htmlonly
-<table border=0 style="background-color: #fff; padding: 5px;" cellspacing=0>
-  <tr><td>
-  <img src="http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif"
-         height=30 width=140 alt="Google Groups">
-  </td></tr>
-  <tr><td style="padding-left: 5px">
-  <b>Subscribe to Logog</b>
-  </td></tr>
-  <form action="http://groups.google.com/group/logog/boxsubscribe">
-  <input type=hidden name="hl" value="en">
-  <tr><td style="padding-left: 5px;">
-  Email: <input type=text name=email>
-  <input type=submit name="sub" value="Subscribe">
-  </td></tr>
-</form>
-<tr><td align=right>
-  <a href="http://groups.google.com/group/logog?hl=en">Visit this group</a>
-</td></tr>
-</table>
-\endhtmlonly
-
-The second mailing list is for those who wish to actively participate in the
-development of logog.  The mailing list is visible at 
-<a href="http://groups.google.com/group/logog-devel">http://groups.google.com/group/logog-devel</a>.
-
-\htmlonly
-<table border=0 style="background-color: #fff; padding: 5px;" cellspacing=0>
-  <tr><td>
-  <img src="http://groups.google.com/intl/en/images/logos/groups_logo_sm.gif"
-         height=30 width=140 alt="Google Groups">
-  </td></tr>
-  <tr><td style="padding-left: 5px">
-  <b>Subscribe to Logog Development</b>
-  </td></tr>
-  <form action="http://groups.google.com/group/logog-devel/boxsubscribe">
-  <tr><td style="padding-left: 5px;">
-  Email: <input type=text name=email>
-  <input type=submit name="sub" value="Subscribe">
-  </td></tr>
-</form>
-<tr><td align=right>
-  <a href="http://groups.google.com/group/logog-devel">Visit this group</a>
-</td></tr>
-</table>
-\endhtmlonly
-
-The best way to get help with a specific problem is to submit an issue
-on Github.  You can review a list of current issues, or submit your own,
-<a href="https://github.com/johnwbyrd/logog/issues">here</a>.
-
-I'd REALLY like to get other developers involved in maintaining and further
-developing the code.  All sane developers encouraged to fork the <a href="https://github.com/johnwbyrd/logog">git repository</a> and 
-do bug fixing or new feature implementation.  Contact me at jbyrd at giganticsoftware dot com if you need administrative privileges on the master logog branch; I'm 
-actively looking to incorporate positive changes.
-
-\page othersystems Other logging frameworks and systems 
-
-Here are other logging and testing frameworks that have served as 
-inspiration (negative and/or positive) for logog. 
-
-\section pantheios Panetheios
-
-http://www.pantheios.org 
-
-Pantheios claims to compile to nothing in the final release case. 
-However, the Pantheios library depends on STLSoft, xTests, b64, and 
-shwild.
-
-\section marginean Petru Margenian's library in Dr. Dobb's Journal 
-
-http://drdobbs.com/cpp/201804215 
-
-Another interesting effort at a portable logging implementation. 
-This library depends on an atomic_ops library from HP, and 
-it won't mention this fact until you try to compile it.  Logging can be 
-enabled or disabled based on a single dimension ("level") and all 
-logging output ends up at stderr (there is no support for alternative 
-outputs). 
-
-\section glog glog, the Google logging library 
-
-http://code.google.com/p/google-glog/ 
-
-Provides logging to stderr, a file or syslog. Their ostream-style 
-logging methodology creates two sets of macros: one for macros that 
-compile away in release mode, one for macros that don't. Interesting (if 
-non portable) support for stack walking. 
-
-\section rlog rlog
-
-http://code.google.com/p/rlog/ 
-
-Uses a publisher-subscriber model for all objects, and demonstrated that 
-this basic architecture was highly appropriate for logging. Does not 
-play nicely with custom allocators.
-
-\section loki Loki
-
-http://loki-lib.sourceforge.net/ 
-
-The loki library demonstrates how to abstract platform-specific features
-like mutexes and threads in remarkably few lines of code.
-
-*/
-
-}
-
-/** \def LOGOG_UNICODE
- ** Define this macro to enable Unicode support in logog.  The logog library works either in Unicode mode or not --
- ** attempting to mix the two log types will have unexpected results.
- **/
-#define LOGOG_UNICODE 1
-
-/** \def LOGOG_INTERNAL_DEBUGGING
- ** Define this macro to debug logog itself.  This setting enables sanity checks on many logog functions.  This setting
- ** is not very useful for end users of logog. */
-#define LOGOG_INTERNAL_DEBUGGING 1
-
-/** \def LOGOG_LEAK_DETECTION
- ** Define this macro to check all memory allocations and frees.  This setting will check against double allocations
- ** and double deletes as well.  Do not enable this on production code -- it'll slow down the performance considerably.
- **/
- #define LOGOG_LEAK_DETECTION 1
-
-/** \def LOGOG_REPORT_ALLOCATIONS
- ** Define this macro to report on ALL allocations and frees that happen through logog.
- ** Enable this if you get paid by lines of program output. */
-#define LOGOG_REPORT_ALLOCATIONS 1
-
-/** \def LOGOG_COUT 
- ** This is equivalent to std::wcout if LOGOG_UNICODE is defined, and std::cout otherwise.
- **/
-
-/** \def LOGOG_CERR
- ** This is equivalent to std::wcerr if LOGOG_UNICODE is defined, and std::cerr otherwise.
- **/
diff --git a/ThirdParty/logog/doxyfile b/ThirdParty/logog/doxyfile
deleted file mode 100644
index 371353e1c5609e7839cd0878d80c93607666f216..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/doxyfile
+++ /dev/null
@@ -1,1716 +0,0 @@
-# Doxyfile 1.7.4
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a hash (#) is considered a comment and will be ignored.
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING      = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME           = logog
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER         =
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer
-# a quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF          = "logger optimized for games"
-
-# With the PROJECT_LOGO tag one can specify an logo or icon that is
-# included in the documentation. The maximum height of the logo should not
-# exceed 55 pixels and the maximum width should not exceed 200 pixels.
-# Doxygen will copy the logo to the output directory.
-
-PROJECT_LOGO           =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = doc
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
-# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
-
-OUTPUT_LANGUAGE        = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC    = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH        =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful if your file system
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF      = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
-# interpret the first line (until the first dot) of a Qt-style
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF           = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN   = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL   = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given extension.
-# Doxygen has a built-in mapping, but you can override or extend it using this
-# tag. The format is ext=language, where ext is a file extension, and language
-# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
-# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
-# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
-# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
-
-EXTENSION_MAPPING      =
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also makes the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT    = YES
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT        = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT            = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate getter
-# and setter methods for a property. Setting this option to YES (the default)
-# will make doxygen replace the get and set methods by a property in the
-# documentation. This will only work if the methods are indeed getting or
-# setting a simple type. If this is not the case, or you want to show the
-# methods anyway, you should set this option to NO.
-
-IDL_PROPERTY_SUPPORT   = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
-# unions are shown inside the group in which they are included (e.g. using
-# @ingroup) instead of on a separate page (for HTML and Man pages) or
-# section (for LaTeX and RTF).
-
-INLINE_GROUPED_CLASSES = NO
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT   = NO
-
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penalty.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will roughly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols
-
-SYMBOL_CACHE_SIZE      = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS  = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
-# anonymous namespaces are hidden.
-
-EXTRACT_ANON_NSPACES   = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = YES
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
-# will list include files with double quotes in the documentation
-# rather than with sharp brackets.
-
-FORCE_LOCAL_INCLUDES   = NO
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
-SORT_BRIEF_DOCS        = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
-# will sort the (brief and detailed) documentation of class members so that
-# constructors and destructors are listed first. If set to NO (the default)
-# the constructors will appear in the respective orders defined by
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
-# hierarchy of group names into alphabetical order. If set to NO (the default)
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES       = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME     = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
-# do proper type resolution of all parameters of a function it will reject a
-# match between the prototype and the implementation of a member function even
-# if there is only one candidate or it is obvious which candidate to choose
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
-# will still accept a match between prototype and implementation in such cases.
-
-STRICT_PROTO_MATCHING  = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or macro consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and macros in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        =YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES       = NO
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
-# Folder Tree View (if specified). The default is YES.
-
-SHOW_FILES             = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page.
-# This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
-
-SHOW_NAMESPACES        = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. The create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option.
-# You can optionally specify a file name after the option, if omitted
-# DoxygenLayout.xml will be used as the name of the layout file.
-
-LAYOUT_FILE            =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
-WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file($line) : $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE           =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT                  = include doc test
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
-# the list of possible encodings.
-
-INPUT_ENCODING         = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
-# *.f90 *.f *.for *.vhd *.vhdl
-
-FILE_PATTERNS          = *.dox *.c *.cpp *.hpp *.h 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS        =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH           = test/ include/ src/
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS       =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH             =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-# If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER           =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis.
-# Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match.
-# The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty or if
-# non of the patterns match the file name, INPUT_FILTER is applied.
-
-FILTER_PATTERNS        =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
-# and it is also possible to disable source filtering for a specific pattern
-# using *.ext= (so without naming a filter). This option only has effect when
-# FILTER_SOURCE_FILES is enabled.
-
-FILTER_SOURCE_PATTERNS =
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.
-# Otherwise they will link to the documentation.
-
-REFERENCES_LINK_SOURCE = NO
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
-USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header. Note that when using a custom header you are responsible
-# for the proper inclusion of any scripts and style sheets that doxygen
-# needs, which is dependent on the configuration options used.
-# It is adviced to generate a default header using "doxygen -w html
-# header.html footer.html stylesheet.css YourConfigFile" and then modify
-# that header. Note that the header is subject to change so you typically
-# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!
-
-HTML_HEADER            =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER            =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that
-# the files will be copied as-is; there are no commands or markers available.
-
-HTML_EXTRA_FILES       =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
-# Doxygen will adjust the colors in the stylesheet and background images
-# according to this color. Hue is specified as an angle on a colorwheel,
-# see http://en.wikipedia.org/wiki/Hue for more information.
-# For instance the value 0 represents red, 60 is yellow, 120 is green,
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
-# The allowed range is 0 to 359.
-
-HTML_COLORSTYLE_HUE    = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
-# the colors in the HTML output. For a value of 0 the output will use
-# grayscales only. A value of 255 will produce the most vivid colors.
-
-HTML_COLORSTYLE_SAT    = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
-# the luminance component of the colors in the HTML output. Values below
-# 100 gradually make the output lighter, whereas values above 100 make
-# the output darker. The value divided by 100 is the actual gamma applied,
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
-# and 100 does not change the gamma.
-
-HTML_COLORSTYLE_GAMMA  = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting
-# this to NO can help when comparing the output of multiple runs.
-
-HTML_TIMESTAMP         = YES
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS     = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded. For this to work a browser that supports
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
-
-HTML_DYNAMIC_SECTIONS  = YES
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-
-GENERATE_DOCSET        = NO
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
-# can be grouped.
-
-DOCSET_FEEDNAME        = "Doxygen generated docs"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID       = com.giganticsoftware.logog
-
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-
-DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
-
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
-
-DOCSET_PUBLISHER_NAME  = Gigantic Software
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE               =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
-
-CHM_INDEX_ENCODING     =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
-# that can be used as input for Qt's qhelpgenerator to generate a
-# Qt Compressed Help (.qch) of the generated HTML documentation.
-
-GENERATE_QHP           = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
-# The path specified is relative to the HTML output folder.
-
-QCH_FILE               =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#namespace
-
-QHP_NAMESPACE          = com.giganticsoftware.logog
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
-
-QHP_VIRTUAL_FOLDER     = doc
-
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
-# add. For more information please see
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
-
-QHP_CUST_FILTER_NAME   =
-
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
-# Qt Help Project / Custom Filters</a>.
-
-QHP_CUST_FILTER_ATTRS  =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's
-# filter section matches.
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
-# Qt Help Project / Filter Attributes</a>.
-
-QHP_SECT_FILTER_ATTRS  =
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
-# .qhp file.
-
-QHG_LOCATION           =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
-#  will be generated, which together with the HTML files, form an Eclipse help
-# plugin. To install this plugin and make it available under the help contents
-# menu in Eclipse, the contents of the directory containing the HTML and XML
-# files needs to be copied into the plugins directory of eclipse. The name of
-# the directory within the plugins directory should be the same as
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
-# the help appears.
-
-GENERATE_ECLIPSEHELP   = NO
-
-# A unique identifier for the eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have
-# this name.
-
-ECLIPSE_DOC_ID         = com.giganticsoftware.logog
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX          = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML
-# documentation. Note that a value of 0 will completely suppress the enum
-# values from appearing in the overview section.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to YES, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
-# Windows users are probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW      = YES
-
-# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
-# and Class Hierarchy pages using a tree view instead of an ordered list.
-
-USE_INLINE_TREES       = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
-# links to external symbols imported via tag files in a separate window.
-
-EXT_LINKS_IN_WINDOW    = NO
-
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
-# to force them to be regenerated.
-
-FORMULA_FONTSIZE       = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are
-# not supported properly for IE 6.0, but are supported on all modern browsers.
-# Note that when changing this option you need to delete any form_*.png files
-# in the HTML output before the changes have effect.
-
-FORMULA_TRANSPARENT    = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
-# (see http://www.mathjax.org) which uses client side Javascript for the
-# rendering instead of using prerendered bitmaps. Use this if you do not
-# have LaTeX installed or if you want to formulas look prettier in the HTML
-# output. When enabled you also need to install MathJax separately and
-# configure the path to it using the MATHJAX_RELPATH option.
-
-USE_MATHJAX            = NO
-
-# When MathJax is enabled you need to specify the location relative to the
-# HTML output directory using the MATHJAX_RELPATH option. The destination
-# directory should contain the MathJax.js script. For instance, if the mathjax
-# directory is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the
-# mathjax.org site, so you can quickly see the result without installing
-# MathJax, but it is strongly recommended to install a local copy of MathJax
-# before deployment.
-
-MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box
-# for the HTML output. The underlying search engine uses javascript
-# and DHTML and should work on any modern browser. Note that when using
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
-# (GENERATE_DOCSET) there is already a search function so this one should
-# typically be disabled. For large projects the javascript based search engine
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
-
-SEARCHENGINE           = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a PHP enabled web server instead of at the web client
-# using Javascript. Doxygen will generate the search PHP script and index
-# file to put on the web server. The advantage of the server
-# based approach is that it scales better to large projects and allows
-# full text search. The disadvantages are that it is more difficult to setup
-# and does not have live searching capabilities.
-
-SERVER_BASED_SEARCH    = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX         = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-# Note that when enabling USE_PDFLATEX this option is only used for
-# generating bitmaps for formulas in the HTML output, but not in the
-# Makefile that is written to the output directory.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
-# the generated latex document. The footer should contain everything after
-# the last chapter. If it is left blank doxygen will generate a
-# standard footer. Notice: only use this tag if you know what you are doing!
-
-LATEX_FOOTER           =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include
-# source code with syntax highlighting in the LaTeX output.
-# Note that which sources are shown also depends on other settings
-# such as SOURCE_BROWSER.
-
-LATEX_SOURCE_CODE      = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF            = YES
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN           = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD                =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader.
-# This is useful
-# if you want to understand what is going on.
-# On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF     = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH           =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS  =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED             = DOXYGEN LOGOG_UNICODE=1 LOGOG_INTERNAL_DEBUGGING=1 LOGOG_LEAK_DETECTION=1 LOGOG_REPORT_ALLOCATIONS=1
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition that
-# overrules the definition found in the source code.
-
-EXPAND_AS_DEFINED      =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all references to function-like macros
-# that are alone on a line, have an all uppercase name, and do not end with a
-# semicolon, because these will confuse the parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-#
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-#
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option also works with HAVE_DOT disabled, but it is recommended to
-# install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = NO
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
-# allowed to run in parallel. When set to 0 (the default) doxygen will
-# base this on the number of processors available in the system. You can set it
-# explicitly to a value larger than 0 to get control over the balance
-# between CPU load and processing speed.
-
-DOT_NUM_THREADS        = 0
-
-# By default doxygen will write a font called Helvetica to the output
-# directory and reference it in all dot files that doxygen generates.
-# When you want a differently looking font you can specify the font name
-# using DOT_FONTNAME. You need to make sure dot is able to find the font,
-# which can be done by putting it in a standard location or by setting the
-# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
-# containing the font.
-
-DOT_FONTNAME           = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
-# The default size is 10pt.
-
-DOT_FONTSIZE           = 10
-
-# By default doxygen will tell dot to use the output directory to look for the
-# FreeSans.ttf font (which doxygen will put there itself). If you specify a
-# different font using DOT_FONTNAME you can set the path where dot
-# can find it using this tag.
-
-DOT_FONTPATH           =
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH           = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will generate a graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH        = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are svg, png, jpg, or gif.
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS           =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the
-# \mscfile command).
-
-MSCFILE_DIRS           =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES    = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
-# a graph (i.e. they become hard to read).
-
-DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
-DOT_CLEANUP            = YES
diff --git a/ThirdParty/logog/include/api.hpp b/ThirdParty/logog/include/api.hpp
deleted file mode 100644
index 6d98f4b343c987752c339b9fe4aad3022d93cc9d..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/api.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * \file api.hpp Initialization and shutdown functions for logog.
- */
-
-#ifndef __LOGOG_API_HPP__
-#define __LOGOG_API_HPP__
-
-namespace logog
-{
-//! [INIT_PARAMS]
-/**
- * To initialize the memory manager with non-default values, allocate a temporary INIT_PARAMS structure, fill it with
- * zeros, and then change the individual entries in the INIT_PARAMS struct before passing as a parameter to Initialize().
- * \sa Initialize
- */
-struct INIT_PARAMS
-{
-    /** A pointer to a function that allocates memory.  By default logog allocates using malloc().  Change this pointer
-     ** before passing to Initialize() to use your own custom memory allocator.
-     * \sa logog::Initialize()
-     */
-    void *( *m_pfMalloc )( size_t );
-
-    /** A pointer to a function that frees memory.  By default logog frees using free().  Change this pointer
-     * before passing to Initialize() to use your own custom memory allocator.
-     * \sa logog::Initialize()
-     */
-    void ( *m_pfFree )( void * );
-};
-//! [INIT_PARAMS]
-
-/** Initializes the logog system.  No logog calls or allocations may be made before calling this function; expect
- * crashes if you haven't called this at the top of your program.
- * \param params The address of an INIT_PARAMS structure you have already allocated on the heap, or NULL to
- * use default values.
- * \sa INIT_PARAMS
- */
-extern int Initialize( INIT_PARAMS *params = NULL );
-
-/** Shuts down the logog system and frees all memory allocated by logog.  Memory still allocated by the logog system after Shutdown() indicates
- ** a bug.
- **/
-extern int Shutdown( );
-
-}
-
-#endif // __LOGOG_API_HPP
diff --git a/ThirdParty/logog/include/checkpoint.hpp b/ThirdParty/logog/include/checkpoint.hpp
deleted file mode 100644
index 05c8ba1f7a43a06ad242bf0edd8fb93970bb3310..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/checkpoint.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * \file checkpoint.hpp Representations of a program counter reaching a specific point in code.
- */
-
-#ifndef __LOGOG_CHECKPOINT_HPP__
-#define __LOGOG_CHECKPOINT_HPP__
-
-namespace logog
-{
-/** A checkpoint is a topic that fires when a specific section of code is executed.  The first time a bit of
- ** code is executed, a Checkpoint is instanced, and when the code is executed again, the Checkpoint is
- ** reused.
- **/
-class Checkpoint : public TopicSource
-{
-public:
-    Checkpoint( const LOGOG_LEVEL_TYPE level = LOGOG_LEVEL_ALL,
-                const LOGOG_CHAR *sFileName = NULL,
-                const int nLineNumber = 0,
-                const LOGOG_CHAR *sGroup = NULL,
-                const LOGOG_CHAR *sCategory = NULL,
-                const LOGOG_CHAR *sMessage = NULL,
-                const double dTimestamp = 0.0f );
-
-    /** Sends the node in question.  Optionally updates the timestamp in this checkpoint before sending the node. */
-    virtual int Send( const Topic &node );
-
-};
-}
-
-#endif // __LOGOG_CHECKPOINT_HPP_
diff --git a/ThirdParty/logog/include/const.hpp b/ThirdParty/logog/include/const.hpp
deleted file mode 100644
index 2608447595d3e8034e054a0513522a28492acc4b..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/const.hpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * \file const.hpp Constants.
- */
-
-#ifndef __LOGOG_CONST_HPP__
-#define __LOGOG_CONST_HPP__
-
-#ifndef LOGOG_FORMATTER_MAX_LENGTH
-/** The maximum length of a single line that a formatter may output, in LOGOG_CHAR units. */
-#define LOGOG_FORMATTER_MAX_LENGTH ( 1024 * 16 )
-#endif
-
-#ifndef LOGOG_DEFAULT_LOG_BUFFER_SIZE
-/** The default size of a RingBuffer object for buffering outputs. */
-#define LOGOG_DEFAULT_LOG_BUFFER_SIZE ( 4 * 1024 * 1024 )
-#endif
-
-
-/** \addtogroup levelsettings Level Settings
- ** These are level settings for logog.  These settings are valid for the LOGOG_LEVEL compilation flag.  To enable
- ** all logog messages, use the compilation flag -DLOGOG_LEVEL=LOGOG_LEVEL_ALL.  To disable all logog messages
- ** (and effectively remove logog code from your executable) use the compilation flag -DLOGOG_LEVEL=LOGOG_LEVEL_NONE.
- ** \sa LOGOG_LEVEL
- ** @{
- **/
-//! [Level Constants]
-#define LOGOG_LEVEL_NONE		0
-#define LOGOG_LEVEL_EMERGENCY	8
-#define LOGOG_LEVEL_ALERT		16
-#define LOGOG_LEVEL_CRITICAL	24
-#define LOGOG_LEVEL_ERROR		32
-#define LOGOG_LEVEL_WARN		40
-#define LOGOG_LEVEL_WARN1		48
-#define LOGOG_LEVEL_WARN2		56
-#define LOGOG_LEVEL_WARN3		64
-#define LOGOG_LEVEL_INFO		72
-#define LOGOG_LEVEL_DEBUG		80
-#define LOGOG_LEVEL_ALL			88
-//! [Level Constants]
-
-#define LOGOG_LEVEL_TYPE		int
-
-#ifndef LOGOG_LEVEL
-#define LOGOG_LEVEL LOGOG_LEVEL_DEBUG
-#endif
-
-/** @} */
-
-/** \addtogroup topicbitstype Topic Bits Type
-  * Bit flags representing whether a topic cares about a specific field or not.  1 = care, 0 = don't care.
-  * @{
-  */
-//! [Topic Bits]
-typedef enum
-{
-	TOPIC_LEVEL_FLAG =			0x01,
-	TOPIC_LINE_NUMBER_FLAG =	0x02,
-	TOPIC_FILE_NAME_FLAG =		0x04,
-	TOPIC_GROUP_FLAG =			0x08,
-	TOPIC_CATEGORY_FLAG =		0x10,
-	TOPIC_MESSAGE_FLAG =		0x20,
-	TOPIC_TIMESTAMP_FLAG =		0x40,
-	/** Bits 0 through TOPIC_COUNT turned on */
-	TOPIC_ALL = 0x7f
-} TopicBitsType;
-//! [Topic Bits]
-
-/** @} */
-
-typedef int TOPIC_FLAGS;
-
-//! [Topic Offsets]
-/** Offsets within the m_vIntProps and m_vStringProps arrays for this topic. */
-typedef enum
-{
-	TOPIC_LEVEL = 0,
-	TOPIC_LINE_NUMBER = 1,
-	/** This must be the number of integer fields. */
-	TOPIC_INT_COUNT = 2,
-
-	TOPIC_FILE_NAME = 0,
-	TOPIC_GROUP = 1,
-	TOPIC_CATEGORY = 2,
-	TOPIC_MESSAGE = 3,
-	/** This must be the number of string fields for this topic. */
-	TOPIC_STRING_COUNT = 4
-} TopicOffsetType;
-//! [Topic Offsets]
-
-#endif // __LOGOG_CONST_HPP__
diff --git a/ThirdParty/logog/include/formatter.hpp b/ThirdParty/logog/include/formatter.hpp
deleted file mode 100644
index b3b8378290a854c2720d57ad2e712b1cc118cebc..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/formatter.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * \file formatter.hpp Formats a topic into human-readable, compiler lookalike format.
- */
-
-#ifndef __LOGOG_FORMATTER_HPP__
-#define __LOGOG_FORMATTER_HPP__
-
-namespace logog
-{
-
-#define LOGOG_TIME_STRING_MAX 80
-
-/** A helper object for generating a current timestamp as a string. */
-class TimeStamp : public Object
-{
-public:
-	/** Returns a pointer to a string representing the current time.  Note!  This pointer is only
-	 ** valid while this object is valid -- if you destroy this object, this pointer is no longer
-	 ** valid.
-	 */
-	const char *Get();
-
-protected:
-	char cTimeString[ LOGOG_TIME_STRING_MAX ]; 
-};
-
-/** Converts a topic into a human-readable string for printing or otherwise rendering to a target. */
-class Formatter : public Object
-{
-public:
-	Formatter();
-
-    /** Causes this formatter to format a topic into its own m_sMessageBuffer field, and thence to
-     ** return a reference to that string.  This function must be written to be efficient; it will be called
-     ** for every logging operation.  It is strongly recommended not to allocate or free memory in this function.
-     **/
-    virtual LOGOG_STRING &Format( const Topic &topic, const Target &target ) = 0;
-
-	/** Causes the time of day to be rendered, if it needs to be rendered.  This function is only supported on
-	 ** ANSI builds, not Unicode, as the underlying functions are ANSI only.
-	 */
-	virtual void RenderTimeOfDay();
-
-	/** In the base case, this function calls GetTopicFlags() on the provided 
-	 ** topic in order to figure out which fields this formatter should render.
-	 ** However, subclasses of the Formatter class can override this function in order
-	 ** to change the default fields that the topic wants to be rendered.  For example,
-	 ** you can turn off the TOPIC_LINE_NUMBER_FLAG and the TOPIC_FILE_NAME_FLAG
-	 ** in order to disable these fields from being rendered in your own Formatter
-	 ** subclass.
-	 ** \param topic The topic whose flags are to be determined
-	 ** \return The set of flags representing the topics that really need to be rendered.
-	 **/
-	virtual TOPIC_FLAGS GetTopicFlags( const Topic &topic );
-
-	/** Should this formatter render the current time of day? */
-	bool GetShowTimeOfDay() const;
-
-	/** Sets whether this formatter renders the current time of day. */
-	void SetShowTimeOfDay(bool val);
-
-protected:
-    const LOGOG_CHAR *ErrorDescription( const LOGOG_LEVEL_TYPE level );
-
-    LOGOG_STRING m_sMessageBuffer;
-    LOGOG_STRING m_sIntBuffer;
-
-	bool m_bShowTimeOfDay;
-};
-
-class FormatterGCC : public Formatter
-{
-public:
-    virtual LOGOG_STRING &Format( const Topic &topic, const Target &target );
-
-};
-
-class FormatterMSVC : public Formatter
-{
-public:
-    virtual LOGOG_STRING &Format( const Topic &topic, const Target &target );
-};
-
-extern Formatter &GetDefaultFormatter();
-extern void DestroyDefaultFormatter();
-
-}
-
-#endif // __LOGOG_FORMATTER_HPP_
diff --git a/ThirdParty/logog/include/logog.hpp b/ThirdParty/logog/include/logog.hpp
deleted file mode 100644
index e4c343c811f66843e7ab5b72e1a7e8712c204ee3..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/logog.hpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * \file logog.hpp Main include file for logog logging functionality.  Include this file to enable logging for your application.
- */
-
-#ifndef __LOGOG_HPP__
-#define __LOGOG_HPP__
-
-/** \def LOGOG_UNICODE
- ** Define this macro to enable Unicode support in logog.  The logog library works either in Unicode mode or not --
- ** attempting to mix the two log types will have unexpected results.
- **/
-// #define LOGOG_UNICODE 1
-
-#include "const.hpp"
-#include "platform.hpp"
-#include "statics.hpp"
-#include "object.hpp"
-#include "timer.hpp"
-#include "mutex.hpp"
-#include "string.hpp"
-#include "node.hpp"
-#include "topic.hpp"
-#include "formatter.hpp"
-#include "target.hpp"
-// #include "socket.hpp"
-#include "checkpoint.hpp"
-#include "api.hpp"
-#include "message.hpp"
-#include "macro.hpp"
-
-#ifdef LOGOG_UNIT_TESTING
-#include "thread.hpp"
-#include "unittest.hpp"
-#endif
-
-#endif // __LOGOG_HPP_
diff --git a/ThirdParty/logog/include/macro.hpp b/ThirdParty/logog/include/macro.hpp
deleted file mode 100644
index 97b661f8a3879f7fd1792f6cf0c8174b6efca5b8..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/macro.hpp
+++ /dev/null
@@ -1,240 +0,0 @@
-/**
- * \file macro.hpp Macros for instantiation of a message.
- */
-
-#ifndef __LOGOG_MACRO_HPP__
-#define __LOGOG_MACRO_HPP__
-
-namespace logog
-{
-#ifdef LOGOG_USE_PREFIX
-#define LOGOG_PREFIX LOGOG_
-#endif // LOGOG_USE_PREFIX
-
-#ifndef LOGOG_GROUP
-/** This is the current group for created messages.  Set this to NULL if you
-  * want messages to not be part of any specific group.
-  */
-#define LOGOG_GROUP NULL
-#endif
-
-#ifndef LOGOG_CATEGORY
-/** This is the current category for created messages.  Set this to NULL if you
-  * want messages to not be part of any specific group.
-  */
-#define LOGOG_CATEGORY NULL
-#endif
-
-/** When you have a macro replacement, the preprocessor will only expand the macros recursively
- * if neither the stringizing operator # nor the token-pasting operator ## are applied to it.
- * So, you have to use some extra layers of indirection, you can use the token-pasting operator
- * with a recursively expanded argument.
- */
-#define TOKENPASTE2(x, y) x ## y
-/** \sa TOKENPASTE2(x, y) */
-#define TOKENPASTE(x, y) TOKENPASTE2(x, y)
-
-/** This macro is used when a message is instantiated without any varargs
-  * provided by the user.  It locks a global mutex, creates the message,
-  * locks it, transmits it, and releases all locks.
-  */
-#define LOGOG_LEVEL_GROUP_CATEGORY_MESSAGE_NO_VA( level, group, cat, msg ) \
-{ \
-	Mutex *___pMCM = &GetMessageCreationMutex(); \
-	___pMCM->MutexLock(); \
-	static logog::Message *TOKENPASTE(_logog_,__LINE__) = new logog::Message( level, \
-		LOGOG_CONST_STRING( __FILE__ ), \
-		__LINE__ , \
-		LOGOG_CONST_STRING( group ), \
-		LOGOG_CONST_STRING( cat ), \
-		msg; \
-	___pMCM->MutexUnlock(); \
-	TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexLock(); \
-	TOKENPASTE(_logog_,__LINE__)->Transmit(); \
-	TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexUnlock(); \
-}
-
-/** This macro is used when a message is instantiated with varargs provided
-  * by the user.  It locks a global mutex, creates the message, locks it,
-  * formats the message string inside the message, transmits it, 
-  * and releases all locks.
-  * When logog is shut down, it may be started back up again later.  Therefore,
-  * logog needs a way to flag all static Message pointers that they need
-  * to be recreated.  We manually simulate a static Message pointer by 
-  * implementing it via a static bool.  The bool is turned on the first time
-  * this code is run.
-  * NOTE!  A subtle race condition exists in the following code, that will ONLY occur
-  * if logog is shut down at the same moment that a log message is processed from
-  * another thread than the one calling the shutdown.  The Message object could
-  * theoretically be destroyed from another thread just before it's locked
-  * in a thread that calls the Format() and Transmit() calls on it.  I'm not
-  * sure if this is really a bug -- technically, this race condition will
-  * occur only if you are calling log messages right on top of the SHUTDOWN
-  * call from the main thread.
-  */
-#define LOGOG_LEVEL_GROUP_CATEGORY_MESSAGE( level, group, cat, formatstring, ... ) \
-{ \
-	::logog::Mutex *___pMCM = &::logog::GetMessageCreationMutex(); \
-	___pMCM->MutexLock(); \
-	static bool TOKENPASTE(_logog_static_bool_,__LINE__) = false; \
-	static logog::Message * TOKENPASTE(_logog_,__LINE__); \
-	if ( TOKENPASTE(_logog_static_bool_,__LINE__) == false ) \
-	{ \
-		TOKENPASTE(_logog_,__LINE__) = \
-			new logog::Message( level, \
-				LOGOG_CONST_STRING( __FILE__ ), \
-				__LINE__ , \
-				LOGOG_CONST_STRING( group ), \
-				LOGOG_CONST_STRING( cat ), \
-				LOGOG_CONST_STRING( "" ), \
-				0.0f, \
-				& (TOKENPASTE(_logog_static_bool_,__LINE__)) ); \
-	} \
-	___pMCM->MutexUnlock(); \
-	/* A race condition could theoretically occur here if you are shutting down at the same instant as sending log messages. */ \
-	TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexLock(); \
-	TOKENPASTE(_logog_,__LINE__)->Format( formatstring, ##__VA_ARGS__ ); \
-	TOKENPASTE(_logog_,__LINE__)->Transmit(); \
-	TOKENPASTE(_logog_,__LINE__)->m_Transmitting.MutexUnlock(); \
-}
-
-/** Calls LOGOG_LEVEL_GROUP_CATEGORY_MESSAGE with the current LOGOG_GROUP and
-  * LOGOG_CATEGORY setting.
-  */
-#define LOGOG_LEVEL_MESSAGE( level, formatstring, ... ) \
-	LOGOG_LEVEL_GROUP_CATEGORY_MESSAGE( level, LOGOG_GROUP, LOGOG_CATEGORY, formatstring, ##__VA_ARGS__ )
-
-/** Calls LOGOG_LEVEL_MESSAGE with the current LOGOG_LEVEL setting. */
-#define LOGOG_MESSAGE( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL, formatstring, ##__VA_ARGS__ )
-
-
-#if LOGOG_LEVEL >= LOGOG_LEVEL_DEBUG
-/** Logs a message at the DEBUG reporting level. */
-#define LOGOG_DEBUG( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_DEBUG, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_DEBUG( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL >= LOGOG_LEVEL_INFO
-/** Logs a message at the INFO reporting level. */
-#define LOGOG_INFO( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_INFO, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_INFO( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_WARN3
-/** Logs a message at the WARN3 reporting level. */
-#define LOGOG_WARN3( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN3, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_WARN3( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_WARN2
-/** Logs a message at the WARN2 reporting level. */
-#define LOGOG_WARN2( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN2, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_WARN2( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_WARN1
-/** Logs a message at the WARN1 reporting level. */
-#define LOGOG_WARN1( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN1, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_WARN1( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_WARN
-/** Logs a message at the WARN reporting level. */
-#define LOGOG_WARN( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_WARN, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_WARN( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_ERROR
-/** Logs a message at the ERROR reporting level. */
-#define LOGOG_ERROR( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_ERROR, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_ERROR( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_CRITICAL
-/** Logs a message at the CRITICAL reporting level. */
-#define LOGOG_CRITICAL( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_CRITICAL, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_CRITICAL( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_ALERT
-/** Logs a message at the ALERT reporting level. */
-#define LOGOG_ALERT( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_ALERT, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_ALERT( formatstring, ... ) {};
-#endif
-
-#if LOGOG_LEVEL	>= LOGOG_LEVEL_EMERGENCY
-/** Logs a message at the EMERGENCY reporting level. */
-#define LOGOG_EMERGENCY( formatstring, ... ) \
-	LOGOG_LEVEL_MESSAGE( LOGOG_LEVEL_EMERGENCY, formatstring, ##__VA_ARGS__ )
-#else
-#define LOGOG_EMERGENCY( formatstring, ... ) {};
-#endif
-
-#define LOGOG_SET_LEVEL( level ) \
-	::logog::SetDefaultLevel( level );
-
-/** Define this compilation flag if your compilation environment conflicts with
-  * any of the shorthand logging macros in macro.hpp.
-  */
-#ifndef LOGOG_USE_PREFIX
-/* If you get compilation errors in this section, then define the flag LOGOG_USE_PREFIX during compilation, and these
- * shorthand logging macros won't exist -- you'll need to use the LOGOG_* equivalents above.
- */
-/* We can't use DEBUG in Win32 unfortunately, so we use DBUG for shorthand here. */
-//! [Shorthand]
-/** \sa LOGOG_DEBUG */
-#define DBUG(...) LOGOG_DEBUG( __VA_ARGS__ )
-/** \sa LOGOG_INFO */
-#define INFO(...) LOGOG_INFO( __VA_ARGS__ )
-/** \sa LOGOG_WARN3 */
-#define WARN3(...) LOGOG_WARN3( __VA_ARGS__ )
-/** \sa LOGOG_WARN2 */
-#define WARN2(...) LOGOG_WARN2( __VA_ARGS__ )
-/** \sa LOGOG_WARN1 */
-#define WARN1(...) LOGOG_WARN1( __VA_ARGS__ )
-/** \sa LOGOG_WARN */
-#define WARN(...) LOGOG_WARN( __VA_ARGS__ )
-/** \sa LOGOG_ERROR */
-#define ERR(...) LOGOG_ERROR( __VA_ARGS__ )
-/** \sa LOGOG_ALERT */
-#define ALERT(...) LOGOG_ALERT( __VA_ARGS__ )
-/** \sa LOGOG_CRITICAL */
-#define CRITICAL(...) LOGOG_CRITICAL( __VA_ARGS__ )
-/** \sa LOGOG_EMERGENCY */
-#define EMERGENCY(...) LOGOG_EMERGENCY( __VA_ARGS__ )
-//! [Shorthand]
-#endif
-
-/** Call this function to initialize logog and prepare for logging. 
-  * \sa logog::Initialize()
-  */
-#define LOGOG_INITIALIZE(...)  logog::Initialize( __VA_ARGS__ );
-
-/** Call this function to shut down logog and release all memory allocated.
-  * \sa logog::Shutdown()
-  */
-
-#define LOGOG_SHUTDOWN()   logog::Shutdown();
-
-} // namespace logog
-
-#endif // __LOGOG_MACRO_HPP_
diff --git a/ThirdParty/logog/include/message.hpp b/ThirdParty/logog/include/message.hpp
deleted file mode 100644
index c7d7dc659c9f2ca706a99c34180712f727a01911..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/message.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * \file message.hpp Messages; items transmitted to a log.
- */
-
-#ifndef __LOGOG_MESSAGE_HPP__
-#define __LOGOG_MESSAGE_HPP__
-
-namespace logog
-{
-
-/** A message is a piece of text that's actually transmitted to outputs.  Messages can be asked to 
- ** Transmit() themselves once they are created.
- **/
-class Message : public Checkpoint
-{
-public:
-    Message( const LOGOG_LEVEL_TYPE level = LOGOG_LEVEL_ALL,
-             const LOGOG_CHAR *sFileName = NULL,
-             const int nLineNumber = 0,
-             const LOGOG_CHAR *sGroup = NULL,
-             const LOGOG_CHAR *sCategory = NULL,
-             const LOGOG_CHAR *sMessage = NULL,
-             const double dTimestamp = 0.0f,
-			 bool *bIsCreated = NULL );
-
-	virtual ~Message();
-
-    /** Causes this checkpoint to republish itself to all existing filters after
-      * unpublishing itself.  This can be necessary if the message within this
-      * message has changed in such a way that the downstream Filter objects
-      * might react differently to it.
-      */
-    virtual bool Republish();
-
-	Mutex m_Transmitting;
-	bool *m_pbIsCreated;
-};
-
-extern Mutex &GetMessageCreationMutex();
-extern void DestroyMessageCreationMutex();
-
-}
-
-
-#endif // __LOGOG_MESSAGE_HPP_
diff --git a/ThirdParty/logog/include/mutex.hpp b/ThirdParty/logog/include/mutex.hpp
deleted file mode 100644
index c9916f0eaa568e0c486d84036526289c34b64782..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/mutex.hpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * \file mutex.hpp Defines a mutual exclusion object for the current platform.
- */
-
-#ifndef __LOGOG_MUTEX_HPP__
-#define __LOGOG_MUTEX_HPP__
-
-#ifdef LOGOG_FLAVOR_POSIX
-#include <pthread.h>
-#endif
-
-namespace logog
-{
-
-//! [Mutex]
-#ifndef LOGOG_MUTEX
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-#define LOGOG_MUTEX(x)           CRITICAL_SECTION (x);
-#define LOGOG_MUTEX_INIT(x)      InitializeCriticalSection (x)
-#define LOGOG_MUTEX_DELETE(x)    DeleteCriticalSection (x)
-#define LOGOG_MUTEX_LOCK(x)      EnterCriticalSection (x)
-#define LOGOG_MUTEX_UNLOCK(x)    LeaveCriticalSection (x)
-#define LOGOG_MUTEX_CTOR(x)
-#endif // LOGOG_FLAVOR_WINDOWS
-
-#ifdef LOGOG_FLAVOR_POSIX
-#define LOGOG_MUTEX(x)           pthread_mutex_t (x);
-#define LOGOG_MUTEX_INIT(x)      pthread_mutex_init(x, 0)
-#define LOGOG_MUTEX_DELETE(x)    pthread_mutex_destroy (x)
-#define LOGOG_MUTEX_LOCK(x)      pthread_mutex_lock (x)
-#define LOGOG_MUTEX_UNLOCK(x)    pthread_mutex_unlock (x)
-#define LOGOG_MUTEX_CTOR(x)
-#endif // LOGOG_FLAVOR_POSIX
-#endif // LOGOG_MUTEX
-
-#ifndef LOGOG_MUTEX
-#error You need to define mutex macros for your platform; please see mutex.hpp
-#endif
-
-//! [Mutex]
-
-/** An object that can only be locked by one thread at a time.  Implement the LOGOG_MUTEX_* functions for your platform
- * to support the Mutex object.
- * A mutex is intended to be used with the ScopedLock object to implement critical sections within logog.
- * \sa ScopedLock
- */
-class Mutex : public Object
-{
-public:
-    Mutex();
-    ~Mutex();
-    /** Acquires a lock on the mutex.  Only one thread is permitted to lock the mutex at one time. */
-    void MutexLock();
-    /** Releases the lock on the mutex. */
-	void MutexUnlock();
-
-protected:
-    Mutex(const Mutex &);
-    Mutex & operator = (const Mutex &);
-
-    LOGOG_MUTEX( m_Mutex )
-};
-
-/** Asserts a lock while this object exists and is in scope.  A ScopedLock should be
- * declared in "auto" format, typically on the stack.
- */
-class ScopedLock : public Object
-{
-public :
-    /** Instances and locks a ScopedLock.
-     * \param mutex The mutex to attempt to lock.  Program execution halts at this point until the lock can be obtained.
-     */
-    ScopedLock( Mutex &mutex );
-    ~ScopedLock();
-protected:
-    /** A pointer to the lockable mutex. */
-    Mutex *m_pMutex;
-
-private:
-    /* no default constructor */
-    ScopedLock();
-    /* no copy constructor */
-    ScopedLock( const ScopedLock &other );
-};
-
-#ifdef LOGOG_LEAK_DETECTION
-extern Mutex s_AllocationsMutex;
-extern void LockAllocationsMutex();
-extern void UnlockAllocationsMutex();
-#endif // LOGOG_LEAK_DETECTION
-
-extern Mutex &GetStringSearchMutex();
-extern void DestroyStringSearchMutex();
-
-}
-
-#endif // __LOGOG_MUTEX_HPP_
diff --git a/ThirdParty/logog/include/node.hpp b/ThirdParty/logog/include/node.hpp
deleted file mode 100644
index 8174635b4821c521d681d8b77c73a0bcc655bf06..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/node.hpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * \file node.hpp Base class for higher-level logog objects.
- */
-
-#ifndef __LOGOG_NODE_HPP__
-#define __LOGOG_NODE_HPP__
-
-namespace logog
-{
-/** The base class for most high-level logog objects.  Represents the publisher-subscriber
- ** model within logog. */
-class Node;
-
-/** An aggregation of nodes.  Internally, we choose a set representation because we want to be able to traverse
- ** the aggregation quickly while still looking up entries quickly.
- **/
-typedef LOGOG_SET< Node *, std::less< Node * >, Allocator< Node * > > NodesType;
-
-/** A type that double inherits from NodesType and Mutex.  A lockable NodesType.  Handles the copy
- ** case correctly.
- **/
-class LockableNodesType : public NodesType, public Mutex
-{
-public:
-    /** A LockableNodesType shouldn't copy the internal Mutex when it is copied, but it
-     ** should copy all the internal nodes.
-     **/
-    LockableNodesType & operator = (const LockableNodesType &other);
-};
-
-extern LockableNodesType &GetStaticNodes( void ** pvLocation );
-
-/** Returns a reference to the global nodes group.  Allocates a new global node group if one does not already
- ** exist.
- */
-extern LockableNodesType &AllNodes();
-
-/** Returns a reference to the group of nodes that are capable of subscribing.  Allocates a new global subscriber
- ** node group if one does not already exist.
- */
-extern LockableNodesType &AllSubscriberNodes();
-
-/** Returns a reference to the group of nodes that are capable of both subscribing as well as publishing.  Allocates a new global subscriber
- ** node group if one does not already exist.
- */
-extern LockableNodesType &AllFilters();
-
-/** Returns a reference to the group of nodes that represent terminals in the graph, i.e. nodes that can't publish. */
-extern LockableNodesType &AllTargets();
-
-class Node : public Object
-{
-public:
-
-    /** All nodes self-register as part of the all-nodes database. */
-    Node();
-
-    ~Node();
-
-    /** Call this function immediately after creating a node (or any of the children of the node class.)  This function currently
-     ** registers the node as part of the list of subscriber nodes, if this node may in fact subscribe.
-     ** If this node is capable of subscribing at all, then this function registers this node as a possible subscriber.
-     ** Doing this helps to keep down the number of nodes we search, when we are determining which nodes a new node
-     ** might subscribe to.  We have to do this registration as a second step, after the node is completely
-     ** initialized, as subscriberness is determined late in initialization.
-     **/
-    virtual void Initialize();
-
-    /** Can a node send notifications?  By default they can; later subclasses may not be able to. */
-    virtual bool CanPublish() const;
-    /** Can a node receive notifications?  By default they can; later subclasses may not be able to. */
-    virtual bool CanSubscribe() const;
-    /** Is this node interested in receiving notifications from another topic? */
-    virtual bool CanSubscribeTo( const Node & );
-
-    /** In order to avoid bringing in a bunch of RTTI stuff, we permit nodes to be asked whether they're topics or not */
-    virtual bool IsTopic() const;
-
-    /** Causes this node to begin publishing events to the given subscriber.
-     ** \param subscriber The node to receive published events
-     ** \return true if the request was successful, false if the subscriber was already subscribed
-     **/
-    virtual bool PublishTo( Node &subscriber );
-
-    /** Causes this node to attempt to publish to some other nodes. */
-    virtual bool PublishToMultiple( LockableNodesType &nodes );
-
-    /** Causes this node to stop publishing events to this subscriber.
-     ** \param subscriber The node to stop receiving events
-     ** \return true if successful, false if the subscriber was not being published to in the first place
-     **/
-    virtual bool UnpublishTo( Node &subscriber );
-
-    /** Causes this node to attempt to unpublish to some other nodes. */
-    virtual bool UnpublishToMultiple( LockableNodesType &nodes );
-
-    /** Causes this node to start receiving events from the given publisher.
-     ** \param publisher The node to start receiving events from
-     ** \return true if successful, false if the publisher was already subscribed
-     **/
-    virtual bool SubscribeTo( Node &publisher );
-
-    /** Causes this node to attempt to subscribe to some other nodes. */
-    virtual bool SubscribeToMultiple( LockableNodesType &nodes );
-
-
-    /** Causes this node to unsubscribe from the given publisher's events.
-    ** \param publisher The publisher to unsubscribe from
-    ** \return true if successful, false if the node was already unsubscribed
-    **/
-    virtual bool UnsubscribeTo( Node &publisher );
-
-    /** Causes this node to attempt to unsubscribe to some other nodes. */
-    virtual bool UnsubscribeToMultiple( LockableNodesType &nodes );
-
-    void Clear();
-
-
-    /** A pointer to any custom data you need to store for a node. */
-    void *m_pUserData1;
-
-    /** A pointer to any custom data you need to store for a node. */
-    void *m_pUserData2;
-
-protected:
-    /** A bunch of nodes that are interested in what this node has to report. */
-    LockableNodesType	m_Subscribers;
-
-    /** A bunch of nodes that this node interested in hearing from. */
-    LockableNodesType	m_Publishers;
-};
-
-extern void DestroyNodesList( void **pvList );
-
-/** Destroys all nodes currently recorded.  This happens at shutdown time.  NOTE!  If you have allocated
- ** your own logog items and free them yourself AFTER this call, exciting crashes will occur.
- **/
-extern void DestroyAllNodes();
-
-}
-
-#endif // __LOGOG_NODE_HPP_
diff --git a/ThirdParty/logog/include/object.hpp b/ThirdParty/logog/include/object.hpp
deleted file mode 100644
index 2ecbf5806dae9e7c96f6406c677a426caeedb0c0..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/object.hpp
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- * \file object.hpp Base class for all allocated logog objects.
- */
-
-#ifndef __LOGOG_OBJECT_HPP__
-#define __LOGOG_OBJECT_HPP__
-
-namespace logog
-{
-
-#ifdef LOGOG_LEAK_DETECTION
-/** Iteration over an unordered map is slow, but we only do it at shutdown time.  Access to a lookup or insert
- ** is very fast.  Additionally, we do not allocate leak detection records from our own heap; it saves us from
- ** doing a recursive allocation.
- **/
-typedef void *PointerType;
-
-/** A type describing the currently outstanding memory allocations.  Note that this type does not inherit from
- ** Object, because to do so would create an infinite recursion when memory is allocated.
- **/
-typedef LOGOG_UNORDERED_MAP< PointerType, size_t > AllocationsType;
-
-/** All currently outstanding memory allocations, including their size.  */
-extern AllocationsType s_Allocations;
-
-/** A global function to lock the global allocations mutex.  We must do this as a static
- ** void because Mutexes depend on Objects.  This should probably belong in a class, but then
- ** we get recursive class definitions.
- ** */
-extern void LockAllocationsMutex();
-
-/** A global function to unlock the global allocations mutex.  We must do this as a static
- ** void because Mutexes depend on Objects. */
-extern void UnlockAllocationsMutex();
-#endif // LOGOG_LEAK_DETECTION
-
-#ifdef new
-#define LOGOG_PREVIOUS_DEFINITION_OF_NEW new
-#undef new
-#endif
-#ifdef delete
-#define LOGOG_PREVIOUS_DEFINITION_OF_DELETE delete
-#undef delete
-#endif	//delete
-
-/** Base class for all objects allocated with logog. */
-class Object
-{
-public:
-    Object();
-	/* Some builds complain about ~Object() being virtual... sorry lint :( */
-    virtual ~Object();
-    /** Initializes an object of size new. */
-    void *operator new( size_t nSize );
-    /** Initializes an array of size new. */
-    void *operator new[](size_t nSize);
-
-	/* There's a wonderful behavior in Windows MFC in debug builds that causes it 
-	 * to attempt to redefine NEW with a macro if we're compiling in debug mode
-	 * and we're using Gdiplus as well.  In that case, Windows attempts to redefine
-	 * new with a macro for everything that has a new.  This wonderful behavior 
-	 * is worked around here.  See http://support.microsoft.com/kb/317799/EN-US/
-	 * and http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/0df13145-670e-4070-b0a1-61794b20dff7
-	 * for more exciting information.
-	 */
-#ifdef _DEBUG
-#ifdef LOGOG_FLAVOR_WINDOWS
-	void* operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
-	void* operator new[](size_t nSize, LPCSTR lpszFileName, int nLine);
-	void  operator delete(void* ptr, LPCSTR lpszFileName, int nLine);
-	void  operator delete[](void* ptr, LPCSTR lpszFileName, int nLine);
-#endif // LOGOG_FLAVOR_WINDOWS
-#endif // _DEBUG
-
-    /** Deletes an object pointed to by ptr. */
-    void operator delete( void *ptr );
-    /** Deletes an object array pointed to by ptr. */
-    void operator delete[]( void *ptr );
-
-    /** Allocates nSize bytes of memory.  You must call logog::Initialize() before calling this function.
-     * \sa Initialize()
-     */
-    static void *Allocate( size_t nSize );
-
-    /** Deallocate a pointer previously acquired by Allocate(). */
-    static void Deallocate( void *ptr );
- };
-
-#ifdef LOGOG_PREVIOUS_DEFINITION_OF_NEW
-#define new LOGOG_PREVIOUS_DEFINITION_OF_NEW
-#endif 
-
-#ifdef LOGOG_PREVIOUS_DEFINITION_OF_DELETE
-#define delete GA_PREVIOUS_DEFINITION_OF_DELETE
-#endif
-
-/** An STL-compatible allocator which redirects all memory requests to the logog allocator.  Used for all STL-like classes within logog. */
-template <class T>
-class Allocator
-{
-public:
-    /** Memory allocation size type. */
-    typedef size_t    size_type;
-    /** Memory allocation comparison type. */
-    typedef ptrdiff_t difference_type;
-    /** A pointer to T type. */
-    typedef T        *pointer;
-    /** A const pointer to T type. */
-    typedef const T  *const_pointer;
-    /** A reference to T type. */
-    typedef T        &reference;
-    /** A const reference to T type. */
-    typedef const T  &const_reference;
-    /** A value type (T itself). */
-    typedef T         value_type;
-
-    Allocator() {}
-    /** Not implemented here -- required by the STL standard though. */
-    Allocator( const Allocator & ) {}
-
-    /** Allocate and return n value_types of memory through this allocator.  Requires that logog::Initialize() has been called. */
-    pointer   allocate( size_type n, const void * = 0 )
-    {
-        T *t = ( T * ) Object::Allocate( n * sizeof( value_type ) );
-        return t;
-    }
-
-    /** Frees memory previously allocated by allocate(). */
-    void      deallocate( void *p, size_type )
-    {
-        if ( p )
-        {
-            Object::Deallocate( p );
-        }
-    }
-
-    /** Returns the address of a reference to T. */
-    pointer           address( reference x ) const
-    {
-        return &x;
-    }
-    /** Returns the address of a const reference to T. */
-    const_pointer     address( const_reference x ) const
-    {
-        return &x;
-    }
-    /** STL required override for = operator. */
-    Allocator<T>&  operator=( const Allocator & )
-    {
-        return *this;
-    }
-    /** Constructs a new T at location p with value val. */
-    void              construct( pointer p, const T &val )
-    {
-        new(( T * ) p ) T( val );
-    }
-    /** Destroys a T at location p. */
-    void              destroy( pointer p )
-    {
-#ifdef LOGOG_FLAVOR_WINDOWS
-        // MSVC tends to complain unless we reference this pointer here.
-        p;
-#endif // LOGOG_FLAVOR_WINDOWS
-        p->~T();
-    }
-
-    /** The largest size of an object that can be allocated with this allocator. */
-    size_type         max_size() const
-    {
-        return size_t( -1 );
-    }
-
-    /** Rebinding to permit allocations of unknown types.  Part of std::allocator definition.
-     * \param other The other "unknown" type to be permitted access to this allocator */
-    template <class U>
-    struct rebind
-    {
-        /** The "other" class that will use this allocator for its allocation. */
-        typedef Allocator<U> other;
-    };
-
-    /** Required by STL -- unused here. */
-    template <class U>
-    Allocator( const Allocator<U>& ) {}
-
-    /** Permit this allocator to be used for assignment in other classes */
-    template <class U>
-    Allocator &operator=( const Allocator<U>& )
-    {
-        return *this;
-    }
-};
-
-/* All specializations of this allocator are interchangeable. */
-template <class T1, class T2>
-bool operator== ( const Allocator<T1>&,
-                  const Allocator<T2>& )
-{
-    return true;
-}
-template <class T1, class T2>
-bool operator!= ( const Allocator <T1>&,
-                  const Allocator<T2>& )
-{
-    return false;
-}
-
-//
-
-/** Returns the current number of outstanding memory allocations in logog.  Returns -1 iff LOGOG_LEAK_DETECTION
- ** has not been defined at compile time.
- **/
-extern int MemoryAllocations();
-
-/** Sends a report to cout describing the current memory allocations that exist.  Returns the outstanding number of
- ** memory allocations, or -1 iff LOGOG_LEAK_DETECTION is defined.
- **/
-extern int ReportMemoryAllocations();
-
-}
-#endif // __LOGOG_OBJECT_HPP
diff --git a/ThirdParty/logog/include/platform.hpp b/ThirdParty/logog/include/platform.hpp
deleted file mode 100644
index 67415bd85bde413709a17bbb5d005ade139c1efc..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/platform.hpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- * \file platform.hpp Platform specific detection and defines, including STL overrides
- */
-
-#ifndef __LOGOG_PLATFORM_HPP__
-#define __LOGOG_PLATFORM_HPP__
-
-#ifdef DOXYGEN
-/** Set this compilation flag to 1 to indicate that this is a Windows-like platform, e.g. Win32, Win64, Xbox 360, etc. */
-#define LOGOG_FLAVOR_WINDOWS 1
-/**  Set this compilation flag to 1 to indicate that this is a Posix-like platform, e.g. Linux, PS3, etc. */
-#define LOGOG_FLAVOR_POSIX 1
-#endif
-
-#ifndef LOGOG_FLAVOR_WINDOWS
-#ifndef LOGOG_FLAVOR_POSIX
-
-/* The user hasn't told us which flavor we're running on, so we must make a guess as to which platform is valid. */
-
-/* If this is MSVC, then it's Windows like */
-#ifdef _MSC_VER
-#define LOGOG_FLAVOR_WINDOWS 1
-#endif // _MSC_VER
-
-/* gcc probably means Posix */
-#ifdef __GNUC__
-#define LOGOG_FLAVOR_POSIX 1
-#endif
-
-#ifdef __CYGWIN__
-#ifdef LOGOG_UNICODE
-#error LOGOG_UNICODE not supported on Cygwin platform because Cygwin does not support vsnwprintf
-#endif
-/* Cygwin lacks vsnprintf support in headers but it's in the libraries.  First we
- * need to define the constants size_t and va_list, then define vsnprintf */
-#include <cstdio>
-#include <cstdlib>
-#include <cstdarg>
-extern int vsnprintf(char *str, size_t size, const char *format, va_list ap);
-#define LOGOG_USE_TR1 1
-#endif // __CYGWIN__
-
-#ifdef __linux__
-#define LOGOG_USE_TR1 1
-#endif
-
-#ifdef __APPLE__
-#ifndef __clang__
-#define LOGOG_USE_TR1 1
-#else
-#if !(__has_include(<unordered_map>))
-#define LOGOG_USE_TR1 1
-#endif // !(__has_include(<unordered_map>))
-#endif // __clang
-#endif // __APPLE__
-
-/* Detect IBM's XL C++ */
-#ifdef __IBMCPP__
-// Enable use of TR1 unorderd_map etc.
-#define __IBMCPP_TR1__ 1
-#ifdef __PPC__
-#define LOGOG_FLAVOR_POSIX 1
-#endif // __PPC__
-#endif // __IBMCPP__
-
-/* If we've recognized it already, it's a relatively modern compiler */
-#if defined( LOGOG_FLAVOR_WINDOWS ) || defined( LOGOG_FLAVOR_POSIX )
-#define LOGOG_HAS_UNORDERED_MAP 1
-#endif // defined(...)
-
-/* PS3 */
-#ifdef SN_TARGET_PS3
-#include "proprietary/ps3.hpp"
-#endif
-
-#endif // LOGOG_FLAVOR_POSIX
-#endif // LOGOG_FLAVOR_WINDOWS
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-/* Detect Xbox 360 */
-#if _XBOX_VER >= 200
-#include "proprietary/xbox360.hpp"
-#else
-/* Windows has been detected. */
-
-/** Microsoft's CRT library has its own leak detection mechanism.  If you don't trust logog's
- ** LOGOG_LEAK_DETECTION, you can enable LOGOG_LEAK_DETECTION_WINDOWS to enable
- ** Microsoft's version.  This really doesn't belong in platform.hpp -- feel
- ** free to refactor this into a Windows-specific header.
- **/
-#ifdef LOGOG_LEAK_DETECTION_WINDOWS
-#define _CRTDBG_MAP_ALLOC
-#include <stdlib.h>
-#include <crtdbg.h>
-
-#ifdef _DEBUG
-#ifndef DBG_NEW
-#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
-#define new DBG_NEW
-#endif
-#endif  // _DEBUG
-#endif // LOGOG_LEAK_DETECTION_WINDOWS
-
-#include "windows.h"
-#endif // _XBOX_VER
-#endif // LOGOG_FLAVOR_WINDOWS
-
-#ifndef LOGOG_FLAVOR_WINDOWS
-#ifndef LOGOG_FLAVOR_POSIX
-#error Platform flavor not detected.  Please see platform.hpp to configure this platform.
-#endif
-#endif
-
-// For the FILE type.
-#include <cstdio>
-// For POSIX file access.
-#include <cstdlib>
-// For Ubuntu 11 and ptrdiff_t
-#include <cstddef>
-
-#include <ctime>
-
-#if defined(LOGOG_LEAK_DETECTION) || defined(LOGOG_INTERNAL_DEBUGGING)
-#include <cstdio>
-#include <iostream>
-#endif // LOGOG_LEAK_DETECTION || LOGOG_INTERNAL_DEBUGGING
-
-#ifdef LOGOG_FLAVOR_POSIX
-#include <sys/time.h>
-// for uint64_t
-#include <inttypes.h>
-#include <wchar.h>
-// for strstr support
-#include <cstring>
-#endif
-
-// For Unicode support
-#include <typeinfo>
-
-/* ----------------------------------------------------------- */
-/* Here's the stuff your compiler may have a problem with...   */
-
-//! [STLTypes]
-
-/** The definition for a hash type in logog.  You can replace it here with your own set compatible class if needed. */
-#define LOGOG_HASH			std::tr1::hash
-/** The definition for an unordered map type in logog.  You can replace it here with your own unordered_map compatible class if needed. */
-
-#ifdef LOGOG_HAS_UNORDERED_MAP
-#ifdef LOGOG_USE_TR1
-#include <tr1/unordered_map>
-#else
-#include <unordered_map>
-#endif // LOGOG_USE_TR1
-#ifdef _GLIBCXX_UNORDERED_MAP
-#define LOGOG_UNORDERED_MAP	std::unordered_map
-#else // _GLIBCXX_UNORDERED_MAP
-#define LOGOG_UNORDERED_MAP	std::tr1::unordered_map
-#endif  // _GLIBCXX_UNORDERED_MAP
-#else // LOGOG_HAS_UNORDERED_MAP
-#include <hash_map>
-#define LOGOG_UNORDERED_MAP std::hash_map
-#endif // LOGOG_HAS_UNORDERED_MAP
-
-/** An internal consistency error has been detected in logog.  */
-#define LOGOG_INTERNAL_FAILURE	abort();
-
-/* ----------------------------------------------- */
-/* Here's the stuff that's pretty standard in STL by now. */
-
-/** The definition for a pair type in logog.  You can replace it here with your own pair compatible class if needed. */
-#define LOGOG_PAIR			std::pair
-#include <list>
-/** The definition for a list type in logog.  You can replace it here with your own list compatible class if needed. */
-#define LOGOG_LIST			std::list
-#include <vector>
-/** The definition for a vector type in logog.  You can replace it here with your own vector compatible class if needed. */
-#define LOGOG_VECTOR		std::vector
-#include <set>
-/** The definition for a set type in logog.  You can replace it here with your own set compatible class if needed. */
-#define LOGOG_SET			std::set
-/** The definition for STL "equal to" in logog.  You can replace it here with your own set compatible class if needed. */
-#define LOGOG_EQUAL_TO		std::equal_to
-
-//! [STLTypes]
-
-/** The default port number that logog uses to communicate via TCP/UDP */
-#define LOGOG_DEFAULT_PORT	9987
-
-/** We use va_list for formatting messages. */
-#include <cstdarg>
-
-
-
-#endif // __LOGOG_PLATFORM_HPP
diff --git a/ThirdParty/logog/include/socket.hpp b/ThirdParty/logog/include/socket.hpp
deleted file mode 100644
index 8417eeb89f9d12328012e28419bc6eb405a9be0e..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/socket.hpp
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * \file socket.hpp Cross-platform socket abstractions
- */
-
-/**
- * \todo Socket support is unfinished and is not working yet.  Please review socket.hpp if you'd like to implement
- * a cross-platform socket abstraction.
- */
-#ifndef __LOGOG_SOCKET_HPP_
-#define __LOGOG_SOCKET_HPP_
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-#pragma comment(lib, "wsock32.lib")
-#endif
-
-#include <memory.h>
-
-namespace logog
-{
-/** A sending or receiving socket to be used as a target. */
-class Socket : public Target
-{
-public:
-    static int Initialize()
-    {
-        static bool bInitialized = false;
-
-        if ( !bInitialized )
-        {
-#ifdef LOGOG_FLAVOR_WINDOWS
-            WORD wVersionRequested;
-            WSADATA wsaData;
-            int err;
-            wVersionRequested = MAKEWORD( 2, 2 );
-
-            err = WSAStartup( wVersionRequested, &wsaData );
-
-            if ( err != 0 )
-            {
-#ifdef LOGOG_INTERNAL_DEBUGGING
-                LOGOG_COUT << _LG("WSAStartup failed with error: ") <<  err << endl;
-#endif
-                return 1;
-            }
-
-#endif
-        }
-
-        bInitialized = true;
-
-        return 0;
-    }
-
-    static void Shutdown()
-    {
-#ifdef LOGOG_FLAVOR_WINDOWS
-        WSACleanup();
-#endif
-    }
-
-    static const int MAXHOSTNAME = 255;
-
-    Socket(
-        int type = SOCK_STREAM,
-        int port = LOGOG_DEFAULT_PORT
-    )
-    {
-        m_Socket = -1;
-        m_nType = type;
-        m_nPort = port;
-    }
-
-    virtual void Close()
-    {
-#ifdef LOGOG_FLAVOR_WINDOWS
-        closesocket( m_Socket );
-#endif
-#ifdef LOGOG_FLAVOR_POSIX
-        close( m_Socket );
-#endif
-    }
-
-#ifdef NYI
-    virtual int Create( int type,
-                        int port )
-    {
-        char myname[MAXHOSTNAME+1];
-        int err;
-        struct sockaddr_in sa;
-        struct hostent *hp;
-
-        memset( &sa, 0, sizeof( struct sockaddr_in ) ); /* clear our address */
-        gethostname( myname, MAXHOSTNAME );         /* who are we? */
-        hp= gethostbyname( myname );                /* get our address info */
-
-        if ( hp == NULL )                           /* we don't exist !? */
-            return -1;
-
-        sa.sin_family= hp->h_addrtype;              /* this is our host address */
-        sa.sin_port= (u_short)htons( (u_short)port );                /* this is our port number */
-
-        if (( m_Socket = socket( AF_INET, type, 0 ) ) < 0 ) /* create socket */
-            return -1;
-
-        if ( bind( m_Socket,  (struct sockaddr*) &sa, sizeof( struct sockaddr_in ) ) < 0 )
-        {
-            Close();
-            return -1;
-        }
-
-        if (( err = SetNonBlocking() ) != 0 )
-            return err;
-    }
-
-#endif // NYI
-
-    virtual int SetNonBlocking()
-    {
-        int err;
-
-#ifdef LOGOG_FLAVOR_POSIX
-        int flags;
-        flags = socket_fcntl( m_Socket, F_GETFL, 0 );
-        flags |= O_NONBLOCK;
-        err = socket_fcntl( m_Socket, F_SETFL, flags );
-#endif
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-        unsigned long parg;
-        parg = 1;
-        err = ioctlsocket( m_Socket, FIONBIO, &parg );
-#endif
-        return err;
-    }
-
-    virtual int Output( const LOGOG_STRING &output ) = 0;
-
-protected:
-    int m_Socket;
-    int m_nType;
-    int m_nPort;
-};
-
-class SocketServer : Socket
-{
-
-};
-}
-
-#endif // __LOGOG_CHECKPOINT_HPP_
diff --git a/ThirdParty/logog/include/statics.hpp b/ThirdParty/logog/include/statics.hpp
deleted file mode 100644
index 938bd3d23a6f96921275a5aafe3501ad4b0780a6..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/statics.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*!
- * \file statics.hpp Static variables simultaneously assigned for all instances of logog.
- */
-
-#ifndef __LOGOG_STATICS_HPP__
-#define __LOGOG_STATICS_HPP__
-
-
-namespace logog
-{
-
-class Timer;
-class Formatter;
-class Target;
-class Mutex;
-
-extern void DestroyAllNodes();
-extern void DestroyGlobalTimer();
-extern void DestroyDefaultFormatter();
-extern void DestroyStringSearchMutex();
-extern void DestroyMessageCreationMutex();
-
-/* Technically this information should be in node.hpp but statics is responsible for
- * this global list.
- */
-class Statics
-{
-public:
-    /** A pointer to the malloc() compatible function used by logog.  See logog::Initialize()
-     ** for more details. */
-    void *(*s_pfMalloc)( size_t );
-    /** A pointer to the free() compatible function used by logog.  See logog::Initialize()
-     ** for more details. */
-    void (*s_pfFree)( void * );
-    /** Pointers to all the currently existing nodes in the network. */
-    void *s_pAllNodes;
-    /** Pointers to only those nodes that are capable of subscribing. */
-    void *s_pAllSubscriberNodes;
-    /** Pointers to only those nodes that are capable of subscribing and publishing. */
-    void *s_pAllFilterNodes;
-    /** Pointers to the group of all valid targets. */
-    void *s_pAllTargets;
-    /** Pointer to the default filter, if any. */
-    void *s_pDefaultFilter;
-    /** The default global shared timer.  All events are generally in reference to this timer, though yoy may create your own timers. */
-    Timer *s_pTimer;
-    /** A lock on the KMP search for all strings.  Prevents mutex explosions.  */
-    void *s_pStringSearchMutex;
-    /** A lock for creating messages.  Prevents dual message creation from multiple threads. */
-    Mutex *s_pMessageCreationMutex;
-    /** The default Formatter for all targets.  Targets may use their individual formatters as well if preferred. */
-    Formatter *s_pDefaultFormatter;
-    /** The number of sockets created. */
-    int s_nSockets;
-    /** A pointer to this object; used for final destruction. */
-    Statics *s_pSelf;
-
-    Statics();
-	~Statics();
-
-	/** Resets all statics to startup values.  Releases memory allocated by statics. */
-    void Reset();
-
-};
-
-extern Statics &Static();
-
-/** Destroys the Static() structure.  Calls to Static() after calling DestroyStatic() will probably crash your
- ** program.
- */
-extern void DestroyStatic();
-
-}
-#endif // __LOGOG_STATICS_HPP
diff --git a/ThirdParty/logog/include/string.hpp b/ThirdParty/logog/include/string.hpp
deleted file mode 100644
index e069b3a26fc939f1163416b57e45710dea797a9e..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/string.hpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * \file string.hpp Defines the logog string class.
- */
-#ifndef __LOGOG_STRING_HPP__
-#define __LOGOG_STRING_HPP__
-
-/** \def LOGOG_UNICODE
- ** Define this typedef in order to support wide characters in all logog strings.
- ** \sa _LG
- ** */
-
-#ifdef LOGOG_UNICODE
-/** logog has detected Unicode; therefore a LOGOG_CHAR is a wide character. */
-typedef wchar_t LOGOG_CHAR;
-/** This is a naughty little hack.  If we're using Unicode, then we append an
- * L to your const string.  However, we have several situations in which that string will actually be a NULL or 0
- * value in code, and the string will be rendered as L0 or LNULL.  In that case, we catch it with yet another 
- * macro.  Hacky, but seems to do the trick.  Beware of conflicts with existing code though...!
- */
-#define L0 (const LOGOG_CHAR *)'\0'
-#define LNULL (const LOGOG_CHAR *)'\0'
-#define L__null (const LOGOG_CHAR *)'\0'
-
-/* Two indirect references are necessary in order to expand a string and append the L to it. */
-#define LOGOG_CONST_STRING_INDIRECT(x) L ## x
-/* This macro will cause a const string to be stored as a Unicode string on a Unicode build. */
-#define LOGOG_CONST_STRING(x) LOGOG_CONST_STRING_INDIRECT(x)
-#define LOGOG_COUT  std::wcout
-#define LOGOG_CERR  std::wcerr
-
-#else // LOGOG_UNICODE
-
-/** logog has not detected Unicode; therefore a LOGOG_CHAR is simply a char. */
-typedef char LOGOG_CHAR;
-/** This macro will cause a const string to be stored as an ANSI string on an ANSI build, and as a Unicode string
- * on a Unicode build.
- */
-#define LOGOG_CONST_STRING(x) (x)
-#define LOGOG_COUT  std::cout
-#define LOGOG_CERR  std::cerr
-#endif // LOGOG_UNICODE
-
-/** If this constant is defined, then you can use the shorthand macro _LG in your code to represent a constant
-  * string.
-  */
-#ifndef LOGOG_USE_PREFIX
-/** The _LG() macro is defined only if LOGOG_USE_PREFIX is not defined.  _LG() can be used to describe 
- ** a const string that is compiled to either as Unicode
- * or ANSI, based on the setting of the LOGOG_UNICODE flag.
- * _LG() is not needed if you don't need Unicode support.  If you want your messages to work with both Unicode 
- * as well as ANSI builds of logog, preface them like this: _LG("This const string works on Unicode as well as ANSI.")
- */
-#define _LG( x ) LOGOG_CONST_STRING( x )
-#endif 
-
-namespace logog
-{
-	class String : public Object
-	{
-	public:
-
-		static const size_t npos = (size_t) -1;
-
-		String();
-		virtual ~String();
-		virtual void Free();
-		static size_t Length( const LOGOG_CHAR *chars );
-
-		String( const String &other );
-		String( const LOGOG_CHAR *pstr );
-		String & operator =( const String & other);
-		String & operator =( const LOGOG_CHAR *pstr );
-		size_t size() const;
-		virtual void clear();
-		virtual size_t reserve( size_t nSize );
-		virtual size_t reserve_for_int();
-		virtual operator const LOGOG_CHAR *() const;
-		virtual size_t assign( const String &other );
-		virtual size_t append( const String &other );
-		virtual size_t append( const LOGOG_CHAR *other );
-		virtual void reverse( LOGOG_CHAR* pStart, LOGOG_CHAR* pEnd);
-		virtual size_t assign( const int value );
-		virtual size_t append( const LOGOG_CHAR c );
-		virtual bool is_valid() const;
-		virtual size_t assign( const LOGOG_CHAR *other, const LOGOG_CHAR *pEnd = NULL );
-
-		virtual size_t find( String &other ) const;
-		virtual void format( const LOGOG_CHAR *cFormatString, ... );
-		virtual void format_va( const LOGOG_CHAR *cFormatString, va_list args );
-
-		virtual const LOGOG_CHAR* c_str() const;
-
-	protected:
-		virtual void Initialize();
-
-		/* Code modified from http://www-igm.univ-mlv.fr/~lecroq/string/node8.html#SECTION0080 */
-		void preKmp(size_t m);
-
-		size_t KMP( const LOGOG_CHAR *y, size_t n );
-
-#define LOGOG_MAX( a, b ) ( ( a > b ) ? a : b )
-
-		size_t BM(LOGOG_CHAR *y, size_t n);
-
-		LOGOG_CHAR *m_pBuffer;
-		LOGOG_CHAR *m_pOffset;
-		LOGOG_CHAR *m_pEndOfBuffer;
-		size_t *m_pKMP;
-		bool m_bIsConst;
-	};
-}
-
-#define LOGOG_STRING ::logog::String
-
-#endif // __LOGOG_STRING_HPP_
diff --git a/ThirdParty/logog/include/target.hpp b/ThirdParty/logog/include/target.hpp
deleted file mode 100644
index a5844135013a3962aa20577df5e766ef400cdcfd..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/target.hpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * \file target.hpp Abstractions representing logging outputs.
- */
-
-#ifndef __LOGOG_TARGET_HPP_
-#define __LOGOG_TARGET_HPP_
-
-namespace logog
-{
-/** A target is abstraction representing an output stream from logog.  cerr, cout, and syslog, and other logging formats are supported.
- ** Targets do not validate their received data.  Their only job is to render it on a call to Receive() to their supported target
- ** type.  Targets should generally make sure to handle calls on multiple threads -- they should make sure to avoid overlapping
- ** outputs from multiple threads correctly.  This base class handles this serialization in the Receive() function.
- ** Children of this class are expected to implement the Output() function to do the actual output.
- **/
-class Target : public TopicSink
-{
-    friend class LogBuffer;
-public :
-    Target();
-	virtual ~Target();
-
-    /** Sets the current formatter for this target. */
-    void SetFormatter( Formatter &formatter );
-
-    /** Returns a reference to the current formatter for this target. */
-    Formatter &GetFormatter() const;
-
-    /** All targets must implement the Output function.  This function outputs the provided string to the
-      * output that the target represents.
-      * \return Zero if no error has occurred; an error code (generally propagated 
-      * from the operating system) if an error has occurred.
-      */
-    virtual int Output( const LOGOG_STRING &data ) = 0;
-
-    /** Receives a topic on behalf of this target.  A mutex prevents race conditions from occurring when 
-     ** multiple threads attempt to write to this target at the same time.
-     ** \return Zero if no error has occurred; an error code (generally propagated from the operating
-     ** system) if an error has occurred.
-     */
-    virtual int Receive( const Topic &topic );
-
-	/** Does this target want its formatter to null terminate its strings? */
-	bool GetNullTerminatesStrings() const { return m_bNullTerminatesStrings; }
-
-	/** Tells this target whether to request its formatter to null terminate its strings. */
-	void SetNullTerminatesStrings(bool val) { m_bNullTerminatesStrings = val; }
-
-
-protected:
-    /** A pointer to the formatter used for this output. */
-    Formatter *m_pFormatter;
-    /** A mutex on the Receive() function. */
-    Mutex m_MutexReceive;
-	/** Does this target cause its formatter to null-terminate its output strings?  File and buffer outputs 
-	 ** don't require null terminated strings, but line outputs do.
-	 **/
-	bool m_bNullTerminatesStrings;
-};
-
-/** A target representing the cerr stream. */
-class Cerr : public Target
-{
-    virtual int Output( const LOGOG_STRING &data );
-};
-
-/** A target representing the cout stream. */
-class Cout : public Target
-{
-    virtual int Output( const LOGOG_STRING &data );
-};
-
-/** A target representing the debugger stream on Win32 targets.  This only logs information
-  * on Windows like platforms.
-  */
-class OutputDebug : public Target
-{
-    virtual int Output( const LOGOG_STRING &data );
-};
-
-/** A LogFile renders received messages to a file.  Provide the name of the file to be rendered to as
- * a parameter to the construction of the LogFile() object.  Destroying a LogFile object will cause the
- * output file to be closed.  LogFile objects always append to the output file; they do not delete the previous
- * log file.
- */
-class LogFile : public Target
-{
-public:
-    /** Creates a LogFile object.
-     * \param sFileName The name of the file to be created.
-     * Since file names do not support Unicode on most systems, there is no option to create 
-     * a filename with a LOGOG_CHAR. 
-     */
-    LogFile(const char *sFileName);
-
-    /** Closes the log file. */
-    virtual ~LogFile();
-
-    /** Opens the log file on first write. */
-    virtual int Open();
-
-	/** This function makes a guess as to the correct BOM for this file, and attempts
-	 ** to write it into the file.  It does this by considering the size of LOGOG_CHAR
-	 ** as well as considering the current endianness of this system.  This guess
-	 ** may be incorrect.
-	 **/
-	virtual void WriteUnicodeBOM();
-
-    /** Writes the message to the log file. */
-    virtual int Output( const LOGOG_STRING &data );
-
-	/** Should a Unicode BOM be written to the beginning of this log file, if the log file
-	 * was previously empty?  By default a BOM is written to a log file if LOGOG_UNICODE
-	 * is enabled. */
-	bool m_bWriteUnicodeBOM;
-
-protected:
-    char *m_pFileName;
-    bool m_bFirstTime;
-	bool m_bOpenFailed;
-    FILE *m_pFile;
-
-	/** Does the actual fwrite to the file.  Call Output() instead to handle error conditions better. */
-	virtual int InternalOutput( size_t nSize, const LOGOG_CHAR *pData );
-
-private:
-    LogFile();
-};
-
-/** A buffering target.  Stores up to a fixed buffer size of output and then renders that output to another
-  * target.  Can be used for buffering log output in memory and then storing it to a log file upon program completion.
-  * To use, create another target (such as a LogFile) and then create a LogBuffer, providing the other target
-  * as a parameter to the creation function.
-  */
-class LogBuffer : public Target
-{
-public:
-    LogBuffer( Target *pTarget = NULL,
-               size_t s = LOGOG_DEFAULT_LOG_BUFFER_SIZE );
-    virtual ~LogBuffer();
-
-    /** Changes the current rendering target.  NOTE: This function does no locking on either the target or
-     * this object.  Program accordingly.
-     */
-    virtual void SetTarget( Target &t );
-
-    /** Inserts a range of LOGOG_CHAR objects into this buffer.  The characters should consist of a null-terminated
-     * string of length size.  Providing anything else as input creates undefined behavior.
-     */
-    virtual int Insert( const LOGOG_CHAR *pChars, size_t size );
-
-    /** Dumps the current contents of the buffer to the output target. */
-    virtual int Dump();
-
-    virtual int Output( const LOGOG_STRING &data );
-
-protected:
-    virtual void Allocate( size_t size );
-
-    virtual void Deallocate();
-
-    /** The non-changing pointer to the basic buffer. */
-    LOGOG_CHAR *m_pStart;
-    /** The current write offset into the buffer. */
-    LOGOG_CHAR *m_pCurrent;
-    /** The position in the buffer after which no data may be written. */
-    LOGOG_CHAR *m_pEnd;
-    /** The size of the buffer in LOGOG_CHAR primitives. */
-    size_t m_nSize;
-    /** A pointer to the target to which the buffer will be rendered upon calling Dump(). */
-    Target *m_pOutputTarget;
-};
-
-}
-
-#endif // __LOGOG_TARGET_HPP_
diff --git a/ThirdParty/logog/include/thread.hpp b/ThirdParty/logog/include/thread.hpp
deleted file mode 100644
index c37e3045d464534c4d1ab17f83597ee1ad43ccc8..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/thread.hpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * \file thread.hpp Defines a thread object for the current platform.
- */
-
-#ifndef __LOGOG_THREAD_HPP__
-#define __LOGOG_THREAD_HPP__
-
-//! [Thread]
-#ifndef LOGOG_THREAD
-#if defined(LOGOG_FLAVOR_WINDOWS)
-
-#include <process.h>
-
-typedef unsigned int (WINAPI * __logog_pThreadFn )(void *);
-
-#define LOGOG_THREAD HANDLE
-
-#define LOGOG_THREAD_CREATE(handle, attr, pStartFn, arg) \
-	(int)((*handle=(HANDLE) _beginthreadex (NULL,  /* security */ \
-			0, /* stack size */ \
-			(__logog_pThreadFn)pStartFn, /* start address */ \
-			arg, /* pv argument */ \
-			0, /* init flag */ \
-			NULL /*thread addr */ ))==NULL)
-
-#define LOGOG_THREAD_JOIN( thread ) \
-	( (WaitForSingleObject(( thread ),INFINITE)!=WAIT_OBJECT_0) \
-				|| !CloseHandle(thread) \
-				)
-#define LOGOG_THREAD_SELF (LOGOG_THREAD)GetCurrentThreadId()
-
-#endif // defined(LOGOG_FLAVOR_WINDOWS)
-
-#if defined(LOGOG_FLAVOR_POSIX)
-
-#define LOGOG_THREAD \
-	pthread_t
-
-#define LOGOG_THREAD_CREATE(handle, attr, pStartFn, arg) \
-	pthread_create(handle, attr, pStartFn, arg)
-
-#define LOGOG_THREAD_JOIN(thread) \
-	pthread_join(thread, NULL)
-
-#define LOGOG_THREAD_SELF \
-	pthread_self()
-
-#endif
-
-#endif // LOGOG_THREAD
-
-#ifndef LOGOG_THREAD
-#error You need to define mutex macros for your platform; please see mutex.hpp
-#endif
-
-//! [Thread]
-
-namespace logog
-{
-
-/** A thread abstraction.  Requires definition of macros to describe how to create, start, and wait for threads to terminate. */
-class Thread
-{
-public:
-
-    /** A type describing the entry point of a function. */
-    typedef void* (*ThreadStartLocationType)(void *);
-
-    /** Creating a new thread requires the starting location as well as a single void pointer to the argument to a function. */
-    Thread(ThreadStartLocationType fnThreadStart, void* pvParams)
-    {
-        m_pFnThreadStart = fnThreadStart;
-        m_pvThreadParams = pvParams;
-    }
-
-    /** Cause the created thread to commence execution asynchronously. */
-    int Start()
-    {
-        return LOGOG_THREAD_CREATE(&m_Thread, NULL, m_pFnThreadStart, m_pvThreadParams);
-    }
-
-    /** Causes the current thread to wait for completion of the provided thread.
-     ** \param thread The thread object to wait for
-     */
-    static int WaitFor(const Thread& thread)
-    {
-        return LOGOG_THREAD_JOIN(thread.m_Thread);
-    }
-
-#ifdef LOGOG_THREAD_JOIN_SUPPORT
-    static void Join(const std::vector<Thread*>& threads)
-    {
-        for(size_t i=0; i<threads.size(); i++)
-            WaitFor(*threads.at(i));
-    }
-
-    static void Delete(std::vector<Thread*>& threads)
-    {
-        for(size_t i=0; i<threads.size(); i++)
-            delete threads.at(i);
-        threads.clear();
-    }
-#endif // LOGOG_THREAD_JOIN_SUPPORT
-
-    /** Returns a LOGOG_THREAD representing the calling process. */
-    static LOGOG_THREAD GetCurrent()
-    {
-        return (LOGOG_THREAD) LOGOG_THREAD_SELF ;
-    }
-
-private:
-    /** A platform-specific identifier for the calling process. */
-    LOGOG_THREAD m_Thread;
-    /** The entry point for this thread. */
-    ThreadStartLocationType m_pFnThreadStart;
-    /** An arbitrary argument to the thread entry point. */
-    void* m_pvThreadParams;
-};
-}
-
-#endif // __LOGOG_THREAD_HPP_
\ No newline at end of file
diff --git a/ThirdParty/logog/include/timer.hpp b/ThirdParty/logog/include/timer.hpp
deleted file mode 100644
index 579103b2bb78f19eb0b794bb5ff16b9d20cd1643..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/timer.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * \file timer.hpp Time management.
- */
-
-#ifndef __LOGOG_TIMER_HPP__
-#define __LOGOG_TIMER_HPP__
-
-namespace logog
-{
-/** A value for a high resolution timer on this platform.  Time representations are in seconds. */
-typedef double LOGOG_TIME;
-
-/** A high-resolution timer.  Reports in seconds. */
-class Timer : public Object
-{
-public:
-    Timer();
-
-    /** Returns the offset from the time since the creation of the timer, or the time set by the most
-     ** recent Set() call.  Time is assumed to be a value in LOGOG_TIME seconds.
-     ** \sa LOGOG_TIME
-     **/
-    LOGOG_TIME Get();
-
-    /** Sets the current time for this timer. */
-    void Set( LOGOG_TIME time );
-
-protected:
-#ifdef LOGOG_FLAVOR_WINDOWS
-    /** Windows only.  Stores the number of high resolution timer ticks per second. */
-    double m_fTicksPerMicrosecond;
-#endif
-    /** Zero, if no calls to Set() have been made; else the value of the previous call to Set(). */
-    LOGOG_TIME m_fStartTime;
-};
-
-extern Timer &GetGlobalTimer();
-extern void DestroyGlobalTimer();
-
-}
-
-#endif // __LOGOG_TIMER_HPP_
diff --git a/ThirdParty/logog/include/topic.hpp b/ThirdParty/logog/include/topic.hpp
deleted file mode 100644
index ae3d6f3e5af801692354e7c8ebcd8c18a6e5916b..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/topic.hpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/**
- * \file topic.hpp Topics -- subjects of interests for publishers and
- * subscribers to communicate about
- */
-
-#ifndef __LOGOG_TOPIC_HPP__
-#define __LOGOG_TOPIC_HPP__
-
-namespace logog
-{
-
-/** A subject that nodes can choose to discuss with one another.
- ** Subscribers generally have very general topics, while publishers generally have very specific topics.
- **/
-class Topic : public Node
-{
-    friend class TopicLevel;
-    friend class TopicGroup;
-
-public:
-    /** Creates a topic.  Note the defaults for creating a topic -- these defaults are equivalent to "no setting"
-     ** for those fields.
-     **/
-    Topic( const LOGOG_LEVEL_TYPE level = LOGOG_LEVEL_ALL,
-           const LOGOG_CHAR *sFileName = NULL,
-           const int nLineNumber = 0,
-           const LOGOG_CHAR *sGroup = NULL,
-           const LOGOG_CHAR *sCategory = NULL,
-           const LOGOG_CHAR *sMessage = NULL,
-           const double dTimestamp = 0.0f );
-
-    /** Topics are always topics.  We use this to avoid any RTTI dependence. */
-    virtual bool IsTopic() const;
-
-    /** Causes this topic to publish another topic to all its subscribers.
-     ** \return 0 if successful, non-zero if this topic failed to send the publication to all subscribers */
-    virtual int Send( const Topic &node );
-
-    /** Causes this topic to publish itself to all its subscribers. */
-    virtual int Transmit();
-
-    /** Permits this node to receive a publication from another node, and act upon it.
-     ** \param node The node constituting the publication
-     ** \return 0 if successful, non-zero if this node failed to process the publication
-     **/
-    virtual int Receive( const Topic &node );
-
-    /** Is this topic interested in receiving notifications from another topic?  This function implements
-     ** a generic (slow) test that should work for all topic types.  This function only checks fields
-     ** that have previously been set on this topic -- fields that have not been set will not limit this
-     ** topic's ability to subscribe.  If any of the previously set fields does not "match" the other topic,
-     ** this function will return false.  The matching function behaves slightly differently from field to
-     ** field.
-     ** - In the topic level case, this function rejects a publisher with a lower topic level than our
-     ** own.
-     ** - In the group, category, file name and message case, this function rejects a publisher if our
-     ** own group/category/file name or message cannot be found as a substring in the possible publisher.
-     ** This functionality permits very simple pattern matching functionality (i.e. show me all the message
-     ** lines that have the word "upload" in them, regardless of their log level.)
-     ** - In the line number case, this function rejects a publisher unless the line number matches exactly.
-     ** - In the timestamp case, this function rejects a publisher if their timestamp is before our own.
-     ** \param otherNode The topic which we are considering subscribing to
-     **/
-    virtual bool CanSubscribeTo( const Node &otherNode );
-
-    virtual bool CanSubscribeCheckTopic( const Topic &other );
-
-    /** Causes this topic to begin publishing events to the given subscriber.
-     ** \param subscriber The node to receive published events
-     ** \return true if the request was successful, false if the subscriber was already subscribed
-     **/
-    virtual bool PublishTo( Node &subscriber );
-
-
-
-    /** Formats the message in this topic given a sprintf-style set of arguments.
-     ** This function can be used to set the current message in this topic to a string with a variable number of parameters.
-     **/
-    virtual void Format( const LOGOG_CHAR *cFormatMessage, ... );
-
-    const LOGOG_STRING &FileName() const;
-    void FileName( const LOGOG_STRING &s );
-
-    const LOGOG_STRING &Message() const;
-    void Message( const LOGOG_STRING &s );
-
-    const LOGOG_STRING &Category() const;
-    void Category( const LOGOG_STRING &s );
-
-    const LOGOG_STRING &Group() const;
-    void Group( const LOGOG_STRING &s );
-
-    int LineNumber() const;
-    void LineNumber( const int num );
-
-    LOGOG_LEVEL_TYPE Level() const;
-    void Level( LOGOG_LEVEL_TYPE level );
-
-    LOGOG_TIME Timestamp() const;
-    void Timestamp( const LOGOG_TIME t );
-
-    TOPIC_FLAGS GetTopicFlags() const;
-
-protected:
-    /** An array (not an STL vector) of string properties for this topic. */
-    LOGOG_STRING m_vStringProps[ TOPIC_STRING_COUNT ];
-    /** An array (not an STL vector) of integer properties for this topic. */
-    int m_vIntProps[ TOPIC_INT_COUNT ];
-    /** The time associated with this topic.  Usually this field is updated when a topic is triggered.  Times need not be associated
-     ** with a particular topic, in which case this value is zero.
-     ** */
-    LOGOG_TIME m_tTime;
-    /** A bitfield representing the "important" fields in this topic.  Not all fields are considered to contain important information
-     ** all the time.  A logical OR of the TOPIC_*_FLAG fields.
-     ** \sa TopicBitsType
-     **/
-    TOPIC_FLAGS m_TopicFlags;
-};
-
-/** A topic that permits both publishing as well as subscribing.  This class is functionally same as a Topic; we've added it
- ** as a class for clarity when referring to different topic types.  Filters should be instantiated only after outputs are
- ** instantiated, as they automatically search for and publish to targets.  If you instantiate a filter before you
- ** instantiate a target, you will need to call PublishTo( theTarget ) yourself before using the target.
- **/
-class Filter : public Topic
-{
-public:
-    Filter( const LOGOG_LEVEL_TYPE level = LOGOG_LEVEL_ALL,
-            const LOGOG_CHAR *sFileName = NULL,
-            const int nLineNumber = 0,
-            const LOGOG_CHAR *sGroup = NULL,
-            const LOGOG_CHAR *sCategory = NULL,
-            const LOGOG_CHAR *sMessage = NULL,
-            const double dTimestamp = 0.0f );
-};
-
-/** Returns a reference to the unique default filter instantiated with logog. */
-extern Filter &GetDefaultFilter();
-
-/** Sets the current reporting level for the default filter.  All messages
-  * connected to the filter after this point should obey this default
-  * level setting.
-  */
-void SetDefaultLevel( LOGOG_LEVEL_TYPE level );
-
-/** A topic with the group name being the only field of significance. */
-class TopicGroup : public Topic
-{
-public:
-    TopicGroup( const LOGOG_CHAR *sGroup = NULL );
-
-    virtual bool CanSubscribeCheckTopic( const Topic &other );
-};
-
-/** A topic with the level being the only field of significance. */
-class TopicLevel : public Topic
-{
-public:
-    TopicLevel( const LOGOG_LEVEL_TYPE level );
-    virtual bool CanSubscribeCheckTopic( const Topic &other );
-};
-
-/** A topic that is also a source. */
-class TopicSource : public Topic
-{
-public:
-    TopicSource( const LOGOG_LEVEL_TYPE level = LOGOG_LEVEL_ALL,
-                 const LOGOG_CHAR *sFileName = NULL,
-                 const int nLineNumber = 0,
-                 const LOGOG_CHAR *sGroup = NULL,
-                 const LOGOG_CHAR *sCategory = NULL,
-                 const LOGOG_CHAR *sMessage = NULL,
-                 const double dTimestamp = 0.0f );
-
-    /** Returns false.  Sources do not subscribe. */
-    virtual bool SubscribeTo( Node & );
-
-    /** Returns false.  Sources do not unsubscribe. */
-    virtual bool UnsubscribeTo( Node & );
-    virtual bool CanSubscribe() const;
-};
-
-/** A topic that is also a sink. */
-class TopicSink : public Topic
-{
-public:
-    virtual bool IsTopic() const;
-
-    /** Sinks do not add themselves to the list of interested subscribers.  That's up to intermediate topics to decide. */
-    virtual void Initialize();
-
-    /** Returns false.  Sinks do not publish. */
-    virtual bool PublishTo( Node & );
-
-    /** Returns false.  Sinks do not unpublish. */
-    virtual bool UnpublishTo( Node & );
-
-    /** Returns false.  Sinks do not publish. */
-    virtual bool CanPublish() const;
-};
-}
-
-#endif // __LOGOG_TOPIC_HPP_
diff --git a/ThirdParty/logog/include/unittest.hpp b/ThirdParty/logog/include/unittest.hpp
deleted file mode 100644
index 3441636bd56d41db50bcf2184402fe1639129496..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/include/unittest.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * \file unittest.hpp Unit testing interface; may be used for other programs as well.
- */
-#ifndef __LOGOG_UNITTEST_HPP
-#define __LOGOG_UNITTEST_HPP
-
-#include <iostream>
-#include <string>
-
-namespace logog
-{
-
-/**
- * \page unittesting Unit test framework
- *
- * A unit test framework is included with logog.  This framework was intended specifically to exercise logog functionality, but it may also
- * be used as a general purpose test framework.
- *
- * A typical test program will look like this:
- * \code
- * int main( int argc, char *argv[] )
- * {
- *     int nResult;
- *     nResult = RunAllTests();
- *     ShutdownTests();
- *     return nResult;
- * }
- * \endcode
- *
- * To define a unit test, create a function of the following form:
- *
- * \code
- * UNITTEST( AdditionTest )
- * {
- *     logog::Initialize();
- *
- *     int nResult = 0;
- *
- *     if ( 2 + 2 == 4 )
- *     {
- *        LOGOG_COUT << _LG("Sane.") << endl;
- *     }
- *     else
- *     {
- *        LOGOG_COUT << _LG("Insane!") << endl;
- *        nResult = 1;
- *     }
- *
- *     logog::Shutdown();
- *
- *     return nResult;
- *
- * };
- * \endcode
- *
- * The UNITTEST() macro defines a unique UnitTest object that encompasses your function.
- * Your function should take no parameters and return an integer value.  It should return
- * zero if the test was successful, and non-zero if the test was unsuccesful.  If any
- * of your tests fail, the stub main() program will propagate that error to the operating
- * system, which in turn can be used to halt an automated build system.
- *
- * The unit testing framework is known to leak memory.  However, the underlying logog macros are not known to leak memory (let us know
- * if you find any leaks).
- */
-
-/** A standard string type, used for labelling a test.  We don't use LOGOG_STRING here because that class is mutable
- ** and it allocates memory.
- **/
-typedef const char * TestNameType;
-class UnitTest;
-
-/** A registry for all tests.  All tests are instanced using the UNITTEST() macro and stored in the LogogTestRegistry.
- ** \ref UNITTEST
- **/
-typedef LOGOG_LIST< UnitTest * > TestRegistryType;
-
-/** All unit tests are registered in here at program initialization time. */
-extern TestRegistryType &LogogTestRegistry();
-
-/** A TestSignup is responsible for recording each instanced UnitTest in the test registry. */
-class TestSignup
-{
-public:
-    /** Creates a new TestSignup.  Only called from constructor for UnitTest. */
-    TestSignup( UnitTest *pTest );
-
-protected:
-    /** A pointer back to the UnitTest that created this TestSignup */
-    UnitTest *m_pTest;
-private:
-    TestSignup();
-};
-
-/** The base class for unit testing.  Children of UnitTest are instanced by the UNITTEST() macro. */
-class UnitTest
-{
-public:
-    /** Instances a test.  An instanced test is automatically executed when the RunAllTests() function is called.
-     * \param sTestName A string representing the name of this test.
-     */
-    UnitTest( const TestNameType &sTestName );
-
-	virtual ~UnitTest();
-    /** Returns the name of this UnitTest provided at construction time. */
-    virtual TestNameType &GetName();
-    /** Child classes of UnitTest() must provide a RunTest() function.  A RunTest() function must initialize logog, conduct its
-     ** tests, and return 0 if the test was successful, a non-0 value otherwise.  If any RunTest() function returns any value other than
-     ** zero, then the main RunAllTests() function will return non zero as well.
-     */
-    virtual int RunTest() = 0;
-
-	/** This function is called during ShutdownTests().  Its purpose is to free
-	 ** the internal structures allocated by the UnitTest without freeing 
-	 ** the UnitTest itself.  Microsoft's leak detector will flag the internals
-	 ** of a UnitTest as a leak unless these internals are explicitly destroyed
-	 ** prior to exit().
-	 **/
-	virtual void FreeInternals();
-
-protected:
-    /** The name of this particular test. */
-    TestNameType m_sTestName;
-    /** A pointer to the TestSignup constructed by this UnitTest. */
-    TestSignup *m_pTestSignup;
-private:
-    UnitTest();
-};
-
-/** Executes all currently registered tests and prints a report of success or failure. */
-extern int RunAllTests();
-
-/** Should remove all memory allocated during unit testing. */
-extern void ShutdownTests();
-
-/** This should be the function prefix for a unit test.  It defines a new class for the test inherited from UnitTest.  It instances
- ** a member of the class at run-time (before main() starts).  Lastly it provides the function definition for the actual test class.
- */
-#define UNITTEST( x ) class x : public UnitTest { \
-public: \
-	x( TestNameType name ) : \
-	  UnitTest( name ) \
-	  {} \
-	  virtual ~x() {}; \
-	  virtual int RunTest(); \
-	}; \
-	x __LogogTestInstance_ ## x ( #x ); \
-	int x::RunTest()
-
-}
-
-#endif // __LOGOG_UNITTEST_HPP
diff --git a/ThirdParty/logog/readme.txt b/ThirdParty/logog/readme.txt
deleted file mode 100644
index 1c0339e148845dc6afeccff2a6870fcd5ff8560d..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/readme.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-See http://www.logog.org or http://johnwbyrd.github.com/logog/ for more information and complete documentation.
-
-logog is a portable C++ library to facilitate logging of real-time events in performance-oriented applications, such as games. It is especially appropriate for projects that have constrained memory and constrained CPU requirements.
-
-General support and discussion is available at http://groups.google.com/group/logog .  Development support and discussion is available at http://groups.google.com/group/logog-devel .
-
-This project can be built using CMake, available from http://www.cmake.org .
-
-Local documentation can be generated with doxygen, available from  http://www.doxygen.org .
-
-The license agreement for logog is viewable at http://johnwbyrd.github.com/logog/license.html .
diff --git a/ThirdParty/logog/src/api.cpp b/ThirdParty/logog/src/api.cpp
deleted file mode 100644
index 2b67c14051b29e29e3661aa5753b8bd1b51a3523..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/api.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
- /* 
- * \file api.cpp
- */
-
-#include "logog.hpp"
-
-#include <cstdlib>
-
-namespace logog {
-
-static Mutex s_mInitialization;
-static int s_nInitializations = 0;
-
-int Initialize( INIT_PARAMS *params )
-{
-	s_mInitialization.MutexLock();
-
-	if ( s_nInitializations++ == 0 )
-	{
-		if ( params == NULL )
-		{
-			Static().s_pfMalloc = malloc;
-			Static().s_pfFree = free;
-		}
-		else
-		{
-			if ( params->m_pfMalloc != NULL )
-			{
-				Static().s_pfMalloc = params->m_pfMalloc;
-				Static().s_pfFree = params->m_pfFree;
-			}
-			else
-			{
-				Static().s_pfMalloc = malloc;
-				Static().s_pfFree = free;
-			}
-		}
-
-		// Let's allocate a default filter here.
-		GetDefaultFilter();
-
-		// Socket::Initialize();
-	}
-
-	s_mInitialization.MutexUnlock();
-
-    return 0;
-}
-
-int Shutdown( )
-{
-	s_mInitialization.MutexLock();
-
-	if ( --s_nInitializations == 0 )
-	{
-		// Socket::Shutdown();
-
-#ifdef LOGOG_DESTROY_STATIC_AREA
-		delete &( Static() );
-#else
-		Static().Reset();
-#endif
-
-#ifdef LOGOG_LEAK_DETECTION
-		ReportMemoryAllocations();
-#endif
-	}
-
-	s_mInitialization.MutexUnlock();
-
-    return 0;
-}
-}
-
diff --git a/ThirdParty/logog/src/checkpoint.cpp b/ThirdParty/logog/src/checkpoint.cpp
deleted file mode 100644
index 45ecf39f5b0299ecc70a2c9e682ae2f1ca8dff15..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/checkpoint.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
- 
-/* 
- * \file checkpoint.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	Checkpoint::Checkpoint( const LOGOG_LEVEL_TYPE level,
-		const LOGOG_CHAR *sFileName ,
-		const int nLineNumber,
-		const LOGOG_CHAR *sGroup,
-		const LOGOG_CHAR *sCategory,
-		const LOGOG_CHAR *sMessage,
-		const double dTimestamp ) :
-	TopicSource( level, sFileName, nLineNumber, sGroup, sCategory, sMessage, dTimestamp )
-	{
-	}
-
-	int Checkpoint::Send( const Topic &node )
-	{
-		/* Optionally update our own timestamp before we send on our information */
-		if (( m_TopicFlags & TOPIC_TIMESTAMP_FLAG ) != 0 )
-			m_tTime = GetGlobalTimer().Get();
-
-		return TopicSource::Send( node );
-	}
-}
-
diff --git a/ThirdParty/logog/src/formatter.cpp b/ThirdParty/logog/src/formatter.cpp
deleted file mode 100644
index 22515f3c5a6cb9362b176aabeae462dc93202fa0..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/formatter.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
- 
-/* 
- * \file formatter.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	Formatter::Formatter() :
-		m_bShowTimeOfDay( false )
-	{
-		m_sMessageBuffer.reserve( LOGOG_FORMATTER_MAX_LENGTH );
-		m_sIntBuffer.reserve_for_int();
-	}
-
-	void Formatter::RenderTimeOfDay()
-	{
-		if ( m_bShowTimeOfDay )
-		{
-#ifndef LOGOG_UNICODE
-			TimeStamp stamp;
-			m_sMessageBuffer.append( stamp.Get() );
-			m_sMessageBuffer.append(": ");
-#endif
-		}
-	}
-
-	const LOGOG_CHAR * Formatter::ErrorDescription( const LOGOG_LEVEL_TYPE level )
-	{
-		if ( level <= LOGOG_LEVEL_NONE )
-			return LOGOG_CONST_STRING("none");
-
-		if ( level <= LOGOG_LEVEL_EMERGENCY )
-			return LOGOG_CONST_STRING("emergency");
-
-		if ( level <= LOGOG_LEVEL_ALERT )
-			return LOGOG_CONST_STRING("alert");
-
-		if ( level <= LOGOG_LEVEL_CRITICAL )
-			return LOGOG_CONST_STRING("critical");
-
-		if ( level <= LOGOG_LEVEL_ERROR )
-			return LOGOG_CONST_STRING("error");
-
-		if ( level <= LOGOG_LEVEL_WARN )
-			return LOGOG_CONST_STRING("warning");
-
-		if ( level <= LOGOG_LEVEL_INFO )
-			return LOGOG_CONST_STRING("info");
-
-		if ( level <= LOGOG_LEVEL_DEBUG )
-			return LOGOG_CONST_STRING("debug");
-
-		return LOGOG_CONST_STRING("unknown");
-	}
-
-	bool Formatter::GetShowTimeOfDay() const
-	{
-		return m_bShowTimeOfDay;
-	}
-
-	void Formatter::SetShowTimeOfDay( bool val )
-	{
-		m_bShowTimeOfDay = val;
-	}
-
-	TOPIC_FLAGS Formatter::GetTopicFlags( const Topic &topic )
-	{
-		return topic.GetTopicFlags();
-	}
-
-	LOGOG_STRING &FormatterGCC::Format( const Topic &topic, const Target &target )
-	{
-		TOPIC_FLAGS flags;
-		flags = GetTopicFlags( topic );
-
-		m_sMessageBuffer.clear();
-
-		if ( flags & TOPIC_FILE_NAME_FLAG )
-		{
-			m_sMessageBuffer.append( topic.FileName() );
-			m_sMessageBuffer.append( ':' );
-		}
-
-		if ( flags & TOPIC_LINE_NUMBER_FLAG )
-		{
-			m_sIntBuffer.assign( topic.LineNumber() );
-			m_sMessageBuffer.append( m_sIntBuffer );
-
-			m_sMessageBuffer.append( LOGOG_CONST_STRING(": "));
-		}
-
-		RenderTimeOfDay();
-
-		if ( flags & TOPIC_LEVEL_FLAG )
-		{
-			m_sMessageBuffer.append( ErrorDescription( topic.Level()));
-			m_sMessageBuffer.append( LOGOG_CONST_STRING(": "));
-		}
-
-		if ( flags & TOPIC_GROUP_FLAG )
-		{
-			m_sMessageBuffer.append( LOGOG_CONST_STRING("{") );
-			m_sMessageBuffer.append( topic.Group() );
-			m_sMessageBuffer.append( LOGOG_CONST_STRING("} ") );
-		}
-
-		if ( flags & TOPIC_CATEGORY_FLAG )
-		{
-			m_sMessageBuffer.append( LOGOG_CONST_STRING("["));
-			m_sMessageBuffer.append( topic.Category() );
-			m_sMessageBuffer.append( LOGOG_CONST_STRING("] "));
-		}
-
-		if ( flags & TOPIC_MESSAGE_FLAG )
-		{
-			m_sMessageBuffer.append( topic.Message() );
-			m_sMessageBuffer.append( (LOGOG_CHAR)'\n' );
-		}
-
-		if ( target.GetNullTerminatesStrings() )
-			m_sMessageBuffer.append( (LOGOG_CHAR)NULL );
-
-		return m_sMessageBuffer;
-	}
-
-
-	LOGOG_STRING &FormatterMSVC::Format( const Topic &topic, const Target &target )
-    {
-        m_sMessageBuffer.clear();
-
-        TOPIC_FLAGS flags;
-        flags = GetTopicFlags( topic );
-
-        if ( flags & TOPIC_FILE_NAME_FLAG )
-        {
-            m_sMessageBuffer.append( topic.FileName() );
-            m_sMessageBuffer.append( '(' );
-        }
-
-        if ( flags & TOPIC_LINE_NUMBER_FLAG  )
-        {
-            m_sIntBuffer.assign( topic.LineNumber() );
-            m_sMessageBuffer.append( m_sIntBuffer );
-
-            m_sMessageBuffer.append( LOGOG_CONST_STRING(") : ") );
-        }
-
-		RenderTimeOfDay();
-
-        if ( flags & TOPIC_LEVEL_FLAG )
-        {
-            m_sMessageBuffer.append( ErrorDescription( topic.Level() ) );
-            m_sMessageBuffer.append( LOGOG_CONST_STRING(": "));
-        }
-
-        if ( flags & TOPIC_GROUP_FLAG )
-        {
-            m_sMessageBuffer.append( LOGOG_CONST_STRING("{"));
-            m_sMessageBuffer.append( topic.Group() );
-            m_sMessageBuffer.append( LOGOG_CONST_STRING("} "));
-        }
-
-        if ( flags & TOPIC_CATEGORY_FLAG )
-        {
-            m_sMessageBuffer.append( LOGOG_CONST_STRING("["));
-            m_sMessageBuffer.append( topic.Category() );
-            m_sMessageBuffer.append( LOGOG_CONST_STRING("] "));
-        }
-
-        if ( flags & TOPIC_MESSAGE_FLAG )
-        {
-            m_sMessageBuffer.append( topic.Message() );
-#ifdef LOGOG_FLAVOR_WINDOWS
-			m_sMessageBuffer.append( LOGOG_CONST_STRING("\r\n") );
-#else // LOGOG_FLAVOR_WINDOWS
-            m_sMessageBuffer.append( LOGOG_CONST_STRING("\n") );
-#endif // LOGOG_FLAVOR_WINDOWS
-        }
-
-		if ( target.GetNullTerminatesStrings() )
-			m_sMessageBuffer.append( LOGOG_CHAR( NULL ) );
-
-        return m_sMessageBuffer;
-    }
-
-	Formatter &GetDefaultFormatter()
-	{
-		Statics *pStatic = &Static();
-
-		if ( pStatic->s_pDefaultFormatter == NULL )
-		{
-#ifdef LOGOG_FLAVOR_WINDOWS
-			pStatic->s_pDefaultFormatter = new FormatterMSVC();
-#else
-			pStatic->s_pDefaultFormatter = new FormatterGCC();
-#endif
-		}
-
-		return *( pStatic->s_pDefaultFormatter );
-	}
-
-	void DestroyDefaultFormatter()
-	{
-		Statics *pStatic = &Static();
-		Formatter *pDefaultFormatter = pStatic->s_pDefaultFormatter;
-
-		if ( pDefaultFormatter != NULL )
-			delete pDefaultFormatter;
-
-		pStatic->s_pDefaultFormatter = NULL;
-}
-
-const char * TimeStamp::Get()
-{
-	time_t tRawTime;
-	struct tm * tmInfo;
-
-	time ( &tRawTime );
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-#endif // LOGOG_FLAVOR_WINDOWS
-	/* Microsoft is afraid of this function; I'm not sure this warning is sensible */
-	tmInfo = localtime ( &tRawTime );
-#ifdef LOGOG_FLAVOR_WINDOWS
-#pragma warning( pop )
-#endif // LOGOG_FLAVOR_WINDOWS
-
-	strftime (cTimeString, LOGOG_TIME_STRING_MAX, "%c", tmInfo);
-
-	return cTimeString;
-}
-
-}
-
diff --git a/ThirdParty/logog/src/lobject.cpp b/ThirdParty/logog/src/lobject.cpp
deleted file mode 100644
index 8fbce7755567d1b4b1e29df5f2ee6d7bf2cb6ab4..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/lobject.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-/* 
- * \file object.cpp
- */
-
-#include "logog.hpp"
-#ifdef LOGOG_LEAK_DETECTION
-#include <iostream>
-#endif // LOGOG_LEAK_DETECTION
-
-namespace logog {
-
-#ifdef LOGOG_LEAK_DETECTION
-AllocationsType s_Allocations;
-#endif
-
-	Object::Object() {}
-
-	Object::~Object()
-	{
-
-	}
-
-	void *Object::operator new( size_t nSize )
-	{
-		return Allocate( nSize );
-	}
-
-	void *Object::operator new[]( size_t nSize )
-	{
-		return Allocate( nSize );
-	}
-
-#ifdef _DEBUG
-#ifdef LOGOG_FLAVOR_WINDOWS
-
-	void *Object::operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
-	{
-		/* avoid unref'd parameter warnings */
-		lpszFileName;
-		nLine;
-		return Allocate( nSize );
-	}
-
-	void *Object::operator new[](size_t nSize, LPCSTR lpszFileName, int nLine)
-	{
-		/* avoid unref'd parameter warnings */
-		lpszFileName;
-		nLine;
-		return Allocate( nSize );
-	}
-
-	void Object::operator delete(void *ptr, LPCSTR lpszFileName, int nLine)
-	{
-		lpszFileName;
-		nLine;
-		Deallocate( ptr );
-	}
-
-	void Object::operator delete[](void *ptr, LPCSTR lpszFileName, int nLine)
-	{
-		lpszFileName;
-		nLine;
-		Deallocate( ptr );
-	}
-
-#endif // LOGOG_FLAVOR_WINDOWS
-#endif // _DEBUG
-
-	    /** Deletes an object pointed to by ptr. */
-	void Object::operator delete( void *ptr )
-    {
-        Deallocate( ptr );
-    }
-    /** Deletes an object array pointed to by ptr. */
-	void Object::operator delete[]( void *ptr )
-    {
-        Deallocate( ptr );
-    }
-
-    /** Allocates nSize bytes of memory.  You must call logog::Initialize() before calling this function.
-     * \sa Initialize()
-     */
-	void *Object::Allocate( size_t nSize )
-    {
-        void *ptr = Static().s_pfMalloc( nSize );
-#ifdef LOGOG_REPORT_ALLOCATIONS
-        LOGOG_COUT << _LG("Allocated ") << nSize << _LG(" bytes of memory at ") << ptr << endl;
-#endif // LOGOG_REPORT_ALLOCATIONS
-#ifdef LOGOG_LEAK_DETECTION
-        AllocationsType::iterator it;
-
-        LockAllocationsMutex();
-        it = s_Allocations.find( ptr );
-
-        if ( it != s_Allocations.end() )
-        {
-            LOGOG_COUT << _LG("Reallocation detected in memory manager!  We seem to have allocated the same address twice ")
-                 << _LG("without freeing it!  Address = ") << ptr << std::endl;
-            UnlockAllocationsMutex();
-            LOGOG_INTERNAL_FAILURE;
-        }
-
-        s_Allocations.insert( LOGOG_PAIR< const PointerType, size_t >( ptr, nSize ) );
-        UnlockAllocationsMutex();
-#endif // LOGOG_LEAK_DETECTION
-        return ptr;
-    }
-
-    /** Deallocate a pointer previously acquired by Allocate(). */
-	void Object::Deallocate( void *ptr )
-    {
-#ifdef LOGOG_LEAK_DETECTION
-        LockAllocationsMutex();
-        AllocationsType::iterator it;
-
-        it = s_Allocations.find( ptr );
-
-        if ( it == s_Allocations.end() )
-        {
-            LOGOG_COUT << _LG("Freeing memory not previously allocated!  Address = ") << ptr << std::endl;
-            UnlockAllocationsMutex();
-            LOGOG_INTERNAL_FAILURE;
-        }
-
-#ifdef LOGOG_REPORT_ALLOCATIONS
-        LOGOG_COUT << _LG("Freeing ") << it->second << _LG(" bytes of memory at ") << it->first << endl;
-#endif // LOGOG_REPORT_ALLOCATIONS
-        s_Allocations.erase( ptr );
-        UnlockAllocationsMutex();
-#endif // LOGOG_LEAK_DETECTION
-        Static().s_pfFree( ptr );
-    }
-
-	int MemoryAllocations()
-	{
-#ifdef LOGOG_LEAK_DETECTION
-		LockAllocationsMutex();
-		size_t nSize = s_Allocations.size();
-
-		if ( nSize != 0 )
-			LOGOG_COUT << _LG("Total active allocations: ") << nSize << std::endl;
-
-		UnlockAllocationsMutex();
-		return (int)nSize;
-#else // LOGOG_LEAK_DETECTION
-		return -1;
-#endif // LOGOG_LEAK_DETECTION
-	}
-
-	int ReportMemoryAllocations()
-	{
-#ifdef LOGOG_LEAK_DETECTION
-		LockAllocationsMutex();
-
-		if ( s_Allocations.size() == 0 )
-		{
-			LOGOG_COUT << _LG("No memory allocations outstanding.") << std::endl;
-		}
-		else
-		{
-			for ( AllocationsType::iterator it = s_Allocations.begin();
-				it != s_Allocations.end();
-				it++ )
-			{
-				LOGOG_COUT << _LG("Memory allocated at ") << it->first << 
-					_LG(" with size ") << it->second << 
-					_LG(" bytes ") << std::endl;
-			}
-		}
-
-		UnlockAllocationsMutex();
-#endif
-		return MemoryAllocations();
-	}
-
-}
-
diff --git a/ThirdParty/logog/src/logog.vcproj b/ThirdParty/logog/src/logog.vcproj
deleted file mode 100644
index f80a5d75e08d9b275f30cc07e76f1944aa2fbcba..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/logog.vcproj
+++ /dev/null
@@ -1,323 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="logog"
-	ProjectGUID="{85857E80-2122-4DD8-9BA9-B90CC10D65B0}"
-	RootNamespace="logog"
-	SccProjectName="Perforce Project"
-	SccLocalPath=".."
-	SccProvider="MSSCCI:Perforce SCM"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="196613"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="4"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="../include"
-				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				WarningLevel="4"
-				WarnAsError="true"
-				DebugInformationFormat="4"
-				ShowIncludes="false"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="4"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="../include"
-				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
-				RuntimeLibrary="2"
-				EnableFunctionLevelLinking="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="4"
-				WarnAsError="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\api.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\checkpoint.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\formatter.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\lobject.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\lstring.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\message.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\mutex.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\node.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\platform.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\socket.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\statics.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\target.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\timer.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\topic.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\unittest.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\include\api.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\checkpoint.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\const.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\formatter.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\logog.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\macro.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\message.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\mutex.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\node.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\object.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\platform.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\socket.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\statics.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\string.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\target.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\thread.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\timer.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\topic.hpp"
-				>
-			</File>
-			<File
-				RelativePath="..\include\unittest.hpp"
-				>
-			</File>
-			<Filter
-				Name="Proprietary"
-				>
-				<File
-					RelativePath="..\include\proprietary\ps3.hpp"
-					>
-				</File>
-				<File
-					RelativePath="..\include\proprietary\xbox360.hpp"
-					>
-				</File>
-			</Filter>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/ThirdParty/logog/src/lstring.cpp b/ThirdParty/logog/src/lstring.cpp
deleted file mode 100644
index 5ab7c03112a9cdc8925f7d0fdd10ac8e24761a98..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/lstring.cpp
+++ /dev/null
@@ -1,497 +0,0 @@
- /* 
- * \file lstring.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	String::String()
-	{
-		Initialize();
-	}
-
-	String::~String()
-	{
-		Free();
-	}
-
-	void String::Free()
-	{
-		if ( m_pBuffer && ( m_bIsConst == false ))
-		{
-			Deallocate( (void *)m_pBuffer );
-			m_pBuffer = m_pEndOfBuffer = m_pOffset = NULL;
-		}
-
-		if ( m_pKMP )
-		{
-			Deallocate( (void *)m_pKMP );
-			m_pKMP = NULL;
-		}
-	}
-
-	size_t String::Length( const LOGOG_CHAR *chars )
-	{
-		unsigned int len = 0;
-
-		while ( *chars++ )
-			len++;
-
-		return len;
-	}
-
-	String & String::operator=( const String & other )
-	{
-		Free();
-		Initialize();
-		assign( other );
-		return *this;
-	}
-
-	String & String::operator=( const LOGOG_CHAR *pstr )
-	{
-		Free();
-		Initialize();
-		assign( pstr );
-		return *this;
-	}
-
-	String::String( const String &other )
-	{
-		Initialize();
-		assign( other );
-	}
-
-	String::String( const LOGOG_CHAR *pstr )
-	{
-		Initialize();
-		assign( pstr );
-	}
-
-	size_t String::size() const
-	{
-		return ( m_pOffset - m_pBuffer );
-	}
-
-	void String::clear()
-	{
-		m_pOffset = m_pBuffer;
-	}
-
-	size_t String::reserve( size_t nSize )
-	{
-		if ( nSize == (unsigned int)( m_pOffset - m_pBuffer ))
-			return nSize;
-
-		if ( nSize == 0 )
-		{
-			if ( m_pBuffer && ( *m_pBuffer != (LOGOG_CHAR)NULL ))
-				Deallocate( (void *)m_pBuffer );
-
-			Initialize();
-			return 0;
-		}
-
-		LOGOG_CHAR *pNewBuffer = (LOGOG_CHAR *)Allocate( sizeof( LOGOG_CHAR ) * nSize );
-		LOGOG_CHAR *pNewOffset = pNewBuffer;
-		LOGOG_CHAR *pNewEnd = pNewBuffer + nSize;
-
-		LOGOG_CHAR *pOldOffset = m_pOffset;
-
-		if ( pOldOffset != NULL )
-		{
-			while (( pNewOffset < pNewEnd ) && ( *pOldOffset != (LOGOG_CHAR)NULL ))
-				*pNewOffset++ = *pOldOffset++;
-		}
-
-		if (( m_pBuffer != NULL ) && ( m_bIsConst == false ))
-			Deallocate( m_pBuffer );
-
-		m_pBuffer = pNewBuffer;
-		m_pOffset = pNewBuffer;
-		m_pEndOfBuffer = pNewEnd;
-
-		return ( m_pOffset - m_pBuffer );
-	}
-
-	size_t String::reserve_for_int()
-	{
-		reserve( 32 );
-		return 32;
-	}
-
-	String::operator const LOGOG_CHAR *() const
-	{
-		return m_pBuffer;
-	}
-
-	const LOGOG_CHAR* String::c_str() const
-	{
-		return m_pBuffer;
-	}
-
-	size_t String::assign( const String &other )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( m_bIsConst )
-			cout << "Can't reassign const string!" << endl;
-#endif
-		LOGOG_CHAR *pOther = other.m_pBuffer;
-
-		if ( pOther == NULL )
-			return 0;
-
-		size_t othersize = other.size();
-
-		reserve( othersize + 1 );
-		m_pOffset = m_pBuffer;
-
-		for ( unsigned int t = 0; t <= othersize ; t++ )
-			*m_pOffset++ = *pOther++;
-
-		return this->size();
-	}
-
-	size_t String::assign( const int value )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( m_bIsConst )
-			cout << "Can't reassign const string!" << endl;
-#endif
-
-		int number = value;
-		m_pOffset = m_pBuffer;
-
-		int bSign = value;
-
-		if (( bSign = number) < 0)
-			number = -number;
-
-		do
-		{
-			*m_pOffset++ = _LG("0123456789")[ number % 10 ];
-		}
-		while( number /= 10 );
-
-		if (bSign < 0)
-			*m_pOffset++ = '-';
-
-		*m_pOffset = (LOGOG_CHAR)'\0';
-
-		reverse( m_pBuffer, m_pOffset - 1 );
-
-		return ( m_pOffset - m_pBuffer );
-	}
-
-	size_t String::assign( const LOGOG_CHAR *other, const LOGOG_CHAR *pEnd /*= NULL */ )
-	{
-		size_t len;
-
-		if ( pEnd == NULL )
-			len = Length( other );
-		else
-			len = ( pEnd - other );
-		/** This constant decides whether assigning a LOGOG_CHAR * to a String will cause the String to use the previous buffer
-		* in place, or create a new buffer and copy the results.
-		*/
-#ifdef LOGOG_COPY_CONST_CHAR_ARRAY_ON_ASSIGNMENT
-		reserve( len + 1 );
-
-		for (unsigned int t = 0; t <= len; t++ )
-			*m_pOffset++ = *other++;
-#else  // LOGOG_COPY_CONST_CHAR_ARRAY_ON_ASSIGNMENT
-
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( m_bIsConst )
-			cout << "Can't reassign const string!" << endl;
-#endif
-		/* In this case we don't copy the buffer, just reuse it */
-		m_pBuffer = const_cast< LOGOG_CHAR *>( other );
-		m_pOffset = m_pBuffer + len + 1;
-		m_pEndOfBuffer = m_pOffset;
-		m_bIsConst = true;
-
-#endif // LOGOG_COPY_CONST_CHAR_ARRAY_ON_ASSIGNMENT
-
-		return (int) len;
-	}
-	size_t String::append( const String &other )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( m_bIsConst )
-			cout << "Can't reassign const string!" << endl;
-#endif
-
-		return append( other.m_pBuffer );
-	}
-
-	size_t String::append( const LOGOG_CHAR *other )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( m_bIsConst )
-			cout << "Can't reassign const string!" << endl;
-#endif
-		if ( other == NULL )
-			return 0;
-
-		while (( m_pOffset < m_pEndOfBuffer ) && ( *other != (LOGOG_CHAR)NULL ))
-			*m_pOffset++ = *other++;
-
-		return ( m_pOffset - m_pBuffer );
-	}
-
-	size_t String::append( const LOGOG_CHAR c )
-	{
-		if ( m_pOffset < m_pEndOfBuffer )
-			*m_pOffset++ = c;
-
-		return ( m_pOffset - m_pBuffer );
-	}
-	void String::reverse( LOGOG_CHAR* pStart, LOGOG_CHAR* pEnd )
-	{
-		LOGOG_CHAR temp;
-
-		while( pEnd > pStart)
-		{
-			temp=*pEnd, *pEnd-- =*pStart, *pStart++=temp;
-		}
-	}
-
-	bool String::is_valid() const
-	{
-		return ( m_pBuffer != NULL );
-	}
-
-	size_t String::find( String &other ) const
-	{
-		if ( is_valid() && other.is_valid())
-		{
-			// KMP solution
-			// String *pThis = const_cast< String *>(this);
-			// return pThis->KMP( other.m_pBuffer, other.size());
-			LOGOG_CHAR *pFound;
-
-#ifdef LOGOG_UNICODE
-			pFound = wcsstr( m_pBuffer, other.m_pBuffer );
-#else // LOGOG_UNICODE
-			pFound = strstr( m_pBuffer, other.m_pBuffer );
-#endif
-
-			if ( pFound != NULL )
-			{
-				return ( pFound - m_pBuffer );
-			}
-
-			return npos;
-		}
-
-		return npos;
-	}
-
-	void String::format( const LOGOG_CHAR *cFormatString, ... )
-	{
-		va_list args;
-
-		va_start(args, cFormatString);
-		format_va( cFormatString, args );
-		va_end( args );
-	}
-
-	void String::format_va( const LOGOG_CHAR *cFormatString, va_list args )
-	{
-		int nActualSize = -1, nAttemptedSize;
-		LOGOG_CHAR *pszFormatted = NULL;
-
-		Free();
-
-		/* Estimate length of output; don't pull in strlen() if we can help it */
-		int nEstLength = 0;
-		const LOGOG_CHAR *pCurChar = cFormatString;
-		while ( *pCurChar++ )
-			nEstLength++;
-
-		if ( nEstLength == 0 )
-		{
-			clear();
-			return;
-		}
-
-		/** nAttemptedSize is now a guess at an appropriate size, which is about 
-		 ** two times the number of LOGOG_CHARs in the incoming format string.
-		 **/
-		nAttemptedSize = nEstLength * 2 * sizeof( LOGOG_CHAR );
-
-		/* Some *printf implementations, such as msvc's, return -1 on failure.  
-		 * Others, such as gcc, return the number
-		 * of characters actually formatted on failure.  Deal with either case here.
-		 */
-		for ( ; ; )
-		{
-			/** We'll allocate that number of bytes.  NOTE that this has less of a chance
-			 ** of working on a Unicode build.
-			 **/
-			pszFormatted = (LOGOG_CHAR *)Allocate( nAttemptedSize );
-			if ( !pszFormatted )
-			{
-				LOGOG_INTERNAL_FAILURE;
-			}
-
-			*pszFormatted = (LOGOG_CHAR)'\0';
-
-			va_list argsCopy;
-
-			/** The va_list structure is not standardized across all platforms; in particular
-			 ** Microsoft seems to have problem with the concept.
-			 **/
-#if defined( va_copy )
-			va_copy( argsCopy, args );
-#elif defined( __va_copy )
-			__va_copy( argsCopy, args );
-#else
-			memcpy( &argsCopy, &args, sizeof(va_list) );
-#endif
-
-#ifdef LOGOG_UNICODE
-			/** At this point, nSizeInWords will contain the number of words permitted in the
-			 ** output buffer.  It takes into account space for appending a null character in the output
-			 ** buffer as well.
-			 **/
-			int nSizeInWords = (nAttemptedSize / sizeof( LOGOG_CHAR ));
-#endif
-			/** The nActualSize value receives different things on different platforms.
-			 ** On some platforms it receives -1 on failure; on other platforms
-			 ** it receives the number of LOGOG_CHARs actually formatted (excluding
-			 ** the trailing NULL).
-			 **/
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-#ifdef LOGOG_UNICODE
-			nActualSize = _vsnwprintf_s( pszFormatted, nSizeInWords, _TRUNCATE, cFormatString, argsCopy );
-#else // LOGOG_UNICODE
-			nActualSize = vsnprintf_s( pszFormatted, nAttemptedSize, _TRUNCATE, cFormatString, argsCopy );
-#endif // LOGOG_UNICODE
-#else // LOGOG_FLAVOR_WINDOWS
-#ifdef LOGOG_UNICODE
-			nActualSize = vswprintf( pszFormatted, nSizeInWords, cFormatString, argsCopy );
-#else // LOGOG_UNICODE
-			nActualSize = vsnprintf( pszFormatted, nAttemptedSize, cFormatString, argsCopy );
-#endif // LOGOG_UNICODE
-#endif // LOGOG_FLAVOR_WINDOWS
-
-			va_end( argsCopy );
-
-			/** Convert the number of LOGOG_CHARs actually formatted into bytes.  This
-			 ** does NOT include the trailing NULL.
-			 **/
-			if ( nActualSize != -1 )
-				nActualSize *= sizeof( LOGOG_CHAR );
-
-			/** When we're doing the compare, we have to keep in mind that the nActualSize
-			 ** does not include a null.  We need to verify that the nAttemptedSize can hold all
-			 ** of nActualSize PLUS the size of one null on this platform.  A LOGOG_CHAR could
-			 ** be 1, 2, or 4 bytes long.  So nAttemptedSize must be greater or equal to nActualSize
-			 ** less the size of one (null) LOGOG_CHAR in bytes.  Also, the last
-			 ** allocation may have failed altogether.
-			 ** 
-			 **/
-			if (( nAttemptedSize >= (nActualSize - (int)sizeof(LOGOG_CHAR))) && ( nActualSize != -1))
-				break;
-
-			/** That attempted allocation failed */
-			Deallocate( pszFormatted );
-
-			/** If nActualSize has a positive value, it includes the number of bytes needed to hold
-			 ** the formatted string; we'll add a LOGOG_CHAR size to the end for the next
-			 ** allocation.  If nActualSize has no meaningful value, we'll double the previous
-			 ** size and try again.
-			 **/
-			if (nActualSize > 0)
-			{
-				nAttemptedSize = nActualSize + sizeof( LOGOG_CHAR );
-			}
-			else
-			{
-				nAttemptedSize *= 2;
-			}
-
-		}
-
-		m_bIsConst = false;
-		assign( pszFormatted );
-		/* We just allocated this string, which means it needs to be deallocated
-		 * at shutdown time.  The previous function may have changed the const
-		 * setting for this string, which means we may need to change it back here... 
-		 * */
-		m_bIsConst = false;
-	}
-
-	void String::Initialize()
-	{
-		m_pBuffer = NULL;
-		m_pOffset = NULL;
-		m_pEndOfBuffer = NULL;
-		m_pKMP = NULL;
-		m_bIsConst = false;
-	}
-
-	void String::preKmp( size_t m )
-	{
-		ScopedLock sl( GetStringSearchMutex() );
-
-		size_t i, j;
-
-		if ( m_pBuffer == NULL )
-			return;
-
-		if ( m_pKMP == NULL )
-		{
-			m_pKMP = (size_t *)Allocate( sizeof( size_t ) * ( m + 1) );
-		}
-
-		i = 0;
-		j = *m_pKMP = (size_t)-1;
-
-		while (i < m)
-		{
-			while (j > (size_t)-1 && m_pBuffer[i] != m_pBuffer[j])
-				j = m_pKMP[j];
-			i++;
-			j++;
-			if (m_pBuffer[i] == m_pBuffer[j])
-				m_pKMP[i] = m_pKMP[j];
-			else
-				m_pKMP[i] = j;
-		}
-	}
-
-	size_t String::KMP( const LOGOG_CHAR *y, size_t n )
-	{
-		size_t i, j;
-
-		size_t m = size() - 1; // ignore NULL char
-
-		/* Preprocessing */
-		if ( m_pKMP == NULL )
-			preKmp( m );
-
-		/* Searching */
-		i = j = 0;
-		while (j < n)
-		{
-			while (i > (size_t)-1 && m_pBuffer[i] != y[j])
-				i = m_pKMP[i];
-			i++;
-			j++;
-			if (i >= m)
-			{
-				return (j - i);
-				// We would do this if we cared about multiple substrings
-				// i = m_pKMP[i];
-			}
-		}
-
-		return npos;
-	}
-}
-
diff --git a/ThirdParty/logog/src/message.cpp b/ThirdParty/logog/src/message.cpp
deleted file mode 100644
index ffc38891a973323ca6e67ffa36564288a317b095..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/message.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/* 
- * \file message.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog
-{
-	Message::Message( const LOGOG_LEVEL_TYPE level,
-             const LOGOG_CHAR *sFileName ,
-             const int nLineNumber,
-             const LOGOG_CHAR *sGroup,
-             const LOGOG_CHAR *sCategory,
-             const LOGOG_CHAR *sMessage,
-             const double dTimestamp,
-			 bool *pbIsCreated ) :
-        Checkpoint( level, sFileName, nLineNumber, sGroup, sCategory, sMessage, dTimestamp )
-    {
-		m_pbIsCreated = pbIsCreated;
-
-		if ( pbIsCreated != NULL )
-			*pbIsCreated = true;
-
-        /* Messages are always sources, so there's no need to call Initialize() here */
-        // Initialize();
-
-        /* NOTE!  The message is typically assigned to a checkpoint AFTER it's been published.
-         * Ergo a message needs to be unpublished from, and published to, all filters
-         * iff one of those filters is searching for a substring of that message.
-         */
-        PublishToMultiple( AllFilters() );
-    }
-
-	Message::~Message()
-	{
-		if ( m_pbIsCreated != NULL )
-			*m_pbIsCreated = false;
-	}
-
-
-	bool Message::Republish()
-	{
-		UnpublishToMultiple( AllFilters() );
-		return PublishToMultiple( AllFilters() );
-	}
-
-	Mutex &GetMessageCreationMutex()
-	{
-		Statics *pStatic = &Static();
-
-		if ( pStatic->s_pMessageCreationMutex == NULL )
-			pStatic->s_pMessageCreationMutex = new Mutex();
-
-		return *( pStatic->s_pMessageCreationMutex );
-	}
-
-	void DestroyMessageCreationMutex()
-	{
-		Statics *pStatic = &Static();
-
-		if ( pStatic->s_pMessageCreationMutex != NULL )
-		{
-			delete pStatic->s_pMessageCreationMutex;
-			pStatic->s_pMessageCreationMutex = NULL;
-		}
-	}
-}
-
-
diff --git a/ThirdParty/logog/src/mutex.cpp b/ThirdParty/logog/src/mutex.cpp
deleted file mode 100644
index 730a5c42d88e29ca2567db73ab9be70a036e2f40..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/mutex.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
- 
-/* 
- * \file mutex.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	Mutex::Mutex() LOGOG_MUTEX_CTOR( m_Mutex )
-	{
-		LOGOG_MUTEX_INIT(&m_Mutex);
-	}
-
-	Mutex::Mutex( const Mutex & )
-	{
-		LOGOG_MUTEX_INIT(&m_Mutex);
-	}
-
-	Mutex & Mutex::operator = (const Mutex &)
-	{
-		LOGOG_MUTEX_INIT(&m_Mutex);
-		return *this;
-	}
-
-	Mutex::~Mutex()
-	{
-		LOGOG_MUTEX_DELETE(&m_Mutex);
-	}
-
-	void Mutex::MutexLock()
-	{
-		LOGOG_MUTEX_LOCK(&m_Mutex);
-	}
-
-	void Mutex::MutexUnlock()
-	{
-		LOGOG_MUTEX_UNLOCK(&m_Mutex);
-	}
-
-	ScopedLock::ScopedLock( Mutex &mutex )
-	{
-		m_pMutex = &mutex;
-		m_pMutex->MutexLock();
-	}
-
-	ScopedLock::~ScopedLock()
-	{
-		m_pMutex->MutexUnlock();
-	}
-
-#ifdef LOGOG_LEAK_DETECTION
-	Mutex s_AllocationsMutex;
-	void LockAllocationsMutex()
-	{
-		s_AllocationsMutex.MutexLock();
-	}
-	void UnlockAllocationsMutex()
-	{
-		s_AllocationsMutex.MutexUnlock();
-	}
-#endif // LOGOG_LEAK_DETECTION
-
-	Mutex &GetStringSearchMutex()
-	{
-		Statics *pStatic = &Static();
-		Mutex **ppStringSearchMutex = (Mutex **)&( pStatic->s_pStringSearchMutex );
-
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( pStatic == NULL )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-		if ( *ppStringSearchMutex == NULL )
-			*ppStringSearchMutex = new Mutex();
-
-		return *(( Mutex *)( *ppStringSearchMutex ));
-	}
-
-	void DestroyStringSearchMutex()
-	{
-		Statics *pStatic = &Static();
-		Mutex **ppStringSearchMutex = (Mutex **)&( pStatic->s_pStringSearchMutex );
-
-		if ( *ppStringSearchMutex != NULL )
-		{
-			delete *ppStringSearchMutex;
-			*ppStringSearchMutex = NULL;
-		}
-	}
-
-}
-
diff --git a/ThirdParty/logog/src/node.cpp b/ThirdParty/logog/src/node.cpp
deleted file mode 100644
index 2c161609be1bb54884a1f89bf9ca16272ec80d2c..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/node.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
- 
-/* 
- * \file node.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	LockableNodesType & LockableNodesType::operator = (const LockableNodesType &other)
-	{
-		/* This function is only used at shutdown. */
-		LockableNodesType::const_iterator it;
-
-		it = other.begin();
-		while ( it != other.end())
-		{
-			this->insert( *it );
-			++it;
-		}
-
-		return *this;
-	}
-
-	LockableNodesType &GetStaticNodes( void ** pvLocation )
-	{
-		if ( *pvLocation == NULL )
-			*pvLocation = new LockableNodesType();
-
-		return *(( LockableNodesType *)( *pvLocation ));
-
-	}
-
-	LockableNodesType &AllNodes()
-	{
-	    return GetStaticNodes( &(Static().s_pAllNodes) );
-	}
-
-	LockableNodesType &AllSubscriberNodes()
-	{
-		return GetStaticNodes( &(Static().s_pAllSubscriberNodes ) );
-	}
-
-	LockableNodesType &AllFilters()
-	{
-		return GetStaticNodes( &(Static().s_pAllFilterNodes ) );
-	}
-
-	LockableNodesType &AllTargets()
-	{
-		return GetStaticNodes( &(Static().s_pAllTargets ) );
-	}
-
-	Node::Node()
-	{
-		AllNodes().insert( this );
-	}
-
-	Node::~Node()
-	{
-		Clear();
-		AllNodes().erase( this );
-	}
-
-	void Node::Initialize()
-	{
-		if ( CanSubscribe() )
-		{
-			LockableNodesType *pSubscriberNodes = &AllSubscriberNodes();
-
-			{
-				ScopedLock sl( *pSubscriberNodes );
-				pSubscriberNodes->insert( this );
-			}
-
-			/* This branch is taken iff this node can both subscribe and publish */
-			if ( CanPublish() )
-			{
-				LockableNodesType *pFilterNodes = &AllFilters();
-				{
-					ScopedLock sl( *pFilterNodes );
-					pFilterNodes->insert( this );
-				}
-			}
-		}
-	}
-
-	bool Node::CanPublish() const
-	{
-		return true;
-	}
-
-	bool Node::CanSubscribe() const
-	{
-		return true;
-	}
-
-	bool Node::CanSubscribeTo( const Node & )
-	{
-		return CanSubscribe();
-	}
-
-	bool Node::IsTopic() const
-	{
-		return false;
-	}
-
-	bool Node::PublishTo( Node &subscriber )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( &subscriber == this )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-		bool bWasInserted;
-
-		{
-			ScopedLock sl( m_Subscribers );
-			bWasInserted = ( m_Subscribers.insert( &subscriber ) ).second;
-		}
-
-		if ( bWasInserted )
-			subscriber.SubscribeTo( *this );
-
-		return bWasInserted;
-	}
-
-	bool Node::PublishToMultiple( LockableNodesType &nodes )
-	{
-		LockableNodesType::iterator it;
-
-		bool bWasPublished = false;
-
-		nodes.MutexLock();
-		it = nodes.begin();
-
-		while ( it != nodes.end() )
-		{
-			if ( PublishTo( **it ) == true )
-				bWasPublished = true;
-
-			it++;
-		}
-
-		nodes.MutexUnlock();
-
-		return bWasPublished;
-	}
-
-	bool Node::UnpublishTo( Node &subscriber )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( &subscriber == this )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-		bool bWasRemoved = false;
-
-		{
-			ScopedLock sl( m_Subscribers );
-			NodesType::iterator it;
-
-			if ( ( it = m_Subscribers.find( &subscriber) ) != m_Subscribers.end() )
-			{
-				bWasRemoved = true;
-				m_Subscribers.erase( it );
-			}
-		}
-
-		if ( bWasRemoved )
-			subscriber.UnsubscribeTo( *this );
-
-		return bWasRemoved;
-	}
-
-	bool Node::UnpublishToMultiple( LockableNodesType &nodes )
-	{
-		LockableNodesType::iterator it;
-
-		bool bWasUnpublished = false;
-
-		nodes.MutexLock();
-		it = nodes.begin();
-
-		while ( it != nodes.end() )
-		{
-			if ( UnpublishTo( **it ) == true )
-				bWasUnpublished = true;
-
-			it++;
-		}
-
-		nodes.MutexUnlock();
-
-		return bWasUnpublished;
-	}
-
-	bool Node::SubscribeTo( Node &publisher )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( &publisher == this )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-		bool bWasInserted;
-
-		{
-			ScopedLock sl( m_Publishers );
-			bWasInserted = ( m_Publishers.insert( &publisher ) ).second;
-		}
-
-		if ( bWasInserted )
-			publisher.PublishTo( *this );
-
-		return bWasInserted;
-	}
-
-	bool Node::SubscribeToMultiple( LockableNodesType &nodes )
-	{
-		LockableNodesType::iterator it;
-
-		bool bWasSubscribed = false;
-
-		nodes.MutexLock();
-		it = nodes.begin();
-
-		while ( it != nodes.end() )
-		{
-			if ( SubscribeTo( **it ) == true )
-				bWasSubscribed = true;
-
-			it++;
-		}
-
-		nodes.MutexUnlock();
-
-		return bWasSubscribed;
-	}
-
-	bool Node::UnsubscribeTo( Node &publisher )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( &publisher == this )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-		bool bWasRemoved = false;
-
-		{
-			ScopedLock sl( m_Publishers );
-			NodesType::iterator it;
-
-			if ( ( it = m_Publishers.find( &publisher ) ) != m_Publishers.end() )
-			{
-				bWasRemoved = true;
-				m_Publishers.erase( it );
-			}
-		}
-
-		if ( bWasRemoved )
-			publisher.UnpublishTo( *this );
-
-		return bWasRemoved;
-	}
-
-	bool Node::UnsubscribeToMultiple( LockableNodesType &nodes )
-	{
-		LockableNodesType::iterator it;
-
-		bool bWasUnsubscribed = false;
-
-		nodes.MutexLock();
-		it = nodes.begin();
-
-		while ( it != nodes.end() )
-		{
-			if ( UnsubscribeTo( **it ) == true )
-				bWasUnsubscribed = true;
-
-			it++;
-		}
-
-		nodes.MutexUnlock();
-
-		return bWasUnsubscribed;
-	}
-
-	void Node::Clear()
-	{
-		{
-			ScopedLock sl( m_Publishers );
-			m_Publishers.clear();
-		}
-		{
-			ScopedLock sl( m_Subscribers );
-			m_Publishers.clear();
-		}
-	}
-
-
-	void DestroyNodesList( void **pvList )
-	{
-		LockableNodesType **ppNodesList = (LockableNodesType **)pvList;
-
-		if ( *ppNodesList == NULL )
-			return;
-
-		(*ppNodesList)->clear();
-		delete *ppNodesList;
-		*ppNodesList = NULL;
-	}
-
-	void DestroyAllNodes()
-	{
-		Statics *pStatics = &Static();
-
-		LockableNodesType *pAllNodes = ( LockableNodesType *)pStatics->s_pAllNodes;
-
-		if ( pAllNodes == NULL )
-			return;
-
-		/** Destroy all the node groups, but don't destroy their contents -- we'll do that as the next step. */
-		DestroyNodesList( &(pStatics->s_pAllSubscriberNodes ));
-		DestroyNodesList( &(pStatics->s_pAllFilterNodes ));
-		DestroyNodesList( &(pStatics->s_pAllTargets ));
-
-		/* We have to copy the AllNodes because destroying each node will remove it from AllNodes.  Fortunately
-		 * this only happens at shutdown, so we don't have to worry about efficiency.
-		 */
-		LockableNodesType nodes = *pAllNodes;
-
-		LockableNodesType::iterator it;
-
-		it = nodes.begin();
-
-		while ( it != nodes.end() )
-		{
-			delete *it;
-			it++;
-		}
-
-		nodes.clear();
-
-	#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( pAllNodes->size() != 0 )
-			cout << "Not all nodes were deleted at shutdown -- memory leak may have occurred" << endl;
-	#endif
-
-		pAllNodes->clear(); // just in case
-		delete pAllNodes;
-		pStatics->s_pAllNodes = NULL;
-	}
-
-}
-
diff --git a/ThirdParty/logog/src/platform.cpp b/ThirdParty/logog/src/platform.cpp
deleted file mode 100644
index d191d10560bce86a951af98f73a881d67a57447f..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/platform.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
- /* 
- * \file platform.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	bool sb_AvoidLinkError4221_platform_cpp = false;
-}
-
diff --git a/ThirdParty/logog/src/socket.cpp b/ThirdParty/logog/src/socket.cpp
deleted file mode 100644
index 533de0b7d8ddf86be880705cd30af791db5d0817..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/socket.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-/* 
- * \file socket.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-	bool sb_AvoidLinkError4221_socket_cpp = false;
-}
-
diff --git a/ThirdParty/logog/src/statics.cpp b/ThirdParty/logog/src/statics.cpp
deleted file mode 100644
index 05ec6bdcfdd88a922f7e2791f28e60d7852af7ca..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/statics.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
- /* 
- * \file statics.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	Statics::Statics()
-	{
-		s_pAllNodes = NULL;
-		s_pAllSubscriberNodes = NULL;
-		s_pAllFilterNodes = NULL;
-		s_pAllTargets = NULL;
-		s_pTimer = NULL;
-		s_pDefaultFormatter = NULL;
-		s_pDefaultFilter = NULL;
-		s_pStringSearchMutex = NULL;
-		s_pMessageCreationMutex = NULL;
-		s_pfMalloc = NULL;
-		s_pfFree = NULL;
-		s_pSelf = this;
-		s_nSockets = 0;
-	}
-
-	void Statics::Reset()
-	{
-		DestroyGlobalTimer();
-		DestroyDefaultFormatter();
-		s_pDefaultFilter = NULL; // This will be destroyed on the next step
-		DestroyAllNodes();
-		DestroyStringSearchMutex();
-		DestroyMessageCreationMutex();
-		s_pfMalloc = NULL;
-		s_pfFree = NULL;
-		s_nSockets = 0;
-	}
-
-	Statics::~Statics()
-	{
-		Reset();
-	}
-
-	Statics s_Statics;
-
-	Statics &Static()
-	{
-		return s_Statics;
-	}
-
-	void DestroyStatic()
-	{
-		s_Statics.~Statics();
-	}
-
-}
-
diff --git a/ThirdParty/logog/src/target.cpp b/ThirdParty/logog/src/target.cpp
deleted file mode 100644
index da9883e1feb8c6b526bc7569d9a541b8212d0ce0..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/target.cpp
+++ /dev/null
@@ -1,345 +0,0 @@
- /*
- * \file target.cpp
- */
-
-#include "logog.hpp"
-
-#include <iostream>
-
-namespace logog {
-
-	Target::Target() :
-		m_bNullTerminatesStrings( true )
-	{
-		SetFormatter( GetDefaultFormatter() );
-		LockableNodesType *pAllTargets = &AllTargets();
-
-		{
-			ScopedLock sl( *pAllTargets );
-			pAllTargets->insert( this );
-		}
-
-		SubscribeToMultiple( AllFilters() );
-	}
-
-
-	Target::~Target()
-	{
-		LockableNodesType *pAllTargets = &AllTargets();
-
-		UnsubscribeToMultiple( AllFilters() );
-
-		{
-			ScopedLock sl( *pAllTargets );
-			pAllTargets->erase( this );
-		}
-	}
-
-	void Target::SetFormatter( Formatter &formatter )
-	{
-		m_pFormatter = &formatter;
-	}
-
-	Formatter & Target::GetFormatter() const
-	{
-		return *m_pFormatter;
-	}
-
-	int Target::Receive( const Topic &topic )
-	{
-		ScopedLock sl( m_MutexReceive );
-		return Output( m_pFormatter->Format( topic, *this ) );
-	}
-
-	int Cerr::Output( const LOGOG_STRING &data )
-	{
-		LOGOG_CERR << (const LOGOG_CHAR *)data;
-
-		return 0;
-	}
-//! [Cout]
-	int Cout::Output( const LOGOG_STRING &data )
-	{
-		LOGOG_COUT << (const LOGOG_CHAR *)data;
-
-		return 0;
-	}
-//! [Cout]
-
-	int OutputDebug::Output( const LOGOG_STRING &data )
-	{
-#ifdef LOGOG_FLAVOR_WINDOWS
-#ifdef LOGOG_UNICODE
-		OutputDebugStringW( (const LOGOG_CHAR *)data );
-#else
-		OutputDebugStringA( (const LOGOG_CHAR *)data );
-#endif // LOGOG_UNICODE
-#else
-		(void)data;
-#endif // LOGOG_FLAVOR_WINDOWS
-		return 0;
-	}
-
-	LogFile::LogFile(const char *sFileName) :
-		m_bFirstTime( true ),
-		m_bOpenFailed( false ),
-		m_pFile( NULL )
-	{
-		m_bNullTerminatesStrings = false;
-
-#ifdef LOGOG_UNICODE
-		m_bWriteUnicodeBOM = true;
-#else // LOGOG_UNICODE
-		m_bWriteUnicodeBOM = false;
-#endif // LOGOG_UNICODE
-
-		int nNameLength = 0;
-
-		const char *sNameCount = sFileName;
-		while ( *sNameCount++ != '\0' )
-			nNameLength++;
-
-		// add one for trailing null
-		nNameLength++;
-
-		m_pFileName = (char *)Object::Allocate( nNameLength );
-
-		char *m_pOut = m_pFileName;
-		while ( ( *m_pOut++ = *sFileName++) != '\0' )
-			;
-	}
-
-	LogFile::~LogFile()
-	{
-		if ( m_pFile )
-			fclose( m_pFile );
-
-		Object::Deallocate( m_pFileName );
-	}
-
-	int LogFile::Open()
-	{
-		int nError = 1; // preset this in case LOGOG_FLAVOR_WINDOWS is not defined
-
-		bool bFileAlreadyExists = false;
-		FILE *fpTest;
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-		nError = fopen_s( &fpTest, m_pFileName, "r"); // ignore the error code
-#else // LOGOG_FLAVOR_WINDOWS
-		(void)nError; // Unused
-		fpTest = fopen( m_pFileName, "r");
-#endif // LOGOG_FLAVOR_WINDOWS
-
-		if ( fpTest != NULL )
-		{
-			fclose( fpTest );
-			bFileAlreadyExists = true;
-		}
-
-		/** Windows tries to be clever and help us with converting line feeds
-		 ** to carriage returns when writing a text file.  This causes problems
-		 ** when writing a Unicode file as Windows helpfully inserts a single-byte
-		 ** 0x0D between the return and line feed on write.  So we open and operate
-		 ** the output in binary mode only.
-		 **/
-#ifdef LOGOG_FLAVOR_WINDOWS
-#ifdef LOGOG_UNICODE
-		nError = fopen_s( &m_pFile, m_pFileName, "ab, ccs=UNICODE" );
-#else // LOGOG_UNICODE
-		nError = fopen_s( &m_pFile, m_pFileName, "ab" );
-#endif // LOGOG_UNICODE
-		if ( nError != 0 )
-			return nError;
-#else // LOGOG_FLAVOR_WINDOWS
-		m_pFile = fopen( m_pFileName, "ab+" );
-#endif // LOGOG_FLAVOR_WINDOWS
-
-		if ( m_pFile == NULL )
-			m_bOpenFailed = true; // and no further outputs will work
-		else
-		{
-#ifdef LOGOG_UNICODE
-			if ( !bFileAlreadyExists )
-			{
-				WriteUnicodeBOM();
-			}
-#endif
-		}
-
-		return ( m_pFile ? 0 : -1 );
-	}
-
-	int LogFile::Output( const LOGOG_STRING &data )
-	{
-		if ( m_bOpenFailed )
-			return -1;
-
-		int result = 0;
-		if ( m_bFirstTime )
-		{
-			result = Open();
-			if ( result != 0 )
-				return result;
-
-			m_bFirstTime = false;
-		}
-
-		return InternalOutput( data.size(), data.c_str());
-	}
-
-	int LogFile::InternalOutput( size_t nSize, const LOGOG_CHAR *pData )
-		{
-        size_t result;
-
-		result = fwrite( pData, sizeof( LOGOG_CHAR ), nSize, m_pFile );
-
-		if ( (size_t)result != nSize )
-			return -1;
-
-		return 0;
-	}
-
-	void LogFile::WriteUnicodeBOM()
-	{
-		static union {
-			int i;
-			char c[4];
-		} bDetectEndian = {0x01020304};
-
-		bool bIsLittleEndian = ( bDetectEndian.c[0] != 1 );
-
-		switch ( sizeof( LOGOG_CHAR ))
-		{
-		case 1:
-			// This could be a UTF-8 BOM but technically very few systems support
-			// sizeof( wchar_t ) == sizeof( char ).  So for now we're not going
-			// to write a BOM in these cases.
-			break;
-
-		case 2:
-			if ( bIsLittleEndian )
-				InternalOutput( 1, (const LOGOG_CHAR *)"\xFF\xFE" ); // little endian UTF-16LE
-			else
-				InternalOutput( 1, (const LOGOG_CHAR *)"\xFE\xFF" ); // big endian UTF-16BE
-
-			break;
-
-		case 4:
-			if ( bIsLittleEndian )
-				InternalOutput( 1, (const LOGOG_CHAR *)"\xFF\xFE\x00\x00" ); // little endian UTF-32LE
-			else
-				InternalOutput( 1, (const LOGOG_CHAR *)"\x00\x00\xFE\xFF" ); // big endian UTF-32BE
-
-			break;
-
-		default:
-			// No idea what that character size is; do nothing
-			break;
-		}
-	}
-
-	LogBuffer::LogBuffer( Target *pTarget ,
-		size_t s  ) :
-	m_pStart( NULL ),
-		m_nSize( 0 )
-	{
-		m_pOutputTarget = pTarget;
-		Allocate( s );
-	}
-
-	LogBuffer::~LogBuffer()
-	{
-		Dump();
-		Deallocate();
-	}
-
-	void LogBuffer::SetTarget( Target &t )
-	{
-		m_pOutputTarget = &t;
-	}
-
-	int LogBuffer::Insert( const LOGOG_CHAR *pChars, size_t size )
-	{
-		if (( m_pCurrent + size ) >= m_pEnd )
-			Dump();
-
-		if ( size > (size_t)( m_pEnd - m_pStart ))
-		{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-			cerr << "Cannot insert string into buffer; string is larger than buffer.  Allocate a larger size for the LogBuffer." << endl;
-#endif
-			return -1; // can't fit this into buffer; punt it
-		}
-
-		// Store the size of this string in the buffer
-		size_t *pSize;
-		pSize = ( size_t *)m_pCurrent;
-		*pSize = size;
-		m_pCurrent = (LOGOG_CHAR *)++pSize;
-
-		while ( size-- )
-			*m_pCurrent++ = *pChars++;
-
-		return 0;
-	}
-
-	int LogBuffer::Dump()
-	{
-		LOGOG_CHAR *pCurrent = m_pStart;
-		size_t *pSize;
-		int nError;
-
-		if ( m_pOutputTarget == NULL )
-			return -1;
-
-		// We have to lock the output target here, as we do an end run around its Receive() function */
-		ScopedLock sl( m_pOutputTarget->m_MutexReceive );
-
-		while ( pCurrent < m_pCurrent )
-		{
-			String sOut;
-			// Get the size of this entry
-			pSize = ( size_t * )pCurrent;
-			// Move past that entry into the data area
-			pCurrent = ( LOGOG_CHAR * )( pSize + 1 );
-
-			sOut.assign( pCurrent, pCurrent + *pSize - 1 );
-
-			if ( m_pOutputTarget )
-			{
-				nError = m_pOutputTarget->Output( sOut );
-				if ( nError != 0 )
-					return nError;
-			}
-
-			pCurrent += *pSize;
-		}
-
-		// reset buffer
-		m_pCurrent = m_pStart;
-
-		return 0;
-	}
-
-	int LogBuffer::Output( const LOGOG_STRING &data )
-	{
-		return Insert( &(*data), data.size() );
-	}
-
-	void LogBuffer::Allocate( size_t size )
-	{
-		m_nSize = size;
-		m_pCurrent = m_pStart = (LOGOG_CHAR *)Object::Allocate( size * sizeof( LOGOG_CHAR ));
-		m_pEnd = m_pStart + size;
-	}
-
-	void LogBuffer::Deallocate()
-	{
-		if ( m_pStart )
-			Object::Deallocate( m_pStart );
-
-		m_nSize = 0;
-	}
-}
-
diff --git a/ThirdParty/logog/src/timer.cpp b/ThirdParty/logog/src/timer.cpp
deleted file mode 100644
index accaacac1d6b128e9cccf70948f423777fc1f2d8..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/timer.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
- 
-/* 
- * \file timer.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	Timer::Timer()
-	{
-		m_fStartTime = 0.0f;
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-		LARGE_INTEGER TicksPerSecond;
-		QueryPerformanceFrequency( &TicksPerSecond );
-		m_fTicksPerMicrosecond = (DOUBLE)TicksPerSecond.QuadPart * 0.000001;
-#endif
-		Set( 0.0f );
-	}
-
-//! [TimerGet]
-	logog::LOGOG_TIME Timer::Get()
-	{
-#ifdef LOGOG_FLAVOR_WINDOWS
-		LARGE_INTEGER liTime;
-		QueryPerformanceCounter( &liTime );
-
-		double dusec;
-		dusec =( liTime.QuadPart / m_fTicksPerMicrosecond );
-
-		return ( dusec / 1000000.0f ) - m_fStartTime;
-#endif
-
-#ifdef LOGOG_FLAVOR_POSIX
-#ifdef LOGOG_TARGET_PS3
-		LOGOG_PS3_GET_TIME;
-#else // LOGOG_TARGET_PS3
-		// General Posix implementation
-		timeval tv;
-		gettimeofday( &tv, 0 );
-		return ((double) (tv.tv_sec) + ((double)(tv.tv_usec ) / 1000000.0 ) - m_fStartTime);
-#endif // LOGOG_TARGET_PS3
-#endif
-	}
-//! [TimerGet]
-
-	void Timer::Set( LOGOG_TIME time )
-	{
-		m_fStartTime = time + Get();
-	}
-
-	Timer &GetGlobalTimer()
-	{
-		Statics *pStatic = &Static();
-
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( pStatic == NULL )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-
-		if ( pStatic->s_pTimer == NULL )
-			pStatic->s_pTimer = new Timer();
-
-		return *(pStatic->s_pTimer );
-	}
-
-	void DestroyGlobalTimer()
-	{
-		Statics *pStatic = &Static();
-		Timer *pGlobalTimer = pStatic->s_pTimer;
-
-		if ( pGlobalTimer != NULL )
-			delete pGlobalTimer;
-
-		pStatic->s_pTimer = NULL;
-	}
-
-}
-
diff --git a/ThirdParty/logog/src/topic.cpp b/ThirdParty/logog/src/topic.cpp
deleted file mode 100644
index 619aa305c745b1cbc4306e41491a65934c465283..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/topic.cpp
+++ /dev/null
@@ -1,454 +0,0 @@
- 
-/* 
- * \file topic.cpp
- */
-
-#include "logog.hpp"
-
-namespace logog {
-
-	void SetDefaultLevel( LOGOG_LEVEL_TYPE level )
-	{
-		Filter *pDefaultFilter = &GetDefaultFilter();
-
-		pDefaultFilter->Level( level );
-	}
-
-	Topic::Topic( const LOGOG_LEVEL_TYPE level ,
-		const LOGOG_CHAR *sFileName ,
-		const int nLineNumber ,
-		const LOGOG_CHAR *sGroup ,
-		const LOGOG_CHAR *sCategory ,
-		const LOGOG_CHAR *sMessage ,
-		const double dTimestamp )
-	{
-		m_TopicFlags = 0;
-
-		if ( sFileName != NULL )
-		{
-			m_vStringProps[ TOPIC_FILE_NAME ] = sFileName;
-			m_TopicFlags |= TOPIC_FILE_NAME_FLAG;
-		}
-
-		if ( sGroup != NULL )
-		{
-			m_vStringProps[ TOPIC_GROUP ] = sGroup;
-			m_TopicFlags |= TOPIC_GROUP_FLAG;
-		}
-
-		if ( sCategory != NULL )
-		{
-			m_vStringProps[ TOPIC_CATEGORY ] = sCategory;
-			m_TopicFlags |= TOPIC_CATEGORY_FLAG;
-		}
-
-		if ( sMessage != NULL )
-		{
-			m_vStringProps[ TOPIC_MESSAGE ] = sMessage;
-			m_TopicFlags |= TOPIC_MESSAGE_FLAG;
-		}
-
-		m_vIntProps[ TOPIC_LEVEL ] = level;
-
-		if ( level != LOGOG_LEVEL_ALL )
-		{
-			m_TopicFlags |= TOPIC_LEVEL_FLAG;
-		}
-
-		m_vIntProps[ TOPIC_LINE_NUMBER ] = nLineNumber;
-
-		if ( nLineNumber != 0 )
-		{
-			m_TopicFlags |= TOPIC_LINE_NUMBER_FLAG;
-		}
-
-		m_tTime = dTimestamp;
-
-		if ( dTimestamp != 0.0f ) //-V550
-			m_TopicFlags |= TOPIC_TIMESTAMP_FLAG;
-	}
-
-	bool Topic::IsTopic() const
-	{
-		return true;
-	}
-
-	int Topic::Send( const Topic &node )
-	{
-		LockableNodesType::iterator it;
-
-		{
-			ScopedLock sl( m_Subscribers );
-			it = m_Subscribers.begin();
-		}
-
-		/* Iterate over the subscribers, but only addressing the subscribers group while locking it */
-		Topic *pCurrentTopic;
-		Node *pCurrentNode;
-		m_Subscribers.MutexLock();
-		int nError = 0;
-
-		while ( it != m_Subscribers.end() )
-		{
-			pCurrentNode = *it;
-
-			if ( pCurrentNode->IsTopic() == false )
-				continue;
-
-			pCurrentTopic = ( Topic * )pCurrentNode;
-
-			if ( pCurrentTopic )
-				nError += pCurrentTopic->Receive( node );
-
-			it++;
-		}
-
-		m_Subscribers.MutexUnlock();
-
-		return nError;
-	}
-
-	int Topic::Transmit()
-	{
-		return Send( *this );
-	}
-
-	int Topic::Receive( const Topic &node )
-	{
-		/* Default implementation -- send it on to all children */
-		return Send( node );
-	}
-
-	bool Topic::CanSubscribeTo( const Node &otherNode )
-	{
-		if ( CanSubscribe() == false )
-			return false;
-
-		if ( otherNode.IsTopic() == false )
-			return false;
-
-		Topic *pTopic = ( Topic * )&otherNode;
-
-		/* This function will change from topic class to topic class. */
-		return CanSubscribeCheckTopic( *pTopic );
-	}
-
-	bool Topic::CanSubscribeCheckTopic( const Topic &other )
-	{
-		/* This is the generic comparison case.  We'll want to optimize this function for other types
-		* of topics.
-		*/
-
-		/* Check topics in likely order of disinterest */
-		if ( m_TopicFlags & TOPIC_LEVEL_FLAG )
-		{
-			/* Topic levels are less interesting the larger the numbers are. */
-			if ( other.m_vIntProps[ TOPIC_LEVEL ] > m_vIntProps[ TOPIC_LEVEL ] )
-				return false;
-		}
-
-		if ( m_TopicFlags & TOPIC_GROUP_FLAG )
-		{
-			/* If our topic is not a substring of the publisher's topic, ignore this */
-			if (( other.m_vStringProps[ TOPIC_GROUP ] ).find( m_vStringProps[ TOPIC_GROUP ] ) == LOGOG_STRING::npos )
-				return false;
-		}
-
-		if ( m_TopicFlags & TOPIC_CATEGORY_FLAG )
-		{
-			/* If our topic is not a substring of the publisher's topic, ignore this */
-			if (( other.m_vStringProps[ TOPIC_CATEGORY ] ).find( m_vStringProps[ TOPIC_CATEGORY ] ) == LOGOG_STRING::npos )
-				return false;
-		}
-
-		if ( m_TopicFlags & TOPIC_FILE_NAME_FLAG )
-		{
-			/* If our topic is not a substring of the publisher's file name, ignore this. */
-			if (( other.m_vStringProps[ TOPIC_FILE_NAME ] ).find( m_vStringProps[ TOPIC_FILE_NAME ] ) == LOGOG_STRING::npos )
-				return false;
-		}
-
-		if ( m_TopicFlags & TOPIC_LINE_NUMBER_FLAG )
-		{
-			/* If our line number doesn't equal theirs, ignore this */
-			if ( other.m_vIntProps[ TOPIC_LINE_NUMBER ] != m_vIntProps[ TOPIC_LINE_NUMBER ] )
-				return false;
-		}
-
-		if ( m_TopicFlags & TOPIC_MESSAGE_FLAG )
-		{
-			/* If our topic is not a substring of the publisher's file name, ignore this. */
-			if (( other.m_vStringProps[ TOPIC_MESSAGE ] ).find( m_vStringProps[ TOPIC_MESSAGE ] ) == LOGOG_STRING::npos )
-				return false;
-		}
-
-		if ( m_TopicFlags & TOPIC_TIMESTAMP_FLAG )
-		{
-			/* Timestamps are only interesting if they're greater than or equal to ours. */
-			if ( other.m_tTime < m_tTime )
-				return false;
-		}
-
-		/* all tests passed */
-		return true;
-	}
-
-	bool Topic::PublishTo( Node &subscriber )
-	{
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( &subscriber == this )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-		bool bWasInserted;
-
-		/** Additional checking may be required first -- can the subscriber handle this publishing? */
-		if ( subscriber.IsTopic() )
-		{
-			Topic *pSubscriber = (Topic *)&subscriber;
-
-			if ( pSubscriber->CanSubscribeTo( *this ) == false )
-				return false;
-		}
-
-		{
-			ScopedLock sl( m_Subscribers );
-			bWasInserted = ( m_Subscribers.insert( &subscriber ) ).second;
-		}
-
-		if ( bWasInserted )
-			subscriber.SubscribeTo( *this );
-
-		return bWasInserted;
-	}
-
-	void Topic::Format( const LOGOG_CHAR *cFormatMessage, ... )
-	{
-		va_list args;
-
-		va_start( args, cFormatMessage );
-		m_vStringProps[ TOPIC_MESSAGE ].format_va( cFormatMessage, args );
-		va_end( args );
-
-		m_TopicFlags |= TOPIC_MESSAGE_FLAG;
-	}
-
-	const LOGOG_STRING & Topic::FileName() const
-	{
-		return m_vStringProps[ TOPIC_FILE_NAME ];
-	}
-
-	void Topic::FileName( const LOGOG_STRING &s )
-	{
-		m_vStringProps[ TOPIC_FILE_NAME ] = s;
-		m_TopicFlags |= TOPIC_FILE_NAME_FLAG;
-	}
-
-	const LOGOG_STRING & Topic::Message() const
-	{
-		return m_vStringProps[ TOPIC_MESSAGE ];
-	}
-
-	void Topic::Message( const LOGOG_STRING &s )
-	{
-		m_vStringProps[ TOPIC_MESSAGE ] = s;
-		m_TopicFlags |= TOPIC_MESSAGE_FLAG;
-	}
-
-	const LOGOG_STRING & Topic::Category() const
-	{
-		return m_vStringProps[ TOPIC_CATEGORY ];
-	}
-
-	void Topic::Category( const LOGOG_STRING &s )
-	{
-		m_vStringProps[ TOPIC_CATEGORY ] = s;
-		m_TopicFlags |= TOPIC_CATEGORY_FLAG;
-	}
-
-	const LOGOG_STRING & Topic::Group() const
-	{
-		return m_vStringProps[ TOPIC_GROUP ];
-	}
-
-	void Topic::Group( const LOGOG_STRING &s )
-	{
-		m_vStringProps[ TOPIC_GROUP ] = s;
-		m_TopicFlags |= TOPIC_GROUP_FLAG;
-	}
-
-	int Topic::LineNumber() const
-	{
-		return m_vIntProps[ TOPIC_LINE_NUMBER ];
-	}
-
-	void Topic::LineNumber( const int num )
-	{
-		m_vIntProps[ TOPIC_LINE_NUMBER ] = num;
-		m_TopicFlags |= TOPIC_LINE_NUMBER_FLAG;
-	}
-
-	LOGOG_LEVEL_TYPE Topic::Level() const
-	{
-		return ( LOGOG_LEVEL_TYPE )m_vIntProps[ TOPIC_LEVEL ];
-	}
-
-	void Topic::Level( LOGOG_LEVEL_TYPE level )
-	{
-		m_vIntProps[ TOPIC_LEVEL ] = level;
-		m_TopicFlags |= TOPIC_LEVEL_FLAG;
-	}
-
-	logog::LOGOG_TIME Topic::Timestamp() const
-	{
-		return m_tTime;
-	}
-
-	void Topic::Timestamp( const LOGOG_TIME t )
-	{
-		m_tTime = t;
-		m_TopicFlags |= TOPIC_TIMESTAMP_FLAG;
-	}
-
-	TOPIC_FLAGS Topic::GetTopicFlags() const
-	{
-		return m_TopicFlags;
-	}
-
-
-/********************************************************/
-
-	Filter::Filter( const LOGOG_LEVEL_TYPE level ,
-		const LOGOG_CHAR *sFileName ,
-		const int nLineNumber ,
-		const LOGOG_CHAR *sGroup ,
-		const LOGOG_CHAR *sCategory ,
-		const LOGOG_CHAR *sMessage ,
-		const double dTimestamp ) :
-	Topic( level, sFileName, nLineNumber, sGroup, sCategory, sMessage, dTimestamp )
-	{
-		Statics *pStatic = &Static();
-
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( pStatic == NULL )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-
-		if ( pStatic->s_pDefaultFilter == NULL )
-			pStatic->s_pDefaultFilter = this;
-
-		PublishToMultiple( AllTargets() );
-
-		LockableNodesType *pFilterNodes = &AllFilters();
-
-		{
-			ScopedLock sl( *pFilterNodes );
-			pFilterNodes->insert( this );
-		}
-	}
-
-	Filter &GetDefaultFilter()
-	{
-		Statics *pStatic = &Static();
-
-#ifdef LOGOG_INTERNAL_DEBUGGING
-		if ( pStatic == NULL )
-			LOGOG_INTERNAL_FAILURE;
-#endif
-
-		if ( pStatic->s_pDefaultFilter == NULL )
-		{
-			pStatic->s_pDefaultFilter = new Filter( LOGOG_LEVEL );
-		}
-
-		return *((Filter *)(pStatic->s_pDefaultFilter));
-	}
-
-	TopicGroup::TopicGroup( const LOGOG_CHAR *sGroup ) :
-		Topic( LOGOG_LEVEL_ALL, NULL, 0, sGroup )
-	{
-	}
-
-	bool TopicGroup::CanSubscribeCheckTopic( const Topic &other )
-	{
-		if ( m_TopicFlags & TOPIC_LEVEL_FLAG )
-		{
-			/* Topic levels are less interesting the larger the numbers are. */
-			if ( other.m_vIntProps[ TOPIC_LEVEL ] > m_vIntProps[ TOPIC_LEVEL ] )
-				return false;
-		}
-
-		return true;
-	}
-
-	TopicLevel::TopicLevel( const LOGOG_LEVEL_TYPE level ) :
-	Topic( level )
-	{
-	}
-
-
-	bool TopicLevel::CanSubscribeCheckTopic( const Topic &other )
-	{
-		/* Check topics in likely order of disinterest */
-		if ( m_TopicFlags & TOPIC_LEVEL_FLAG )
-		{
-			/* Topic levels are less interesting the larger the numbers are. */
-			if ( other.m_vIntProps[ TOPIC_LEVEL ] > m_vIntProps[ TOPIC_LEVEL ] )
-				return false;
-		}
-
-		/* all tests passed */
-		return true;
-	}
-
-	TopicSource::TopicSource( const LOGOG_LEVEL_TYPE level ,
-		const LOGOG_CHAR *sFileName,
-		const int nLineNumber,
-		const LOGOG_CHAR *sGroup,
-		const LOGOG_CHAR *sCategory,
-		const LOGOG_CHAR *sMessage,
-		const double dTimestamp ) :
-	Topic( level, sFileName, nLineNumber, sGroup, sCategory, sMessage, dTimestamp )
-	{
-	}
-
-	bool TopicSource::SubscribeTo( Node & )
-	{
-		return false;
-	}
-
-	bool TopicSource::UnsubscribeTo( Node & )
-	{
-		return false;
-	}
-
-	bool TopicSource::CanSubscribe() const
-	{
-		return false;
-	}
-
-	bool TopicSink::IsTopic() const
-	{
-		return true;
-	}
-
-	void TopicSink::Initialize()
-	{
-
-	}
-
-	bool TopicSink::PublishTo( Node & )
-	{
-		return false;
-	}
-
-	bool TopicSink::UnpublishTo( Node & )
-	{
-		return false;
-	}
-
-	bool TopicSink::CanPublish() const
-	{
-		return false;
-	}
-}
-
diff --git a/ThirdParty/logog/src/unittest.cpp b/ThirdParty/logog/src/unittest.cpp
deleted file mode 100644
index c5863cff60de2194eb7db8ca0b63bf343f1b7d4e..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/src/unittest.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-
-/*
- * \file unittest.cpp
- */
-
-#define LOGOG_UNIT_TESTING 1
-
-#include "logog.hpp"
-
-namespace logog
-{
-
-TestRegistryType &LogogTestRegistry()
-{
-    static TestRegistryType *pRegistry = new TestRegistryType();
-    return *pRegistry;
-}
-
-TestSignup::TestSignup( UnitTest *pTest )
-{
-    m_pTest = pTest;
-    LogogTestRegistry().push_back( pTest );
-}
-
-UnitTest::UnitTest( const TestNameType &sTestName )
-{
-    m_sTestName = sTestName;
-    m_pTestSignup = new TestSignup( this );
-}
-
-UnitTest::~UnitTest()
-{
-	FreeInternals();
-}
-
-void UnitTest::FreeInternals()
-{
-	if ( m_pTestSignup )
-		delete m_pTestSignup;
-
-	m_pTestSignup = NULL;
-}
-
-/** Returns the name of this UnitTest provided at construction time. */
-TestNameType &UnitTest::GetName()
-{
-	return m_sTestName;
-}
-
-/** Executes all currently registered tests and prints a report of success or failure. */
-int RunAllTests()
-{
-    using namespace std;
-
-    int nTests = 0, nTestsSucceeded = 0;
-    int nTestResult;
-    int nFailures = 0;
-
-#ifdef LOGOG_UNICODE
-    wostream *pOut;
-#else // LOGOG_UNICODE
-	ostream *pOut;	
-#endif // LOGOG_UNICODE
-
-	pOut = &(LOGOG_COUT);
-
-    nTests = (int) LogogTestRegistry().size();
-
-    if ( nTests == 0 )
-    {
-		*pOut << _LG("No tests currently defined.") << endl;
-        return 1;
-    }
-
-    for ( TestRegistryType::iterator it = LogogTestRegistry().begin();
-            it != LogogTestRegistry().end();
-            ++it )
-    {
-        (*pOut) << _LG("Test ") << (*it)->GetName() << _LG(" running... ") << endl;
-        nTestResult = (*it)->RunTest();
-
-        (*pOut) << _LG("Test ") << (*it)->GetName();
-
-        if ( nTestResult == 0 )
-        {
-            *pOut << _LG(" successful.") << endl;
-            nTestsSucceeded++;
-        }
-        else
-        {
-            *pOut << _LG(" failed!") << endl;
-            nFailures++;
-        }
-
-        /* Validate that no allocations are currently outstanding.  Make sure to handle the case
-         * where leak detection is disabled */
-        int nMemoryTestResult = ReportMemoryAllocations();
-
-        if ( nMemoryTestResult != -1 )
-        {
-            (*pOut) << _LG("Test ") << (*it)->GetName() << _LG(" has ") << nMemoryTestResult <<
-				_LG(" memory allocations outstanding at end of test.") << endl;
-            nFailures += nMemoryTestResult;
-        }
-    }
-
-    *pOut << _LG("Testing complete, ")
-          << nTests << _LG(" total tests, ")
-          << nTestsSucceeded << _LG(" tests succeeded, ")
-          << ( nTests - nTestsSucceeded ) << _LG(" failed")
-          << endl;
-
-    return nFailures;
-}
-
-/** Should remove all memory allocated during unit testing. */
-void ShutdownTests()
-{
-	TestRegistryType::iterator it;
-
-	for ( it = LogogTestRegistry().begin(); it != LogogTestRegistry().end(); it++ )
-		(*it)->FreeInternals();
-
-    delete &LogogTestRegistry();
-}
-
-}
-
diff --git a/ThirdParty/logog/test/CMakeLists.txt b/ThirdParty/logog/test/CMakeLists.txt
deleted file mode 100644
index f818a2e4fb04e7a99e7909fd43aa88df3890225f..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/test/CMakeLists.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-add_executable( test test.cpp )
-
diff --git a/ThirdParty/logog/test/test.cpp b/ThirdParty/logog/test/test.cpp
deleted file mode 100644
index 3bb34ebeb2271ae16cc8ba365bc6078ac1cf33a8..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/test/test.cpp
+++ /dev/null
@@ -1,837 +0,0 @@
-/** Only define this macro in source files that create unit tests.  This setting brings in the std namespace, so its
- ** use is not recommended outside of unit tests. */
-#define LOGOG_UNIT_TESTING 1
-
-/** Change this to higher constants to exponentially increase test difficulty. */
-const int TEST_STRESS_LEVEL = 1;
-
-#include "logog.hpp"
-
-#include <cstdio>
-
-#include <fcntl.h>
-
-#ifdef LOGOG_FLAVOR_WINDOWS
-#include <io.h>
-#endif
-
-using namespace logog;
-using namespace std;
-
-UNITTEST( SimpleLocking )
-{
-//! [SimpleLocking]
-    LOGOG_INITIALIZE();
-
-    {
-        logog::Mutex m;
-
-        {
-            logog::ScopedLock s1( m );
-            LOGOG_COUT << _LG("Lock is on") << endl;
-        }
-
-        logog::Mutex *pM = new logog::Mutex();
-
-        {
-            logog::ScopedLock s1( *pM );
-            LOGOG_COUT << _LG("Lock is on") << endl;
-        }
-
-        delete pM;
-
-        LOGOG_COUT << _LG("Lock unlocked") << endl;
-
-        logog::Message m1;
-
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-//! [SimpleLocking]
-}
-
-int _s_ThreadLockingTest = 0;
-
-void LockingThread( void *pvMutex )
-{
-    const int NUM_TRIALS = 10 * TEST_STRESS_LEVEL;
-    Mutex *pMutex = (Mutex *)pvMutex;
-
-    if ( pMutex == NULL )
-    {
-        _s_ThreadLockingTest = 1;
-        LOGOG_COUT << _LG("LockingThread received a NULL argument!") << endl;
-        return;
-    }
-
-    for ( int t = 0; t < NUM_TRIALS; t++ )
-    {
-        {
-            ScopedLock sl( *pMutex );
-            INFO( _LG("Thread acquired lock on trial %d"), t);
-        }
-
-        INFO( _LG("Thread released lock %d"), t );
-    }
-}
-
-
-UNITTEST( Subscription )
-{
-    int nResult = 0;
-
-//! [Subscription]
-    LOGOG_INITIALIZE();
-
-    {
-        Topic n1, n2;
-
-        // should succeed
-        if ( n1.SubscribeTo( n2 ) != true )
-            nResult++;
-
-        // should indicate no insertion took place
-        if ( n2.PublishTo( n1 ) != false )
-            nResult++;
-
-        n2.Transmit();
-
-        if ( n2.UnpublishTo( n1 ) != true )
-            nResult++;
-
-        if ( n1.UnsubscribeTo( n2 ) != false )
-            nResult++;
-    }
-
-    LOGOG_SHUTDOWN();
-
-//! [Subscription]
-
-    return nResult;
-}
-
-UNITTEST( GlobalNodelist )
-{
-    LOGOG_INITIALIZE();
-
-    const int MAX_NODES = 10 * TEST_STRESS_LEVEL;
-
-    LOGOG_VECTOR< Topic *> vTopics;
-
-    for (int t = 0; t < MAX_NODES; t++ )
-        vTopics.push_back( new Topic );
-
-    for ( int i = 0; i < MAX_NODES; i++ )
-        for ( int j = i + 1; j < MAX_NODES; j++ )
-            vTopics.at( i )->SubscribeTo( *vTopics.at( j ) );
-
-    LockableNodesType *pNodes = ( LockableNodesType * )Static().s_pAllNodes;
-
-    // For this test we assume that the default Filter has always been created.
-    if ( pNodes->size() != ( MAX_NODES + 1))
-    {
-        LOGOG_COUT << _LG("Incorrect number of nodes!") << endl;
-        return 1;
-    }
-
-    // Try having that master node send a message to all other nodes!
-    vTopics.at( MAX_NODES - 1)->Transmit();
-
-    // Let's try leaving all the nodes allocated and let logog clean them all up.
-    LOGOG_SHUTDOWN();
-
-    if ( Static().s_pAllNodes != NULL )
-    {
-        LOGOG_COUT << _LG("Could not delete all nodes!") << endl;
-        return 1;
-    }
-
-    return 0;
-}
-
-
-UNITTEST( TimerTest )
-{
-    const int NUM_TRIALS = 10 * TEST_STRESS_LEVEL;
-    const int WAIT_TIME = 1000000 * TEST_STRESS_LEVEL;
-
-    Timer time;
-    LOGOG_TIME fCurrent = time.Get();
-
-    for ( int t = 0; t < NUM_TRIALS; t++  )
-    {
-        /* do busy work */
-        int k = 0;
-        for ( int i = 0; i < WAIT_TIME; i++ )
-            k = k + 1;  // fixes a lint warning
-
-        if ( time.Get() < fCurrent )
-        {
-            LOGOG_COUT << _LG("Timer error!  Non monotonic timer behavior") << endl;
-            return 1;
-        }
-        fCurrent = time.Get();
-        LOGOG_COUT << _LG("Current reported time: ") << fCurrent << endl;
-    }
-
-    return 0;
-}
-
-UNITTEST( TopicTest1 )
-{
-    LOGOG_INITIALIZE();
-
-    {
-        Topic t1( LOGOG_LEVEL_WARN,
-                  _LG( "file1.cpp" ), 50 );
-        Topic t2( LOGOG_LEVEL_WARN );
-        Topic t3( LOGOG_LEVEL_ERROR,
-                  _LG( "file2.cpp" ), 100 );
-        Topic t4( LOGOG_LEVEL_WARN, NULL, 0,
-                  _LG( "Group" ),
-                  _LG( "Category" ),
-                  _LG( "Message" ),
-                  30.0f);
-        Topic t5( LOGOG_LEVEL_CRITICAL, NULL, 0,
-                  _LG( "GroupGROUP" ),
-                  _LG( "Important Category" ),
-                  _LG( "Your Message Here"),
-                  150.0f);
-
-        if (t1.CanSubscribeTo( t2 ) == true)
-        {
-            LOGOG_COUT << _LG("Subscription test failed; t1 can subscribe to t2") << endl;
-            return 1;
-        }
-
-        if (t2.CanSubscribeTo( t1 ) == false )
-        {
-            LOGOG_COUT << _LG("Subscription test failed; t2 can't subscribe to t1") << endl;
-            return 1;
-        }
-
-        if ( t1.CanSubscribeTo( t3 ) == true )
-        {
-            LOGOG_COUT << _LG("Subscription test failed; t1 can subscribe to t3") << endl;
-            return 1;
-        }
-
-        if (t2.CanSubscribeTo( t3 ) == false )
-        {
-            LOGOG_COUT << _LG("Subscription test failed; t2 can't subscribe to t3") << endl;
-            return 1;
-        }
-
-        if (t4.CanSubscribeTo( t5 ) == false )
-        {
-            LOGOG_COUT << _LG("Subscription test failed; t4 can't subscribe to t5") << endl;
-            return 1;
-        }
-
-        if ( t5.CanSubscribeTo( t4 ) == true )
-        {
-            LOGOG_COUT << _LG("Subscription test failed; t5 can subscribe to t4") << endl;
-            return 1;
-        }
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-
-UNITTEST( Checkpoint1 )
-{
-    LOGOG_INITIALIZE();
-
-    {
-        Checkpoint check( LOGOG_LEVEL_ALL, _LG( __FILE__ ), __LINE__,
-                          _LG("Group"), _LG("Category"), _LG("Message"), 1.0f );
-
-        Topic t;
-
-        Cerr cerrobj;
-        Cerr cerrgnu;
-        OutputDebug outdebug;
-
-        FormatterGCC f;
-        cerrgnu.SetFormatter( f );
-
-        check.PublishTo( t );
-        t.PublishToMultiple( AllTargets() );
-
-        LOGOG_COUT << _LG("Setup complete; ready to transmit ") << endl;
-        check.Transmit();
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-
-UNITTEST( FormatString1 )
-{
-    LOGOG_INITIALIZE();
-    {
-        String s;
-
-        s.format( _LG("This is a test message.\n"));
-        LOGOG_COUT << s.c_str();
-
-        s.format( _LG("This is a test message: %d %x %f\n"), 1234, 0xf00d, 1.234f );
-        LOGOG_COUT << s.c_str();
-
-        const LOGOG_CHAR *p = _LG("Here is a string");
-
-#ifdef LOGOG_UNICODE
-        s.format( _LG("Here are six strings: %ls %ls %ls %ls %ls %ls \n"), p,p,p,p,p,p );
-#else // LOGOG_UNICODE
-        s.format( _LG("Here are six strings: %s %s %s %s %s %s \n"), p,p,p,p,p,p );
-#endif
-
-        LOGOG_COUT << s.c_str();
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-
-UNITTEST( FormatTopic1 )
-{
-    LOGOG_INITIALIZE();
-    {
-        Cout out;
-        LogFile f( "log.txt");
-        Message m;
-
-        m.PublishToMultiple( AllTargets() );
-
-        m.Format( _LG("This is a test message: %d %x %f"), 1234, 0xf00d, 1.234f );
-        m.Transmit();
-
-        const char *p = "Here is a string";
-
-        m.Format( _LG("Here are six strings: %s %s %s %s %s %s"), p,p,p,p,p,p );
-        m.Transmit();
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-
-UNITTEST( ThreadLocking )
-{
-    LOGOG_INITIALIZE();
-    {
-        Cout out; // only one of these please
-
-        const int NUM_THREADS = 10 * TEST_STRESS_LEVEL;
-
-        LOGOG_VECTOR< Thread *> vpThreads;
-        Mutex mSharedMutex;
-
-        for ( int t = 0; t < NUM_THREADS; t++ )
-            vpThreads.push_back( new Thread( (Thread::ThreadStartLocationType) LockingThread,&mSharedMutex ));
-
-        for ( int t = 0; t < NUM_THREADS; t++ )
-            vpThreads[ t ]->Start();
-
-        for ( int t = 0; t < NUM_THREADS; t++ )
-            Thread::WaitFor( *vpThreads[ t ]);
-
-		for ( int t = 0; t < NUM_THREADS; t++ )
-			delete vpThreads[t];
-
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return _s_ThreadLockingTest;
-}
-
-//! [FormatterCustom1]
-class FormatterCustom : public FormatterMSVC
-{
-    virtual TOPIC_FLAGS GetTopicFlags( const Topic &topic )
-    {
-        return ( Formatter::GetTopicFlags( topic ) &
-                 ~( TOPIC_FILE_NAME_FLAG | TOPIC_LINE_NUMBER_FLAG ));
-    }
-};
-
-UNITTEST( CustomFormatter )
-{
-    LOGOG_INITIALIZE();
-    {
-        Cout out;
-        FormatterCustom customFormat;
-
-        out.SetFormatter( customFormat );
-
-        INFO( _LG( "No file and line number info is provided with this output.") );
-
-        /* The following output is produced:
-         * info: No file and line number info is provided with this output.
-         */
-    }
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-//! [FormatterCustom1]
-
-UNITTEST( HelloLogog )
-{
-    //! [HelloLogog]
-
-    /* The LOGOG_INITIALIZE() function must be called before we call
-     * any other logog functions.
-     */
-    LOGOG_INITIALIZE();
-
-    {
-        /* In order to see any output, we have to instance a Target object,
-         * such as a Cerr or a Cout.  Additionally, we have to destroy
-         * this object before calling LOGOG_SHUTDOWN().  This
-         * is why we have this object within these enclosing brackets.
-         */
-        Cout out;
-
-        /* Send some debugging information to any targets that have
-         * been instanced.
-         */
-        /* If you're just getting started, and you haven't defined
-         * LOGOG_UNICODE, then ASCII logging is easy and works
-         * out of the box.
-         */
-#ifndef LOGOG_UNICODE
-        INFO("Hello, logog!");
-        WARN("This is a warning");
-#endif // !LOGOG_UNICODE
-
-        /* The _LG() macro around static text permits the given text to
-         * display correctly in both Unicode and ASCII builds of the
-         * logog library.
-         */
-        ERR( _LG( "This is an error") );
-        DBUG( _LG( "This is debugging info") );
-
-        /* The Cout object is destroyed here because it falls out of
-         * scope. */
-    }
-
-    /* Call LOGOG_SHUTDOWN() at the termination of your program to free
-     * all memory allocated by logog.  Make sure no logog objects exist
-     * when you call LOGOG_SHUTDOWN().
-     */
-    LOGOG_SHUTDOWN();
-
-    /* Depending on your compiler, the output of the preceding code is
-     * something like:
-     *
-     * test.cpp(373) : info: Hello, logog!
-     * test.cpp(374) : warning: This is a warning
-     * test.cpp(375) : error: This is an error
-     * test.cpp(376) : debug: This is debugging info
-     */
-    //! [HelloLogog]
-    return 0;
-}
-
-
-
-UNITTEST( GroupCategory1 )
-{
-//! [GroupCategory1]
-    /*
-    The following example produces something like:
-    .\test.cpp(364) : emergency: {Graphics} [Unrecoverable] The graphics card has been destroyed
-    .\test.cpp(368) : warning: {Graphics} [Recoverable] The graphics card has been replaced
-    .\test.cpp(372) : warning: {Audio} [Recoverable] The headphones are unplugged
-    .\test.cpp(377) : info: Everything's back to normal
-    */
-
-    LOGOG_INITIALIZE();
-
-    {
-        Cerr err;
-
-#undef LOGOG_GROUP
-#undef LOGOG_CATEGORY
-#define LOGOG_GROUP  "Graphics"
-#define LOGOG_CATEGORY "Unrecoverable"
-
-        EMERGENCY(_LG("The graphics card has been destroyed"));
-
-#undef LOGOG_CATEGORY
-#define LOGOG_CATEGORY	"Recoverable"
-
-        WARN(_LG("The graphics card has been replaced"));
-
-#undef LOGOG_GROUP
-#define LOGOG_GROUP "Audio"
-
-        WARN(_LG("The headphones are unplugged"));
-
-#undef LOGOG_CATEGORY
-#undef LOGOG_GROUP
-#define LOGOG_CATEGORY NULL
-#define LOGOG_GROUP NULL
-
-        INFO(_LG("Everything's back to... %s!"), _LG("normal"));
-    }
-
-    LOGOG_SHUTDOWN();
-    //! [GroupCategory1]
-    return 0;
-}
-
-UNITTEST( GroupCategory2 )
-{
-//! [GroupCategory2]
-    LOGOG_INITIALIZE();
-
-    {
-        GetDefaultFilter().Category(_LG("Unrecoverable"));
-        Cerr err;
-
-        WARN(_LG("Logging messages in the Unrecoverable category..."));
-
-
-#undef LOGOG_GROUP
-#undef LOGOG_CATEGORY
-#define LOGOG_GROUP  "Graphics"
-#define LOGOG_CATEGORY "Unrecoverable"
-
-        EMERGENCY(_LG("The graphics card has been destroyed"));
-
-#undef LOGOG_CATEGORY
-#define LOGOG_CATEGORY	"Recoverable"
-
-        WARN(_LG("The graphics card has been replaced"));
-
-#undef LOGOG_GROUP
-#define LOGOG_GROUP "Audio"
-
-        WARN(_LG("The headphones are unplugged"));
-
-#undef LOGOG_CATEGORY
-#undef LOGOG_GROUP
-#define LOGOG_CATEGORY NULL
-#define LOGOG_GROUP NULL
-
-    }
-
-    LOGOG_SHUTDOWN();
-//! [GroupCategory2]
-    return 0;
-}
-
-UNITTEST( GroupCategory3 )
-{
-    LOGOG_INITIALIZE();
-
-    {
-		/* Assigning a group twice does not leak memory. */
-		GetDefaultFilter().Group( _LG( "Controller" ));
-        GetDefaultFilter().Group( _LG( "Graphics" ));
-
-        Cerr err;
-        WARN(_LG("This message won't happen because it's not in the Graphics group"));
-
-#undef LOGOG_GROUP
-#undef LOGOG_CATEGORY
-#define LOGOG_GROUP  "Graphics"
-#define LOGOG_CATEGORY "Unrecoverable"
-
-        EMERGENCY(_LG("The graphics card has been destroyed"));
-
-#undef LOGOG_CATEGORY
-#define LOGOG_CATEGORY	"Recoverable"
-
-        WARN(_LG("The graphics card has been replaced"));
-
-#undef LOGOG_GROUP
-#define LOGOG_GROUP "Audio"
-
-        WARN(_LG("The headphones are unplugged"));
-
-#undef LOGOG_CATEGORY
-#undef LOGOG_GROUP
-#define LOGOG_CATEGORY NULL
-#define LOGOG_GROUP NULL
-    }
-
-    LOGOG_SHUTDOWN();
-    return 0;
-}
-
-UNITTEST( GroupCategory4 )
-{
-//! [GroupCategory4]
-    LOGOG_INITIALIZE();
-
-    {
-        GetDefaultFilter().Group(_LG("Graphics"));
-        Filter filter;
-        filter.Group(_LG("Audio"));
-        Cerr err;
-
-        WARN(_LG("This message won't happen because it's not in the Graphics group"));
-
-#undef LOGOG_GROUP
-#undef LOGOG_CATEGORY
-#define LOGOG_GROUP  "Graphics"
-#define LOGOG_CATEGORY "Unrecoverable"
-
-        EMERGENCY(_LG("The graphics card has been destroyed"));
-
-#undef LOGOG_CATEGORY
-#define LOGOG_CATEGORY	"Recoverable"
-
-        WARN(_LG("The graphics card has been replaced"));
-
-#undef LOGOG_GROUP
-#define LOGOG_GROUP "Audio"
-
-        WARN(_LG("The headphones are unplugged"));
-
-#undef LOGOG_GROUP
-#define LOGOG_GROUP "Inputs"
-
-        WARN(_LG("The inputs have been yanked off but this fact won't be reported!"));
-
-#undef LOGOG_CATEGORY
-#undef LOGOG_GROUP
-#define LOGOG_CATEGORY NULL
-#define LOGOG_GROUP NULL
-    }
-
-    LOGOG_SHUTDOWN();
-//! [GroupCategory4]
-    return 0;
-}
-
-
-UNITTEST( Info1 )
-{
-    LOGOG_INITIALIZE();
-    {
-        Cout out;
-
-        for ( int i = 0; i < 2; i++ )
-        {
-            for ( int t = 0; t < 10; t++ )
-            {
-                INFO( _LG("t is now: %d"), t );
-                if ( t > 8 )
-                    WARN(_LG("t is pretty high now!"));
-            }
-
-            DBUG(_LG("This warning isn't very interesting"));
-            EMERGENCY(_LG("THIS IS SUPER IMPORTANT!"));
-        }
-
-        LOGOG_SET_LEVEL( LOGOG_LEVEL_DEBUG );
-        LOGOG_DEBUG(_LG("Messages instantiated for the first time will be called now.  However, debug messages"));
-        LOGOG_DEBUG(_LG("instantiated before the LOGOG_SET_LEVEL won't be transmitted."));
-
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-
-void GeneratePseudoRandomErrorMessages()
-{
-    int pr = 0xf8d92347;
-    int ps;
-
-    for ( int t = 0; t < TEST_STRESS_LEVEL * 10; t++ )
-    {
-        pr = pr * 0xd9381381 + 0x13d7b;
-        ps = pr % ( (1 << 19) - 1 );
-
-        ERR( _LG("We must inform you of this pseudo-random error code: %d"), ps );
-
-        // Do a non specific amount of busy work.
-        int swap1 = 0, swap2 = 1;
-        for ( int i = 0; i < ps; i++ )
-        {
-            int swap3 = swap1;
-            swap1 = swap2;
-            swap2 = swap3;
-        }
-    }
-
-}
-
-UNITTEST( ImmediateLogging )
-{
-    LOGOG_INITIALIZE();
-
-    {
-        LogFile logFile( "log.txt" );
-
-        GeneratePseudoRandomErrorMessages();
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-
-#ifdef LOGOG_UNICODE
-UNITTEST( UnicodeLogFile )
-{
-    LOGOG_INITIALIZE();
-
-    {
-        LogFile logFile( "unicode.txt" );
-
-        // see http://blogs.msdn.com/b/michkap/archive/2008/03/18/8306597.aspx
-        INFO(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd");
-        WARN(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd");
-        ERR(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd");
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-#endif // LOGOG_UNICODE
-
-UNITTEST( DeferredCoutLogging )
-{
-    LOGOG_INITIALIZE();
-
-    {
-        Cout out;
-        LogBuffer logBuffer( &out );
-
-        // Make sure that out does not receive messages via the general filter mechanism.
-        out.UnsubscribeToMultiple( AllFilters() );
-
-        for ( int i = 1; i <= 10; i++ )
-        {
-            ERR(_LG("This is error %d of 10"), i);
-
-            int q = 27832;
-
-            for ( int j = 0; j < TEST_STRESS_LEVEL * 10000000; j++ )
-                q *= q;
-        }
-    }
-
-    LOGOG_SHUTDOWN();
-
-    return 0;
-}
-
-UNITTEST( DeferredFileLogging )
-{
-//! [DeferredFileLogging]
-    LOGOG_INITIALIZE();
-
-    {
-        LogFile logFile( "log.txt" );
-        LogBuffer logBuffer( &logFile );
-
-        /* Because the LogBuffer is not writing to a line device a la stdout or stderr, it does not need to
-         * send null terminated strings to its destination (the LogFile).  This is a particular peculiarity
-         * of having a buffering target to a serial-type target, such as a socket or a file.
-         */
-        logBuffer.SetNullTerminatesStrings( false );
-
-        // Make sure that the log file does not receive messages via the general filter mechanism.
-        logFile.UnsubscribeToMultiple( AllFilters() );
-
-        for ( int i = 1; i <= 20; i++ )
-        {
-            WARN(_LG("This is warning %d of 20"), i);
-
-            int q = 27832;
-            for ( int j = 0; j < TEST_STRESS_LEVEL * 10000000; j++ )
-                q *= q;
-        }
-    }
-
-    LOGOG_SHUTDOWN();
-//! [DeferredFileLogging]
-    return 0;
-}
-
-UNITTEST( DateAndTime )
-{
-//! [DateAndTimeLogging]
-    LOGOG_INITIALIZE();
-
-    {
-        Cerr err;
-
-        Formatter *pFormatter = &GetDefaultFormatter();
-
-        pFormatter->SetShowTimeOfDay( true );
-
-        for ( int i = 1; i <= 20; i++ )
-        {
-            WARN(_LG("This is warning %d of 20... but with time!"), i);
-
-            int q = 27832;
-            for ( int j = 0; j < TEST_STRESS_LEVEL * 10000000; j++ )
-                q *= q;
-        }
-    }
-
-    LOGOG_SHUTDOWN();
-//! [DateAndTimeLogging]
-
-    return 0;
-}
-
-
-#ifndef LOGOG_TARGET_PS3
-int DoPlatformSpecificTestInitialization()
-{
-    return 0;
-}
-#endif
-int main( int , char ** )
-{
-#ifdef LOGOG_LEAK_DETECTION_WINDOWS
-	_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );
-#endif // LOGOG_LEAK_DETECTION_WINDOWS
-
-//! [WindowsUnicodeSetup]
-#ifdef LOGOG_UNICODE
-#ifdef LOGOG_FLAVOR_WINDOWS
-    _setmode(_fileno(stdout), _O_U16TEXT);
-    _setmode(_fileno(stderr), _O_U16TEXT);
-#endif // LOGOG_FLAVOR_WINDOWS
-#endif // LOGOG_UNICODE
-//! [WindowsUnicodeSetup]
-
-    int nPlatformSpecific;
-    nPlatformSpecific = DoPlatformSpecificTestInitialization();
-    if ( nPlatformSpecific != 0)
-        return nPlatformSpecific;
-
-    int nResult;
-    nResult = RunAllTests();
-    ShutdownTests();
-
-#ifdef LOGOG_LEAK_DETECTION_WINDOWS
-	_CrtMemState crtMemState;
-	_CrtMemCheckpoint( &crtMemState );
-	_CrtMemDumpStatistics( &crtMemState );
-	_CrtDumpMemoryLeaks();
-#endif // LOGOG_LEAK_DETECTION_WINDOWS
-
-    return nResult;
-}
-
diff --git a/ThirdParty/logog/test/test.sln b/ThirdParty/logog/test/test.sln
deleted file mode 100644
index 5e7b2d0feb6b733d20d3f852e2b3d25e9ccd7b8a..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/test/test.sln
+++ /dev/null
@@ -1,41 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcproj", "{FFD188AD-0FE5-4808-90E0-EC528324FFAD}"
-	ProjectSection(ProjectDependencies) = postProject
-		{85857E80-2122-4DD8-9BA9-B90CC10D65B0} = {85857E80-2122-4DD8-9BA9-B90CC10D65B0}
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logog", "..\src\logog.vcproj", "{85857E80-2122-4DD8-9BA9-B90CC10D65B0}"
-EndProject
-Global
-	GlobalSection(SourceCodeControl) = preSolution
-		SccNumberOfProjects = 2
-		SccProjectUniqueName0 = test.vcproj
-		SccProjectName0 = Perforce\u0020Project
-		SccLocalPath0 = .
-		SccProvider0 = MSSCCI:Perforce\u0020SCM
-		SccProjectUniqueName1 = ..\\src\\logog.vcproj
-		SccProjectName1 = Perforce\u0020Project
-		SccLocalPath1 = ..
-		SccProvider1 = MSSCCI:Perforce\u0020SCM
-		SccProjectFilePathRelativizedFromConnection1 = src\\
-	EndGlobalSection
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{FFD188AD-0FE5-4808-90E0-EC528324FFAD}.Debug|Win32.ActiveCfg = Debug|Win32
-		{FFD188AD-0FE5-4808-90E0-EC528324FFAD}.Debug|Win32.Build.0 = Debug|Win32
-		{FFD188AD-0FE5-4808-90E0-EC528324FFAD}.Release|Win32.ActiveCfg = Release|Win32
-		{FFD188AD-0FE5-4808-90E0-EC528324FFAD}.Release|Win32.Build.0 = Release|Win32
-		{85857E80-2122-4DD8-9BA9-B90CC10D65B0}.Debug|Win32.ActiveCfg = Debug|Win32
-		{85857E80-2122-4DD8-9BA9-B90CC10D65B0}.Debug|Win32.Build.0 = Debug|Win32
-		{85857E80-2122-4DD8-9BA9-B90CC10D65B0}.Release|Win32.ActiveCfg = Release|Win32
-		{85857E80-2122-4DD8-9BA9-B90CC10D65B0}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/ThirdParty/logog/test/test.vcproj b/ThirdParty/logog/test/test.vcproj
deleted file mode 100644
index 8b14c91680cd2955a83cc9e5847e690fa57137ca..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/test/test.vcproj
+++ /dev/null
@@ -1,231 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9.00"
-	Name="test"
-	ProjectGUID="{FFD188AD-0FE5-4808-90E0-EC528324FFAD}"
-	RootNamespace="test"
-	SccProjectName="Perforce Project"
-	SccLocalPath="."
-	SccProvider="MSSCCI:Perforce SCM"
-	Keyword="Win32Proj"
-	TargetFrameworkVersion="196613"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\include"
-				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				WarningLevel="4"
-				Detect64BitPortabilityProblems="false"
-				DebugInformationFormat="4"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				RandomizedBaseAddress="0"
-				DataExecutionPrevention="0"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-				HeapVerification="2"
-				HandleVerification="2"
-				LocksVerification="2"
-				PageHeapConserveMemory="false"
-				PageHeapProtectionLocation="1"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="..\include"
-				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
-				RuntimeLibrary="2"
-				EnableFunctionLevelLinking="true"
-				UsePrecompiledHeader="0"
-				WarningLevel="4"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				LinkIncremental="1"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\test.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-		</Filter>
-		<File
-			RelativePath="..\doc\overview.dox"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					Description="Generating doxygen output"
-					CommandLine="$(InputDir)make-doxygen.bat&#x0D;&#x0A;"
-					Outputs="$(InputDir)html\index.html"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				ExcludedFromBuild="true"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					Description="Generating doxygen output"
-					CommandLine="$(InputDir)make-doxygen.bat&#x0D;&#x0A;"
-					Outputs="$(InputDir)html\index.html"
-				/>
-			</FileConfiguration>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/ThirdParty/logog/test/test.vcproj.lnt b/ThirdParty/logog/test/test.vcproj.lnt
deleted file mode 100644
index 5fd30307fecb5cefe593734b3dc23ed815f10632..0000000000000000000000000000000000000000
--- a/ThirdParty/logog/test/test.vcproj.lnt
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -dConfiguration= ... none provided  */
--D_UNICODE                     //  27: CharacterSet = "1" 
--DUNICODE                      //  27: CharacterSet = "" 
--i"..\include"                 //  47: AdditionalIncludeDirectories = "..\include" 
--DWIN32                        //  48: PreprocessorDefinitions = "WIN32;_DEBUG;_CONSOLE" 
--D_DEBUG                       //  48: PreprocessorDefinitions = "" 
--D_CONSOLE                     //  48: PreprocessorDefinitions = "" 
--D_MT                          //  51: RuntimeLibrary = "3" 
--D_DEBUG                       //  51: RuntimeLibrary = "" 
--D_DLL                         //  51: RuntimeLibrary = "" 
-.\test.cpp                     // 180: RelativePath = ".\test.cpp" 
diff --git a/ThirdParty/spdlog b/ThirdParty/spdlog
new file mode 160000
index 0000000000000000000000000000000000000000..cf6f1dd01e660d5865d68bf5fa78f6376b89470a
--- /dev/null
+++ b/ThirdParty/spdlog
@@ -0,0 +1 @@
+Subproject commit cf6f1dd01e660d5865d68bf5fa78f6376b89470a
diff --git a/config-cpp-dependencies.txt b/config-cpp-dependencies.txt
index 1cb62dd336126d5ebac77e6e2a435cf923cf4ffa..f9a91ef8bc74f9c7adebcf2a912e3846ef644c50 100644
--- a/config-cpp-dependencies.txt
+++ b/config-cpp-dependencies.txt
@@ -42,4 +42,4 @@ fileLocUpperLimit: 2000
 
 # List of folder paths (from the root) that should be completely ignored. May contain multiple
 # space-separated values, including values with spaces escaped with quotation marks.
-blacklist: build Build "Visual Studio Projects" unistd.h console.h stdint.h windows.h library.h endian.h rle.h ThirdParty/logog/include/thread.hpp Applications/Utils SimpleTests ThirdParty
+blacklist: build Build "Visual Studio Projects" unistd.h console.h stdint.h windows.h library.h endian.h rle.h Applications/Utils SimpleTests ThirdParty
diff --git a/scripts/cmake/Find.cmake b/scripts/cmake/Find.cmake
index cb5970458c4aaf1f35ff742c638031467848893f..782d27b9ff933393f26282af1c6147efe2c02a8a 100644
--- a/scripts/cmake/Find.cmake
+++ b/scripts/cmake/Find.cmake
@@ -73,13 +73,15 @@ include(${VTK_USE_FILE})
 find_package(Eigen3 ${ogs.minimum_version.eigen} REQUIRED)
 include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})
 
-## pthread, is a requirement of logog ##
-set(CMAKE_THREAD_PREFER_PTHREAD ON)
-set(THREADS_PREFER_PTHREAD_FLAG ON)
-find_package(Threads REQUIRED)
-if(CMAKE_USE_PTHREADS_INIT)
-    set(HAVE_PTHREADS TRUE)
-    add_definitions(-DHAVE_PTHREADS)
+if(OGS_USE_MFRONT)
+    ## pthread, is a requirement of mfront ##
+    set(CMAKE_THREAD_PREFER_PTHREAD ON)
+    set(THREADS_PREFER_PTHREAD_FLAG ON)
+    find_package(Threads REQUIRED)
+    if(CMAKE_USE_PTHREADS_INIT)
+        set(HAVE_PTHREADS TRUE)
+        add_definitions(-DHAVE_PTHREADS)
+    endif()
 endif()
 
 # Do not search for libs if this option is set
diff --git a/scripts/cmake/SubmoduleSetup.cmake b/scripts/cmake/SubmoduleSetup.cmake
index 2c62fa9a3193a7c5c2c677a33d7e3b0f30a128ff..6100c8c3905688ffe25f01cd6658f187b3677a5f 100644
--- a/scripts/cmake/SubmoduleSetup.cmake
+++ b/scripts/cmake/SubmoduleSetup.cmake
@@ -15,6 +15,7 @@ set(REQUIRED_SUBMODULES
     ThirdParty/googletest
     ThirdParty/iphreeqc/src
     ThirdParty/json-cmake
+    ThirdParty/spdlog
     ThirdParty/tclap
     ThirdParty/tetgen
     ThirdParty/vtkdiff
diff --git a/scripts/cmake/test/CTestCustom.cmake.in b/scripts/cmake/test/CTestCustom.cmake.in
deleted file mode 100644
index 14e2ef03447f4df374791cea542eea913833eb34..0000000000000000000000000000000000000000
--- a/scripts/cmake/test/CTestCustom.cmake.in
+++ /dev/null
@@ -1,2 +0,0 @@
-# set(CTEST_CUSTOM_POST_TEST "cat ${CMAKE_BINARY_DIR}/Testing/Temporary/LastTestTester.log 2>&1")
-set(CTEST_CUSTOM_TESTS_IGNORE ${CTEST_CUSTOM_TESTS_IGNORE}) # logog
diff --git a/scripts/cmake/test/Test.cmake b/scripts/cmake/test/Test.cmake
index ef0c582d606335d0438992eddbb98c60e62654bd..e125f69ab43bae3aba49a3a52e384b7ff9a4bf7e 100644
--- a/scripts/cmake/test/Test.cmake
+++ b/scripts/cmake/test/Test.cmake
@@ -27,13 +27,6 @@ endif()
 
 enable_testing() # Enable CTest
 
-# See http://www.vtk.org/Wiki/CMake/Testing_With_CTest for some customization options
-set(CTEST_CUSTOM_TESTS_IGNORE test-harness) # ignore logog test
-configure_file(
-    ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/test/CTestCustom.cmake.in
-    ${PROJECT_BINARY_DIR}/CTestCustom.cmake
-)
-
 include(${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/test/AddTest.cmake)
 include(${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/test/MeshTest.cmake)
 include(${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/test/OgsTest.cmake)
diff --git a/scripts/jenkins/iwyu-mappings.imp b/scripts/jenkins/iwyu-mappings.imp
index ee7bf2ee8f6215bf923f6e42c767705feebe3a94..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/scripts/jenkins/iwyu-mappings.imp
+++ b/scripts/jenkins/iwyu-mappings.imp
@@ -1,4 +0,0 @@
-[
-    { include: ["<logog/include/macro.hpp>", "private", "<logog/include/logog.hpp>", "public"] },
-    { include: ["<logog/include/message.hpp>", "private", "<logog/include/logog.hpp>", "public"] }
-]
diff --git a/web/content/docs/devguide/advanced/log-and-debug-output.pandoc b/web/content/docs/devguide/advanced/log-and-debug-output.pandoc
index 8bf61dda3dfb449ba37b6e71a9f10c8691d70094..427e2013f01eb1c2d02703d5c51674c7ba62791e 100644
--- a/web/content/docs/devguide/advanced/log-and-debug-output.pandoc
+++ b/web/content/docs/devguide/advanced/log-and-debug-output.pandoc
@@ -11,25 +11,28 @@ weight = 1034
 
 ## Introduction
 
-For application output we use [Logog](http://johnwbyrd.github.com/logog) which is already integrated in OGS. Logog provides several verbosity levels which can be used with simple macro calls:
+For application output we use [spdlog](https://github.com/gabime/spdlog) which
+is already integrated in OGS. Spdlog provides several verbosity levels which can
+be used with simple calls:
 
 ```cpp
-ERR("An error message!")
-WARN("A warning message.")
-INFO("An information message...")
+ERR("An error message!");
+WARN("A warning message.");
+INFO("An information message...");
+DBUG("A debug message.");
 ```
 
-As arguments you can use the same functionality as in [sprintf](http://www.cplusplus.com/reference/cstdio/sprintf/):
+As arguments you can use the same functionality as in [fmt](https://fmt.dev)---a
+modern formatting library:
 
 ```cpp
-int foo = 9001;
-int maxfoo = 9000;
-if (foo > maxfoo)
-    WARN("Foo is over %d!  Current value is %d.", maxfoo, foo );
+int foo = 42;
+double boo = 3.14;
+WARN("Foo is {}! Current value is {:10.2g}.", foo, boo);
 ```
 
-For more information see the [Logog documentation](http://johnwbyrd.github.com/logog/quickstart.html).
-
+For more information see the [spdlog
+wiki](https://github.com/gabime/spdlog/wiki).
 
 On release builds the default log level is `INFO`, for debug builds it is
 `DEBUG`.