diff --git a/Applications/ApplicationsLib/CMakeLists.txt b/Applications/ApplicationsLib/CMakeLists.txt
index 5d4b82fa1d14fba948b92ac77a536a876df9895c..d9025f2aa8c899bc07400064d7494638643747bd 100644
--- a/Applications/ApplicationsLib/CMakeLists.txt
+++ b/Applications/ApplicationsLib/CMakeLists.txt
@@ -6,9 +6,8 @@ set(LIB_SOURCES ${SOURCES_APPLICATIONSLIB})
 add_library(ApplicationsLib ${LIB_SOURCES})
 
 target_link_libraries(ApplicationsLib
-    MeshGeoToolsLib
-    NumLib
-    ProcessLib
+    PUBLIC BaseLib GeoLib NumLib ProcessLib logog
+    PRIVATE MathLib MeshLib
 )
 
 if(TARGET Eigen)
diff --git a/Applications/CLI/CMakeLists.txt b/Applications/CLI/CMakeLists.txt
index 442531766f0fd78f41ada3c2df437158d6c3c63c..bb2be2714538f099cdf9d337ff910a2a81094696 100644
--- a/Applications/CLI/CMakeLists.txt
+++ b/Applications/CLI/CMakeLists.txt
@@ -2,20 +2,17 @@
 add_executable(ogs ogs.cpp)
 
 target_link_libraries(ogs
-    ApplicationsLib
-    MeshGeoToolsLib
-    ProcessLib
-    NumLib
+    PRIVATE BaseLib ApplicationsLib NumLib ProcessLib
 )
 
 ADD_VTK_DEPENDENCY(ogs)
 
 if(OGS_USE_PETSC)
-    target_link_libraries(ogs ${PETSC_LIBRARIES})
+    target_link_libraries(ogs PRIVATE ${PETSC_LIBRARIES})
 endif()
 
 if(OGS_INSITU)
-    target_link_libraries(ogs InSituLib)
+    target_link_libraries(ogs PRIVATE InSituLib)
 endif()
 
 if(OGS_USE_PCH)
diff --git a/Applications/DataHolderLib/CMakeLists.txt b/Applications/DataHolderLib/CMakeLists.txt
index cfcd824d0985c32ddb86c72f9656614788cf8305..9740aafa4b5976820093e57e8fad228d7619349e 100644
--- a/Applications/DataHolderLib/CMakeLists.txt
+++ b/Applications/DataHolderLib/CMakeLists.txt
@@ -5,9 +5,8 @@ GET_SOURCE_FILES(SOURCES_DataHolderLib)
 add_library(DataHolderLib ${SOURCES_DataHolderLib})
 
 target_link_libraries(DataHolderLib
-    GeoLib
-    MeshLib
-    logog
+    PUBLIC GeoLib MeshLib
+    PRIVATE BaseLib logog
 )
 
 if(OGS_USE_PCH)
diff --git a/Applications/FileIO/CMakeLists.txt b/Applications/FileIO/CMakeLists.txt
index fffd2690063c7edb699368eb8da277e035e4505f..cb5cc7f9d29de646e731984d826afdcf7aefbfa0 100644
--- a/Applications/FileIO/CMakeLists.txt
+++ b/Applications/FileIO/CMakeLists.txt
@@ -19,10 +19,17 @@ include(${PROJECT_SOURCE_DIR}/scripts/cmake/OGSEnabledElements.cmake)
 
 # Create the library
 add_library(ApplicationsFileIO ${SOURCES})
-target_link_libraries(ApplicationsFileIO DataHolderLib)
+target_link_libraries(ApplicationsFileIO
+    PUBLIC BaseLib DataHolderLib GeoLib MathLib logog
+    PRIVATE ApplicationsLib MeshLib
+)
 
 if(Shapelib_FOUND)
-    target_link_libraries(ApplicationsFileIO ${Shapelib_LIBRARIES})
+    target_link_libraries(ApplicationsFileIO PRIVATE ${Shapelib_LIBRARIES})
+endif()
+
+if(OGS_BUILD_SWMM)
+    target_link_libraries(ApplicationsFileIO PRIVATE SwmmInterface)
 endif()
 
 ADD_VTK_DEPENDENCY(ApplicationsFileIO)
diff --git a/Applications/InSituLib/CMakeLists.txt b/Applications/InSituLib/CMakeLists.txt
index 38b9b025b7fb621111530a5a336c0fe040b3e882..732d546c4e559e08b681b4a480a38d8184faf348 100644
--- a/Applications/InSituLib/CMakeLists.txt
+++ b/Applications/InSituLib/CMakeLists.txt
@@ -3,6 +3,9 @@ GET_SOURCE_FILES(SOURCES)
 
 # Library
 add_library(InSituLib ${SOURCES})
+
+target_link_libraries(PUBLIC BaseLib PRIVATE MeshLib)
+
 if(OGS_USE_PCH)
     cotire(InSituLib)
 endif()
diff --git a/BaseLib/CMakeLists.txt b/BaseLib/CMakeLists.txt
index 69e46a1af3cefff47138dd741117513a05774a90..377ac3b07a39aadfff758da72ba59383ff06957b 100644
--- a/BaseLib/CMakeLists.txt
+++ b/BaseLib/CMakeLists.txt
@@ -14,18 +14,16 @@ add_library(BaseLib ${SOURCES})
 
 set_target_properties(BaseLib PROPERTIES LINKER_LANGUAGE CXX)
 
-target_link_libraries(BaseLib
-    logog
-)
+target_link_libraries(BaseLib PUBLIC logog)
 
 if(MSVC)
-    target_link_libraries(BaseLib WinMM) # needed for timeGetTime
+    target_link_libraries(BaseLib PRIVATE WinMM) # needed for timeGetTime
 endif()
 
 if(Qt5XmlPatterns_FOUND)
-    target_link_libraries(BaseLib Qt5::Xml Qt5::XmlPatterns)
+    target_link_libraries(BaseLib PUBLIC Qt5::Xml Qt5::XmlPatterns)
     if(WIN32 AND CMAKE_CROSSCOMPILING AND OPENSSL_FOUND)
-        target_link_libraries(BaseLib Qt5::Network ${OPENSSL_LIBRARIES} ws2_32)
+        target_link_libraries(BaseLib PUBLIC Qt5::Network ${OPENSSL_LIBRARIES} ws2_32)
     endif()
 endif()
 
diff --git a/GeoLib/CMakeLists.txt b/GeoLib/CMakeLists.txt
index 747e074dca54d9508d9817748fa7ddda16d31840..f7b51618a7a2056ed0d03bb82baef72418e71c56 100644
--- a/GeoLib/CMakeLists.txt
+++ b/GeoLib/CMakeLists.txt
@@ -16,14 +16,12 @@ add_library(GeoLib ${SOURCES}
     ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdParty/tetgen/predicates.cxx
 )
 
-target_link_libraries(GeoLib
-    MathLib
-)
+target_link_libraries(GeoLib PUBLIC BaseLib MathLib logog)
 
 if(Qt5XmlPatterns_FOUND)
-    target_link_libraries(GeoLib Qt5::Xml Qt5::XmlPatterns)
+    target_link_libraries(GeoLib PUBLIC Qt5::Xml Qt5::XmlPatterns)
     if(WIN32 AND CMAKE_CROSSCOMPILING AND OPENSSL_FOUND)
-        target_link_libraries(GeoLib Qt5::Network ${OPENSSL_LIBRARIES} ws2_32)
+        target_link_libraries(GeoLib PUBLIC Qt5::Network ${OPENSSL_LIBRARIES} ws2_32)
     endif()
 endif()
 
diff --git a/MaterialLib/CMakeLists.txt b/MaterialLib/CMakeLists.txt
index d2488350c069566ef85f19ecf27ef6e169736ecd..52b82c27b8bc2e5c93af4dba18d77005ce046649 100644
--- a/MaterialLib/CMakeLists.txt
+++ b/MaterialLib/CMakeLists.txt
@@ -21,7 +21,8 @@ append_source_files(SOURCES TwoPhaseModels)
 
 add_library(MaterialLib ${SOURCES})
 target_link_libraries(MaterialLib
-    BaseLib
+    PUBLIC BaseLib NumLib ProcessLib logog
+    PRIVATE MathLib MeshLib
 )
 
 if(OGS_USE_PCH)
diff --git a/MathLib/CMakeLists.txt b/MathLib/CMakeLists.txt
index aeccec33ff759731e7b936910fee3538ee988243..41abeba6e00a0d15c4853a12069eabfdc06e0662 100644
--- a/MathLib/CMakeLists.txt
+++ b/MathLib/CMakeLists.txt
@@ -28,28 +28,26 @@ add_library(MathLib ${SOURCES})
 
 set_target_properties(MathLib PROPERTIES LINKER_LANGUAGE CXX)
 
-target_link_libraries(MathLib
-    BaseLib
-)
+target_link_libraries(MathLib PUBLIC BaseLib logog)
 
 if (CVODE_FOUND)
-    target_link_libraries(MathLib ${CVODE_LIBRARIES})
+    target_link_libraries(MathLib PUBLIC ${CVODE_LIBRARIES})
 endif()
 
 if(LAPACK_FOUND)
-    target_link_libraries(MathLib ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
+    target_link_libraries(MathLib PUBLIC ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES})
 endif()
 
 if (OGS_USE_LIS)
-    target_link_libraries(MathLib ${LIS_LIBRARIES})
+    target_link_libraries(MathLib PUBLIC ${LIS_LIBRARIES})
 endif()
 
 if (OGS_USE_MKL)
-    target_link_libraries(MathLib ${MKL_LIBRARIES})
+    target_link_libraries(MathLib PUBLIC ${MKL_LIBRARIES})
 endif()
 
 if (OGS_USE_PETSC)
-    target_link_libraries(MathLib ${PETSC_LIBRARIES})
+    target_link_libraries(MathLib PUBLIC ${PETSC_LIBRARIES})
 endif()
 
 if(TARGET Boost)
diff --git a/MeshGeoToolsLib/CMakeLists.txt b/MeshGeoToolsLib/CMakeLists.txt
index 662f25ece847db597cbb27a1e6527c41ddd50e04..94e3ce86759976ed1be86e97121fedffa9504c29 100644
--- a/MeshGeoToolsLib/CMakeLists.txt
+++ b/MeshGeoToolsLib/CMakeLists.txt
@@ -5,10 +5,8 @@ GET_SOURCE_FILES(SOURCES)
 add_library(MeshGeoToolsLib ${SOURCES})
 
 target_link_libraries(MeshGeoToolsLib
-    BaseLib
-    MathLib
-    MeshLib
-    GeoLib
+    PUBLIC GeoLib MathLib
+    PRIVATE BaseLib MeshLib logog
 )
 
 if(TARGET Boost)
diff --git a/MeshLib/CMakeLists.txt b/MeshLib/CMakeLists.txt
index 7da5c02a33ea0243de06e991a85cd7d43983bb71..13ec4dcd1f2e994c1f99ecfc9c6845f56e180d6c 100644
--- a/MeshLib/CMakeLists.txt
+++ b/MeshLib/CMakeLists.txt
@@ -27,7 +27,7 @@ if(OGS_USE_PCH)
 endif()
 
 target_link_libraries(MeshLib
-    PUBLIC BaseLib GeoLib MathLib
+    PUBLIC BaseLib GeoLib MathLib logog
     INTERFACE vtkIOXML
 )
 
diff --git a/NumLib/CMakeLists.txt b/NumLib/CMakeLists.txt
index ac83fc180736734f2ba25aec4920e6d95e387b4c..bcd102b8e2ca06af7254c5d093f544b593e562ec 100644
--- a/NumLib/CMakeLists.txt
+++ b/NumLib/CMakeLists.txt
@@ -20,12 +20,8 @@ add_library(NumLib ${SOURCES})
 set_target_properties(NumLib PROPERTIES LINKER_LANGUAGE CXX)
 
 target_link_libraries(NumLib
-    BaseLib
-    GeoLib
-    MathLib
-    MeshLib
-    MeshGeoToolsLib
-    logog
+    PUBLIC BaseLib GeoLib MathLib MeshLib logog
+    PRIVATE MeshGeoToolsLib
 )
 
 if(TARGET Eigen)