diff --git a/CMake/Packages.cmake b/CMake/Packages.cmake
index e070fa3c8a803558b29458bf9728855bd339cee8..d96ed89a935cdaf219b938a043c50d7a051fae47 100644
--- a/CMake/Packages.cmake
+++ b/CMake/Packages.cmake
@@ -125,3 +125,7 @@ if(NOT yaml-cpp_POPULATED)
   FetchContent_Populate(yaml-cpp)
   add_subdirectory(${yaml-cpp_SOURCE_DIR} ${yaml-cpp_BINARY_DIR})
 endif()
+
+# Metis
+add_subdirectory(${VF_THIRD_DIR}/metis/metis-5.1.0)
+target_compile_definitions(project_options INTERFACE VF_METIS)
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d8d8279b32b280094c2a9aa5b0893297e33abceb..2e622d5448e85ef1ed5ce09468c3dae22963bd73 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -78,13 +78,11 @@ option(VF_RANGECHECK "Enable rangecheck in Release, if VF_NO_RANGECHECK is OFF"
 include(CMake/ProjectSettings.cmake)
 include(CMake/Packages.cmake)
 
-
 add_subdirectory(src/logger)
 add_subdirectory(src/basics)
 add_subdirectory(src/parallel)
 add_subdirectory(src/lbm)
 
-
 if(VF_ENABLE_CPU)
     include(cpu.cmake)
 endif()
diff --git a/cpu.cmake b/cpu.cmake
index b6de4f02a964e1433995b55144e6cddecd8dc5b6..6d7f7713de1b8e607a5150f41d31384db032d603 100644
--- a/cpu.cmake
+++ b/cpu.cmake
@@ -46,14 +46,11 @@ IF(${VF_CP_ENABLE_CATALYST})
     target_compile_definitions(project_options INTERFACE VF_CATALYST)
 ENDIF()
 
-target_compile_definitions(project_options INTERFACE VF_METIS)
-
 #############################################################
 ###                  Libraries                            ###
 #############################################################
 
 add_subdirectory(${VF_THIRD_DIR}/MuParser)
-add_subdirectory(${VF_THIRD_DIR}/metis/metis-5.1.0)
 
 add_subdirectory(src/cpu/core)
 
diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h
index b6406c4cd7c109d0e6ce020845a83a3a851718fa..62da5d548dc2d57a7a9faf8f8dadfcddb7c6ac82 100644
--- a/src/cpu/VirtualFluids.h
+++ b/src/cpu/VirtualFluids.h
@@ -41,6 +41,7 @@
 #include <parallel/Communicator.h>
 #include <parallel/MPICommunicator.h>
 #include <parallel/NullCommunicator.h>
+#include <parallel/MetisPartitioner.h>
 #include <parallel/transmitter/TbTransmitter.h>
 #include <parallel/transmitter/TbTransmitterLocal.h>
 #include <parallel/transmitter/TbTransmitterMpiPool.h>
@@ -226,8 +227,6 @@
 #include <geometry3d/KdTree/splitalgorithms/KdSpatiallMedianSplit.h>
 #include <geometry3d/KdTree/splitalgorithms/KdSplitAlgorithm.h>
 
-#include <cpu/core/Parallel/MetisPartitioner.h>
-
 #include <cpu/core/Utilities/ChangeRandomQs.hpp>
 #include <cpu/core/Utilities/CheckpointConverter.h>
 #include <cpu/core/Utilities/MathUtil.hpp>
diff --git a/src/cpu/core/CMakeLists.txt b/src/cpu/core/CMakeLists.txt
index 94dc320bcf5ed082e28731ef6341a307e4d2f997..f8a91d46c4e9c430eb88177cb664b2ff0f660fde 100644
--- a/src/cpu/core/CMakeLists.txt
+++ b/src/cpu/core/CMakeLists.txt
@@ -34,12 +34,6 @@
 
 set(VF_LIBRARIES)
 
-IF(METIS_RELEASE_LIBRARY AND METIS_DEBUG_LIBRARY)
-   list(APPEND VF_LIBRARIES optimized ${METIS_RELEASE_LIBRARY} debug ${METIS_DEBUG_LIBRARY})
-ELSE()
-   list(APPEND VF_LIBRARIES metis)
-ENDIF()
-
 IF(${VF_CPU_ENABLE_VTK})
    list(APPEND VF_LIBRARIES optimized ${VTK_LIBRARIES} debug ${VTK_LIBRARIES})
 ENDIF()
@@ -99,6 +93,5 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
     target_compile_options(${library_name} PUBLIC "/wd4305") #'initializing': truncation from double to float
     target_compile_options(${library_name} PUBLIC "/wd4505") # C4505: 'XXX': unreferenced local function has been removed
     target_compile_options(${library_name} PUBLIC "/wd4310") # C4310: cast truncates constant value, triggerd by muParserbase.h
-    target_compile_options(${library_name} PUBLIC "/wd4005") # disable macro redefinition (triggered by metis.h)
     target_compile_options(${library_name} PUBLIC "/wd4456") # C4456: declaration of hides previous local declaration
 endif()
\ No newline at end of file
diff --git a/src/cpu/core/Parallel/MPIIODataStructures.h b/src/cpu/core/SimulationObservers/MPIIODataStructures.h
similarity index 99%
rename from src/cpu/core/Parallel/MPIIODataStructures.h
rename to src/cpu/core/SimulationObservers/MPIIODataStructures.h
index f0fcca2b648c789116de06708a1dbca74b008dcd..4e45977ca63e08adab5f5bf34c989ecb481717db 100644
--- a/src/cpu/core/Parallel/MPIIODataStructures.h
+++ b/src/cpu/core/SimulationObservers/MPIIODataStructures.h
@@ -26,7 +26,7 @@
 //  SPDX-License-Identifier: GPL-3.0-or-later
 //  SPDX-FileCopyrightText: Copyright © VirtualFluids Project contributors, see AUTHORS.md in root folder
 //
-//! \addtogroup cpu_Parallel Parallel
+//! \addtogroup cpu_SimulationObservers SimulationObservers
 //! \ingroup cpu_core core
 //! \{
 //! \author Alena Karanchuk
diff --git a/src/cpu/core/Visitors/MetisPartitioningGridVisitor.h b/src/cpu/core/Visitors/MetisPartitioningGridVisitor.h
index 992664a417c1ba5ef4e9fa9ee2b7290c374958f2..153c3505d7884e93eda2d8b37f74bd98d1ca09e6 100644
--- a/src/cpu/core/Visitors/MetisPartitioningGridVisitor.h
+++ b/src/cpu/core/Visitors/MetisPartitioningGridVisitor.h
@@ -40,13 +40,12 @@
 #include <vector>
 
 #include "Grid3DVisitor.h"
-#include "MetisPartitioner.h"
+#include "parallel/MetisPartitioner.h"
 
 namespace vf::parallel {class Communicator;}
 
 ////////////////////////////////////////////////////////////////////////
 //! \brief The class implements domain decomposition with METIS library
-//! \author Kostyantyn Kucher
 //////////////////////////////////////////////////////////////////////////
 
 class Grid3D;
diff --git a/src/parallel/CMakeLists.txt b/src/parallel/CMakeLists.txt
index 9f04c1c9386b152b54970ccb520f70e65d5d2716..98bf6ff3d847b143421c1c873b91a9583f357cf7 100644
--- a/src/parallel/CMakeLists.txt
+++ b/src/parallel/CMakeLists.txt
@@ -32,7 +32,7 @@
 #! \author Soeren Peters
 #=======================================================================================
 
-vf_add_library(PUBLIC_LINK logger basics PRIVATE_LINK project_warnings project_options)
+vf_add_library(PUBLIC_LINK logger basics metis PRIVATE_LINK project_warnings project_options)
 
 if(MSVC)
     target_link_libraries(parallel PRIVATE ws2_32)
@@ -56,5 +56,9 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES ".*Clan
 endif()
 
 if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
-    target_compile_options(parallel PRIVATE "/wd4100") # warning C4100: unreferenced formal paramete
+    target_compile_options(parallel PUBLIC "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=/wd4100>")
+    target_compile_options(parallel PUBLIC "$<$<COMPILE_LANGUAGE:CXX>:/wd4100>")
+
+    target_compile_options(parallel PUBLIC "$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=/wd4005>")
+    target_compile_options(parallel PUBLIC "$<$<COMPILE_LANGUAGE:CXX>:/wd4005>")
 endif()
\ No newline at end of file
diff --git a/src/cpu/core/Parallel/MetisPartitioner.cpp b/src/parallel/MetisPartitioner.cpp
similarity index 100%
rename from src/cpu/core/Parallel/MetisPartitioner.cpp
rename to src/parallel/MetisPartitioner.cpp
diff --git a/src/cpu/core/Parallel/MetisPartitioner.h b/src/parallel/MetisPartitioner.h
similarity index 97%
rename from src/cpu/core/Parallel/MetisPartitioner.h
rename to src/parallel/MetisPartitioner.h
index f083fb6a6451ac733e104e3e0996638ef94da6cd..ab63819053dab55e7e0db36bbffcf5eef230879b 100644
--- a/src/cpu/core/Parallel/MetisPartitioner.h
+++ b/src/parallel/MetisPartitioner.h
@@ -26,8 +26,7 @@
 //  SPDX-License-Identifier: GPL-3.0-or-later
 //  SPDX-FileCopyrightText: Copyright © VirtualFluids Project contributors, see AUTHORS.md in root folder
 //
-//! \addtogroup cpu_Parallel Parallel
-//! \ingroup cpu_core core
+//! \addtogroup parallel
 //! \{
 //! \author Konstantin Kutscher
 //=======================================================================================
@@ -40,7 +39,7 @@
 
 #include "basics/utilities/UbSystem.h"
 #include "metis.h"
-#include <PointerDefinitions.h>
+#include "PointerDefinitions.h"
 #include <string>
 #include <vector>