diff --git a/3rdParty/MuParser/CMakeLists.txt b/3rdParty/MuParser/CMakeLists.txt
index a77276825e3280ae298eced80ea0b498e27d4bf2..1634a2f15a71aeec53bd0ffb5f14c22aec7893aa 100644
--- a/3rdParty/MuParser/CMakeLists.txt
+++ b/3rdParty/MuParser/CMakeLists.txt
@@ -44,7 +44,9 @@ add_library(muparser
         src/muParserTokenReader.cpp
         )
 
-linkOpenMP(muparser)
+if(BUILD_USE_OPENMP)
+   target_link_libraries(muparser PUBLIC OpenMP::OpenMP_CXX)
+endif()
 target_include_directories(muparser PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
 
 # this compiles the "DLL" interface (C API)
@@ -60,7 +62,7 @@ if (CMAKE_BUILD_TYPE STREQUAL Debug)
     target_compile_definitions(muparser PRIVATE _DEBUG)
 endif ()
 
-if(USE_OPENMP)
+if(BUILD_USE_OPENMP)
     target_compile_definitions(muparser PRIVATE MUP_USE_OPENMP)
 endif()
 set_target_properties(muparser PROPERTIES
diff --git a/CMake/3rd.cmake b/CMake/3rd.cmake
index 5ec921758c1b335c1cc9d78a4441d44c9bfe6de3..781146111d48739671b35c98bb96ebff358809b4 100644
--- a/CMake/3rd.cmake
+++ b/CMake/3rd.cmake
@@ -1,4 +1,2 @@
 include(${VF_CMAKE_DIR}/3rd/boost.cmake)
 include(${VF_CMAKE_DIR}/3rd/gmock.cmake)
-include(${VF_CMAKE_DIR}/3rd/mpi.cmake)
-include(${VF_CMAKE_DIR}/3rd/OpenMP.cmake)
\ No newline at end of file
diff --git a/CMake/3rd/OpenMP.cmake b/CMake/3rd/OpenMP.cmake
deleted file mode 100644
index 45465ba4bf43dd5cf7687b83ac1d368332614582..0000000000000000000000000000000000000000
--- a/CMake/3rd/OpenMP.cmake
+++ /dev/null
@@ -1,13 +0,0 @@
-function (linkOpenMP targetName)
-
-	if(NOT USE_OPENMP)
-		return()
-	endif()
-
-	find_package(OpenMP REQUIRED)
-
-	if(OpenMP_CXX_FOUND)
-		target_link_libraries(${targetName} PUBLIC OpenMP::OpenMP_CXX)
-	endif()
-
-endfunction()
\ No newline at end of file
diff --git a/CMake/3rd/mpi.cmake b/CMake/3rd/mpi.cmake
deleted file mode 100644
index cb5e279d568e9ae794498daaa5eac318d5510227..0000000000000000000000000000000000000000
--- a/CMake/3rd/mpi.cmake
+++ /dev/null
@@ -1,8 +0,0 @@
-function (linkMPI)
-
-    find_package(MPI REQUIRED)
-
-    vf_get_library_name(library_name)
-    target_link_libraries(${library_name} PUBLIC MPI::MPI_CXX)
-
-endfunction()
\ No newline at end of file
diff --git a/CMake/VirtualFluidsMacros.cmake b/CMake/VirtualFluidsMacros.cmake
index e2d7ba9674174f5e1f1fe0c0e45cc98437bedf95..debb5ee7826d7dc3d6499b3813070dcab4b94bd4 100644
--- a/CMake/VirtualFluidsMacros.cmake
+++ b/CMake/VirtualFluidsMacros.cmake
@@ -229,7 +229,7 @@ function(vf_add_library)
         target_include_directories(${library_name} PRIVATE "${VF_THIRD_DIR}/cuda_samples/")
         target_include_directories(${library_name} PRIVATE ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
     endif()
-    
+
     status("... configuring target: ${library_name} (type=${ARG_BUILDTYPE}) done")
 
     unset(CMAKE_CXX_CLANG_TIDY)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8d743768918b108fcb5d68b6df89f01867c41c0c..efce16caaf8d40ae3f5a9ca9bcedd5c5a6767bf5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -37,6 +37,7 @@ option(BUILD_VF_GPU "Build VirtualFluids gpu variant" OFF)
 
 option(BUILD_USE_OPENMP "Build VirtualFluids with openmp" ON)
 
+
 # vf gpu
 option(BUILD_VF_GPU          "Build VirtualFluids GPU"     ON )
 option(BUILD_VF_GKS          "Build VirtualFluids GKS"     OFF )
@@ -60,12 +61,11 @@ else()
     set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
 endif()
 
-option(USE_OPENMP "Include OpenMP support" ON)
-
 option(BUILD_VF_PYTHON_BINDINGS "" OFF)
 
 option(BUILD_VF_DOUBLE_ACCURACY "Use double accuracy" OFF)
 
+
 #################################################################################
 #  MACROS
 #################################################################################
@@ -79,6 +79,13 @@ ENDIF()
 #################################################################################
 #  COMMON LIBRARIES
 #################################################################################
+if(BUILD_USE_OPENMP)
+    find_package(OpenMP REQUIRED)
+endif()
+
+find_package(MPI REQUIRED)
+
+
 add_subdirectory(src/basics)
 
 #################################################################################
diff --git a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
index ef0a07772f945922e3b497330c329bc00c53b57d..031a3ec1543fe9241ed82a6bf9d8ec2c3bf99f5b 100644
--- a/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
+++ b/apps/gpu/LBM/DrivenCavity/CMakeLists.txt
@@ -2,8 +2,6 @@ PROJECT(DrivenCavity LANGUAGES CUDA CXX)
 
 #LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-DOMPI_SKIP_MPICXX" )
 
-vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator FILES DrivenCavity.cpp )
+vf_add_library(BUILDTYPE binary PRIVATE_LINK basics VirtualFluids_GPU GridGenerator MPI::MPI_CXX FILES DrivenCavity.cpp)
 
 set_source_files_properties(DrivenCavity.cpp PROPERTIES LANGUAGE CUDA)
-
-linkMPI()
diff --git a/src/basics/CMakeLists.txt b/src/basics/CMakeLists.txt
index 2eff85ba5c48ec475cd8690060520cc09b4a0cb6..1703d6269c1cebe36005226373da85b14c5515f6 100644
--- a/src/basics/CMakeLists.txt
+++ b/src/basics/CMakeLists.txt
@@ -1,7 +1,7 @@
 
 include(Core/buildInfo.cmake)
 
-vf_add_library(EXCLUDE buildInfo.in.cpp)
+vf_add_library(PUBLIC_LINK MPI::MPI_CXX EXCLUDE buildInfo.in.cpp)
 
 vf_get_library_name (library_name)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Core)
@@ -21,7 +21,4 @@ IF(MSVC)
     target_compile_definitions(${library_name} PUBLIC NOMINMAX) # Disable Min/Max-Macros
 ENDIF(MSVC)
 
-
-linkMPI()
-
-vf_add_tests()
\ No newline at end of file
+vf_add_tests()
diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt
index e5e6ccfeb09e111c07ca35745707e94b2c2b74ce..8e0d20c0dcefdc1bc5c85b0b6578b293eaebbf06 100644
--- a/src/cpu/VirtualFluidsCore/CMakeLists.txt
+++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt
@@ -23,15 +23,14 @@ IF(${USE_DEM_COUPLING})
    INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/../DemCoupling/DemCoupling.cmake)
 ENDIF()
 
-vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser ${CAB_ADDITIONAL_LINK_LIBRARIES})
-
-vf_get_library_name(library_name)
-
 if(BUILD_USE_OPENMP)
-   linkOpenMP(${library_name})
+   list(APPEND CAB_ADDITIONAL_LINK_LIBRARIES OpenMP::OpenMP_CXX)
 endif()
 
-linkMPI()
+vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser MPI::MPI_CXX ${CAB_ADDITIONAL_LINK_LIBRARIES})
+
+vf_get_library_name(library_name)
+
 
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/BoundaryConditions)
 target_include_directories(${library_name} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Connectors)
diff --git a/src/gpu/GksGpu/CMakeLists.txt b/src/gpu/GksGpu/CMakeLists.txt
index facd4b663568210500ff783c4f603df10f81dcf9..b6e91a2cb6dbfabd61adf4fc20dd8dab5aa82e0c 100644
--- a/src/gpu/GksGpu/CMakeLists.txt
+++ b/src/gpu/GksGpu/CMakeLists.txt
@@ -1,8 +1,3 @@
 project(GksGpu LANGUAGES CUDA CXX)
 
-vf_add_library(BUILDTYPE shared PRIVATE_LINK basics GksMeshAdapter)
-
-linkMPI()
-
-vf_get_library_name(library_name)
-linkOpenMP(${library_name})
+vf_add_library(BUILDTYPE shared PRIVATE_LINK basics GksMeshAdapter OpenMP::OpenMP_CXX MPI::MPI_CXX)
diff --git a/src/gpu/GridGenerator/CMakeLists.txt b/src/gpu/GridGenerator/CMakeLists.txt
index 57431eab6d66d5d81c6c4fbf04a5f44266856419..1ce294bf420f657f35397c427929f9f310d04556 100644
--- a/src/gpu/GridGenerator/CMakeLists.txt
+++ b/src/gpu/GridGenerator/CMakeLists.txt
@@ -1,12 +1,9 @@
 project(GridGenerator LANGUAGES CUDA CXX)
 
 
-vf_add_library(PRIVATE_LINK basics)
-vf_get_library_name(library_name)
-
-linkOpenMP(${library_name})
-
+vf_add_library(PRIVATE_LINK basics OpenMP::OpenMP_CXX)
 
+vf_get_library_name(library_name)
 set_target_properties(${library_name} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
 
 # according to linker error when building static libraries.
diff --git a/src/gpu/VirtualFluids_GPU/CMakeLists.txt b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
index 2df796f2fcbf7b0423e5e8c651bcf6e00e35ba81..95405b25864f506e5580fa6711a4389d39d8d7a7 100644
--- a/src/gpu/VirtualFluids_GPU/CMakeLists.txt
+++ b/src/gpu/VirtualFluids_GPU/CMakeLists.txt
@@ -1,16 +1,12 @@
 project(VirtualFluids_GPU LANGUAGES CUDA CXX)
 
-IF(MSVC)
-    set(libsToLink ws2_32 GridGenerator basics Traffic) # ws_32 throws an error on Phoenix
-ELSE(MSVC)
-    #set(libsToLink GridGenerator VirtualFluidsBasics Core Traffic)
-    set(libsToLink GridGenerator basics)
-ENDIF(MSVC)
+set(additional_libraries "")
+if(MSVC)
+    set(additional_libraries ws2_32 Traffic) # ws_32 throws an error on Phoenix
+endif()
 
+vf_add_library(PRIVATE_LINK ${additional_libraries} GridGenerator basics MPI::MPI_CXX)
 
-vf_add_library(PRIVATE_LINK ${libsToLink})
-
-linkMPI()
 linkBoost(COMPONENTS "serialization")
 
 #SET(TPN_WIN32 "/EHsc")