diff --git a/Applications/CLI/CMakeLists.txt b/Applications/CLI/CMakeLists.txt
index 998ac84220bb3144c299669aaaf317c5674b1763..f15fcb737427d8013770e431caf2a3db3901a992 100644
--- a/Applications/CLI/CMakeLists.txt
+++ b/Applications/CLI/CMakeLists.txt
@@ -7,7 +7,7 @@ target_link_libraries(ogs
 
 if(OGS_USE_PYTHON)
     # Troubleshooting:
-    # If you get linker errors, such as   ogs.cpp:(.text+0xb4): Warnung: undefinierter Verweis auf »_Py_ZeroStruct«
+    # If you get linker errors, such as   ogs.cpp:(.text+0xb4): undefined reference to `_Py_ZeroStruct'
     # it could be that OGS is compiled with the wrong Python version.
     # I (Ch. Leh.) observed the following: The symbol _Py_ZeroStruct could not be found in /usr/lib/libpython3.6m.so (I intended to compile OGS with Python3).
     # It's apparently a Python2 symbol (present in /usr/lib/libpython2.7.so)
@@ -22,7 +22,11 @@ if(OGS_USE_PYTHON)
     # I assume (this is only a guess!) that VTK pulls in Python2 dependencies (on my system).
     # I assume that this is related to https://github.com/ufz/ogs/pull/2158.
     # Workaround: Always make sure that OGS is compiled with the same Python version as VTK.
-    # TODO: Find out how to properly address the issue.
+    # The error described above should be detected automatically by cmake and an
+    # appropriate message should be presented. The note is kept for the case
+    # that the automatic detection does not work due to whatever reason.
+
+    add_library(ogs_embedded_python STATIC ogs_embedded_python.cpp)
 
     # Performance warning from
     # https://github.com/pybind/pybind11/blob/master/docs/compiling.rst:
@@ -32,16 +36,17 @@ if(OGS_USE_PYTHON)
     # minimal set of parameters to ensure that the code using pybind11 compiles, but
     # it does not pass these extra compiler flags (i.e. this is up to you).
     # TODO: Enable further compiler/linker flags.
-    target_link_libraries(ogs PRIVATE pybind11::embed)
-
-    add_library(ogs_python_bindings STATIC ogs_python_bindings.cpp)
-    target_link_libraries(ogs_python_bindings PRIVATE pybind11::embed)
-    target_include_directories(ogs_python_bindings PRIVATE ${PYTHON_INCLUDE_DIRS})
+    target_link_libraries(ogs_embedded_python PUBLIC pybind11::embed)
+    target_compile_definitions(ogs_embedded_python PUBLIC OGS_USE_PYTHON)
+    target_link_libraries(ogs_embedded_python PRIVATE
+        ProcessLibBoundaryConditionPythonModule)
 
-    target_link_libraries(ogs PRIVATE ogs_python_bindings)
+    target_link_libraries(ogs PRIVATE ogs_embedded_python)
 
     if(BUILD_SHARED_LIBS)
-        target_compile_definitions(ogs_python_bindings OGS_BUILD_SHARED_LIBS)
+        # Add macro definition, because static libs make special handling necessary
+        # s.t. the embedded OpenGeoSys Python module won't be removed by the linker.
+        target_compile_definitions(ogs_embedded_python OGS_BUILD_SHARED_LIBS)
     endif()
 endif()
 
diff --git a/Applications/CLI/ogs.cpp b/Applications/CLI/ogs.cpp
index f9ceb6a55bac2e23c5598f815f2be3788559b749..87694bcc50aa67da5077c77b5e3b087df8213583 100644
--- a/Applications/CLI/ogs.cpp
+++ b/Applications/CLI/ogs.cpp
@@ -42,7 +42,9 @@
 
 #include "NumLib/NumericsConfig.h"
 
-#include "ogs_python_bindings.h"
+#ifdef OGS_USE_PYTHON
+#include "ogs_embedded_python.h"
+#endif
 
 int main(int argc, char* argv[])
 {
diff --git a/Applications/CLI/ogs_python_bindings.cpp b/Applications/CLI/ogs_embedded_python.cpp
similarity index 60%
rename from Applications/CLI/ogs_python_bindings.cpp
rename to Applications/CLI/ogs_embedded_python.cpp
index 12c0225bf053f874acdb93390faa48bf6da2482e..2da7a23d1a518b6df3296b914b195bdc6169b530 100644
--- a/Applications/CLI/ogs_python_bindings.cpp
+++ b/Applications/CLI/ogs_embedded_python.cpp
@@ -1,11 +1,27 @@
-#ifdef OGS_USE_PYTHON
+/**
+ * \copyright
+ * Copyright (c) 2012-2018, 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 <pybind11/embed.h>
+#include <logog/include/logog.hpp>
 
-#include "ogs_python_bindings.h"
+#include "ogs_embedded_python.h"
+
+#include "ProcessLib/BoundaryCondition/Python/PythonBoundaryConditionModule.h"
+
+PYBIND11_EMBEDDED_MODULE(OpenGeoSys, m)
+{
+    DBUG("Binding Python module OpenGeoSys.");
+
+    ProcessLib::pythonBindBoundaryCondition(m);
+}
 
 #ifndef OGS_BUILD_SHARED_LIBS
-extern "C" PyObject* pybind11_init_impl_OpenGeoSys();
 
 // Hackish trick that hopefully ensures that the linker won't strip the symbol
 // pointed to by p from the library being built.
@@ -34,5 +50,3 @@ pybind11::scoped_interpreter setupEmbeddedPython()
 }
 
 }  // namespace ApplicationsLib
-
-#endif  // OGS_USE_PYTHON
diff --git a/Applications/CLI/ogs_python_bindings.h b/Applications/CLI/ogs_embedded_python.h
similarity index 51%
rename from Applications/CLI/ogs_python_bindings.h
rename to Applications/CLI/ogs_embedded_python.h
index c4b1e2a9442bc55800a9a5b5d8410f1ab2428279..758718298ba1cb3e00d47338f58901d01ea82074 100644
--- a/Applications/CLI/ogs_python_bindings.h
+++ b/Applications/CLI/ogs_embedded_python.h
@@ -1,6 +1,13 @@
-#pragma once
+/**
+ * \copyright
+ * Copyright (c) 2012-2018, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
 
-#ifdef OGS_USE_PYTHON
+#pragma once
 
 #include <pybind11/embed.h>
 
@@ -11,5 +18,3 @@ namespace ApplicationsLib
 pybind11::scoped_interpreter setupEmbeddedPython();
 
 }  // namespace ApplicationsLib
-
-#endif  // OGS_USE_PYTHON