diff --git a/apps/benchmarks/CouetteFlow/CMakeLists.txt b/apps/benchmarks/CouetteFlow/CMakeLists.txt
index c4cb893e0e140e226ab4e75486a5fe36c714384f..caf4e4173acc72e51abf31584d54dff6a6a31cf2 100644
--- a/apps/benchmarks/CouetteFlow/CMakeLists.txt
+++ b/apps/benchmarks/CouetteFlow/CMakeLists.txt
@@ -7,8 +7,8 @@ waLBerla_add_executable( NAME CouetteFlow DEPENDS blockforest boundary core fiel
 # Some tests #
 ##############
 
-waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTestNoCheckRelease COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/TestNoCheck.dat --trt --linear-exp PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo )
-waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTestNoCheckDebug   COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/TestNoCheck.dat --trt --linear-exp PROCESSES 4 LABELS longrun CONFIGURATIONS Debug DebugOptimized )
+waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTestNoCheckRelease COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/TestNoCheck.dat --trt --linear-exp PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS CouetteFlow )
+waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTestNoCheckDebug   COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/TestNoCheck.dat --trt --linear-exp PROCESSES 4 LABELS longrun CONFIGURATIONS Debug DebugOptimized DEPENDS_ON_TARGETS CouetteFlow )
 
-waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTest0 COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/Test0.dat --trt --linear-exp LABELS longrun CONFIGURATIONS Release RelWithDbgInfo )
-waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTest2 COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/Test2.dat --trt --linear-exp LABELS longrun verylongrun PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo )
+waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTest0 COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/Test0.dat --trt --linear-exp LABELS longrun CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS CouetteFlow )
+waLBerla_execute_test( NO_MODULE_LABEL NAME CouetteFlowTest2 COMMAND $<TARGET_FILE:CouetteFlow> ${CMAKE_CURRENT_SOURCE_DIR}/Test2.dat --trt --linear-exp LABELS longrun verylongrun PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS CouetteFlow )
diff --git a/apps/benchmarks/FlowAroundSphereCodeGen/CMakeLists.txt b/apps/benchmarks/FlowAroundSphereCodeGen/CMakeLists.txt
index a598b3323ba5c449b0faac046d1a7fb5e4c2744d..549b7fd080053a6cb198547fc5c5a2f8763a18a1 100644
--- a/apps/benchmarks/FlowAroundSphereCodeGen/CMakeLists.txt
+++ b/apps/benchmarks/FlowAroundSphereCodeGen/CMakeLists.txt
@@ -12,7 +12,7 @@ if (WALBERLA_BUILD_WITH_CUDA)
             FlowAroundSphereCodeGen_PackInfoOdd.cu FlowAroundSphereCodeGen_PackInfoOdd.h
             FlowAroundSphereCodeGen_InfoHeader.h)
     waLBerla_add_executable( NAME FlowAroundSphereCodeGen FILE FlowAroundSphereCodeGen.cpp
-            DEPENDS blockforest boundary core domain_decomposition field geometry timeloop vtk FlowAroundSphereGenerated)
+            DEPENDS blockforest boundary core domain_decomposition field geometry python_coupling timeloop vtk FlowAroundSphereGenerated)
 else ()
     waLBerla_generate_target_from_python(NAME FlowAroundSphereGenerated
             FILE FlowAroundSphereCodeGen.py
@@ -25,5 +25,5 @@ else ()
             FlowAroundSphereCodeGen_PackInfoOdd.cpp FlowAroundSphereCodeGen_PackInfoOdd.h
             FlowAroundSphereCodeGen_InfoHeader.h)
     waLBerla_add_executable( NAME FlowAroundSphereCodeGen FILE FlowAroundSphereCodeGen.cpp
-            DEPENDS blockforest boundary core domain_decomposition field geometry timeloop vtk FlowAroundSphereGenerated)
+            DEPENDS blockforest boundary core domain_decomposition field geometry python_coupling timeloop vtk FlowAroundSphereGenerated)
 endif()
\ No newline at end of file
diff --git a/apps/benchmarks/PhaseFieldAllenCahn/CMakeLists.txt b/apps/benchmarks/PhaseFieldAllenCahn/CMakeLists.txt
index 629c9ec0a609c7312027d037f5504fc3a4d3ecb6..35bf3f763256cd59bf0e516467e789db35a398de 100644
--- a/apps/benchmarks/PhaseFieldAllenCahn/CMakeLists.txt
+++ b/apps/benchmarks/PhaseFieldAllenCahn/CMakeLists.txt
@@ -15,7 +15,7 @@ if (WALBERLA_BUILD_WITH_CUDA)
 
     waLBerla_add_executable(NAME benchmark_multiphase
             FILES benchmark_multiphase.cpp InitializerFunctions.cpp multiphase_codegen.py
-            DEPENDS blockforest core cuda field postprocessing lbm geometry timeloop gui BenchmarkPhaseFieldCodeGenGPU)
+            DEPENDS blockforest core cuda field postprocessing python_coupling lbm geometry timeloop gui BenchmarkPhaseFieldCodeGenGPU)
 else ()
     waLBerla_generate_target_from_python(NAME BenchmarkPhaseFieldCodeGenCPU
             FILE multiphase_codegen.py
@@ -30,6 +30,6 @@ else ()
 
     waLBerla_add_executable(NAME benchmark_multiphase
             FILES benchmark_multiphase.cpp InitializerFunctions.cpp multiphase_codegen.py
-            DEPENDS blockforest core field postprocessing lbm geometry timeloop gui BenchmarkPhaseFieldCodeGenCPU)
+            DEPENDS blockforest core field postprocessing python_coupling lbm geometry timeloop gui BenchmarkPhaseFieldCodeGenCPU)
 endif (WALBERLA_BUILD_WITH_CUDA)
 
diff --git a/apps/benchmarks/PoiseuilleChannel/CMakeLists.txt b/apps/benchmarks/PoiseuilleChannel/CMakeLists.txt
index b5d3d42a7fc0cc67f07307324c198144dad97a99..7d354fba8ad13ad6db45d312009db2ee43305cec 100644
--- a/apps/benchmarks/PoiseuilleChannel/CMakeLists.txt
+++ b/apps/benchmarks/PoiseuilleChannel/CMakeLists.txt
@@ -7,13 +7,13 @@ waLBerla_add_executable( NAME PoiseuilleChannel DEPENDS blockforest boundary cor
 # Some tests #
 ##############
 
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlatesNoCheckRelease COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlatesNoCheck.dat --trt --linear-exp PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo )
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipeNoCheckRelease           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipeNoCheck.dat           --trt --linear-exp PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlatesNoCheckRelease COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlatesNoCheck.dat --trt --linear-exp PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS PoiseuilleChannel )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipeNoCheckRelease           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipeNoCheck.dat           --trt --linear-exp PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS PoiseuilleChannel )
 
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlatesNoCheckDebug COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlatesNoCheck.dat --trt --linear-exp PROCESSES 4 LABELS longrun CONFIGURATIONS Debug DebugOptimized )
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipeNoCheckDebug           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipeNoCheck.dat           --trt --linear-exp PROCESSES 4 LABELS longrun CONFIGURATIONS Debug DebugOptimized )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlatesNoCheckDebug COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlatesNoCheck.dat --trt --linear-exp PROCESSES 4 LABELS longrun CONFIGURATIONS Debug DebugOptimized DEPENDS_ON_TARGETS PoiseuilleChannel )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipeNoCheckDebug           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipeNoCheck.dat           --trt --linear-exp PROCESSES 4 LABELS longrun CONFIGURATIONS Debug DebugOptimized DEPENDS_ON_TARGETS PoiseuilleChannel )
 
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlates0 COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlates0.dat --trt --linear-exp LABELS longrun                         CONFIGURATIONS Release RelWithDbgInfo )
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlates2 COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlates2.dat --trt --linear-exp LABELS longrun verylongrun PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo )
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipe0           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipe0.dat --trt --linear-exp           LABELS longrun                         CONFIGURATIONS Release RelWithDbgInfo )
-waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipe2           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipe2.dat --trt --linear-exp           LABELS longrun verylongrun PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlates0 COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlates0.dat --trt --linear-exp LABELS longrun                         CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS PoiseuilleChannel )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestParallelPlates2 COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestParallelPlates2.dat --trt --linear-exp LABELS longrun verylongrun PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS PoiseuilleChannel )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipe0           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipe0.dat --trt --linear-exp           LABELS longrun                         CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS PoiseuilleChannel )
+waLBerla_execute_test( NO_MODULE_LABEL NAME PoiseuilleChannelTestPipe2           COMMAND $<TARGET_FILE:PoiseuilleChannel> ${CMAKE_CURRENT_SOURCE_DIR}/TestPipe2.dat --trt --linear-exp           LABELS longrun verylongrun PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS PoiseuilleChannel )
diff --git a/apps/benchmarks/SchaeferTurek/CMakeLists.txt b/apps/benchmarks/SchaeferTurek/CMakeLists.txt
index 88463aaf3860249071e395f74a1bd1765127ef17..06cfca6e34be7beb1e0dc96f87ce9d0cd05109de 100644
--- a/apps/benchmarks/SchaeferTurek/CMakeLists.txt
+++ b/apps/benchmarks/SchaeferTurek/CMakeLists.txt
@@ -3,4 +3,4 @@ waLBerla_link_files_to_builddir( "*.dat" )
                                   
 waLBerla_add_executable( NAME SchaeferTurek DEPENDS blockforest boundary core field lbm postprocessing stencil timeloop vtk sqlite )
 
-waLBerla_execute_test( NO_MODULE_LABEL NAME SchaeferTurekTest COMMAND $<TARGET_FILE:SchaeferTurek> Test2D.dat PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo )
\ No newline at end of file
+waLBerla_execute_test( NO_MODULE_LABEL NAME SchaeferTurekTest COMMAND $<TARGET_FILE:SchaeferTurek> Test2D.dat PROCESSES 4 CONFIGURATIONS Release RelWithDbgInfo DEPENDS_ON_TARGETS SchaeferTurek )
\ No newline at end of file
diff --git a/apps/benchmarks/UniformGridGPU/CMakeLists.txt b/apps/benchmarks/UniformGridGPU/CMakeLists.txt
index d084f8171a9581f0e1aded38cde8182d7821f815..5725eac23a734f88dbe3ea215a460d2037cde53c 100644
--- a/apps/benchmarks/UniformGridGPU/CMakeLists.txt
+++ b/apps/benchmarks/UniformGridGPU/CMakeLists.txt
@@ -21,10 +21,9 @@ foreach(streaming_pattern pull push aa esotwist)
                     UniformGridGPU_InfoHeader.h
                     )
 
-
             waLBerla_add_executable(NAME UniformGridGPU_${config}
                     FILES UniformGridGPU.cpp
-                    DEPENDS blockforest boundary core cuda domain_decomposition field geometry timeloop vtk UniformGridGPUGenerated_${config})
+                    DEPENDS blockforest boundary core cuda domain_decomposition field geometry python_coupling timeloop vtk UniformGridGPUGenerated_${config})
 
             # all configs are excluded from all except for pull d3q27.
             if (${streaming_pattern} STREQUAL "pull" AND ${stencil} STREQUAL "d3q27")
diff --git a/apps/pythonmodule/CMakeLists.txt b/apps/pythonmodule/CMakeLists.txt
index ee58a3257f9d9408f3da4eb608663e429aea84f1..5ea0decea67007ad01fb8e155a8667fe290dd64f 100644
--- a/apps/pythonmodule/CMakeLists.txt
+++ b/apps/pythonmodule/CMakeLists.txt
@@ -1,6 +1,7 @@
 # waLBerla Python module
-
-
+if( NOT TARGET python_coupling )
+    message( WARNING "python module ist not build since the python_coupling target is non-existent" )
+else()
 if ( WALBERLA_BUILD_WITH_PYTHON )
     if ( WALBERLA_BUILD_WITH_CUDA )
         set(PYTHON_MODULE_DEPENDENCIES blockforest boundary domain_decomposition core field python_coupling timeloop vtk cuda)
@@ -31,3 +32,4 @@ if ( WALBERLA_BUILD_WITH_PYTHON )
     add_custom_target( pythonModule        ALL ${Python_EXECUTABLE} setup.py build   DEPENDS walberla_cpp )
     add_custom_target( pythonModuleInstall     ${Python_EXECUTABLE} setup.py install --user DEPENDS walberla_cpp )
 endif()
+endif()
\ No newline at end of file
diff --git a/apps/showcases/PhaseFieldAllenCahn/CPU/CMakeLists.txt b/apps/showcases/PhaseFieldAllenCahn/CPU/CMakeLists.txt
index 07cc9000ed8a1b2dc6f952904d6b217c868629b0..abce2c997954b4cdcb5f55ea57c75ada1837b9c2 100644
--- a/apps/showcases/PhaseFieldAllenCahn/CPU/CMakeLists.txt
+++ b/apps/showcases/PhaseFieldAllenCahn/CPU/CMakeLists.txt
@@ -18,4 +18,4 @@ waLBerla_generate_target_from_python(NAME PhaseFieldCodeGenCPU
 
 waLBerla_add_executable(NAME multiphaseCPU
         FILES multiphase.cpp PythonExports.cpp InitializerFunctions.cpp multiphase_codegen.py
-        DEPENDS blockforest core field postprocessing lbm geometry timeloop gui PhaseFieldCodeGenCPU)
+        DEPENDS blockforest core field postprocessing python_coupling lbm geometry timeloop gui PhaseFieldCodeGenCPU)
diff --git a/apps/showcases/PhaseFieldAllenCahn/GPU/CMakeLists.txt b/apps/showcases/PhaseFieldAllenCahn/GPU/CMakeLists.txt
index 8cd135d5615458707f86cd2f0b0811f11da99ccf..ac4feda33525937c298e97116cdffa3833d40b7e 100644
--- a/apps/showcases/PhaseFieldAllenCahn/GPU/CMakeLists.txt
+++ b/apps/showcases/PhaseFieldAllenCahn/GPU/CMakeLists.txt
@@ -18,4 +18,4 @@ waLBerla_generate_target_from_python(NAME PhaseFieldCodeGenGPU
 
 waLBerla_add_executable(NAME multiphaseGPU
         FILES multiphase.cpp PythonExports.cpp InitializerFunctions.cpp util.cpp multiphase_codegen.py
-        DEPENDS blockforest core cuda field postprocessing lbm geometry timeloop gui PhaseFieldCodeGenGPU)
+        DEPENDS blockforest core cuda field postprocessing python_coupling lbm geometry timeloop gui PhaseFieldCodeGenGPU)
diff --git a/apps/tutorials/pe/CMakeLists.txt b/apps/tutorials/pe/CMakeLists.txt
index 4fda841130cfddf96965e100a1bdfa83d4df49ea..5b71226d3565ad94d9bac56f91f3d0385c6fdf61 100644
--- a/apps/tutorials/pe/CMakeLists.txt
+++ b/apps/tutorials/pe/CMakeLists.txt
@@ -11,4 +11,4 @@ waLBerla_add_executable ( NAME 02_Tutorial_ConfinedGasExtended
 waLBerla_execute_test( NO_MODULE_LABEL NAME 01_Tutorial_ConfinedGas PROCESSES 8 )
 waLBerla_execute_test( NO_MODULE_LABEL NAME 02_Tutorial_ConfinedGasExtended
                        COMMAND $<TARGET_FILE:02_Tutorial_ConfinedGasExtended> 02_ConfinedGasExtended.cfg
-                       PROCESSES 8 )
+                       PROCESSES 8 DEPENDS_ON_TARGETS 02_Tutorial_ConfinedGasExtended )
diff --git a/cmake/waLBerlaFunctions.cmake b/cmake/waLBerlaFunctions.cmake
index 2974ca22d9bd24988558c33cd5b07b59a58432c2..4962e18cabc6a6128ac8b003c99cfe6110d45520 100644
--- a/cmake/waLBerlaFunctions.cmake
+++ b/cmake/waLBerlaFunctions.cmake
@@ -31,6 +31,7 @@ set ( WALBERLA_GLOB_FILES *.cpp
 #######################################################################################################################
 
 function ( waLBerla_add_module )
+    message(WARNING "This function is deprecated. Please use the default cmake mechanisms like add_library.")
     set( options )
     set( oneValueArgs )
     set( multiValueArgs DEPENDS EXCLUDE FILES BUILD_ONLY_IF_FOUND OPTIONAL_DEPENDS )
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e132dd52a4e2f87e6e52228f9a505b85711db74e..e5ca7b0c84c43f0d46a1dd9722bd6cdfe1d1f65e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,23 +1,58 @@
 
 # List modules here that should not be built
-set ( excludedModules  )
-
-
-
-# Generate the list of modulesToBuild ( all subfolders minus excludedModules )
-file (GLOB allFilesAndDirs  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} * )
-list_minus ( modulesToBuild LIST1 ${allFilesAndDirs} LIST2 ${excludedModules} "CMakeFiles" )
-
-# Activate modules
-foreach ( mod ${modulesToBuild} )  
-    if( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${mod} )       
-       add_subdirectory( ${mod} ) 
-    endif()
-endforeach()       
-
-
-# Write out a module statistic file that accumulates information about all 
-# modules that have been added via waLBerla_add_module
-waLBerla_write_module_statistics ( "${walberla_BINARY_DIR}/moduleStatistics.json" )
-
+#set ( excludedModules core )
+#
+#
+#
+## Generate the list of modulesToBuild ( all subfolders minus excludedModules )
+#file (GLOB allFilesAndDirs  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} * )
+#list_minus ( modulesToBuild LIST1 ${allFilesAndDirs} LIST2 ${excludedModules} "CMakeFiles" )
+#
+## Activate modules
+#foreach ( mod ${modulesToBuild} )
+#    if( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${mod} )
+#       add_subdirectory( ${mod} )
+#    endif()
+#endforeach()
+#
+#
+## Write out a module statistic file that accumulates information about all
+## modules that have been added via waLBerla_add_module
+#waLBerla_write_module_statistics ( "${walberla_BINARY_DIR}/moduleStatistics.json" )
+
+add_subdirectory( blockforest )
+add_subdirectory( boundary )
+add_subdirectory( communication )
+add_subdirectory( core )
+if ( CMAKE_CUDA_COMPILER )
+   add_subdirectory( cuda )
+endif()
+add_subdirectory( domain_decomposition )
+add_subdirectory( executiontree )
+if ( FFTW3_FOUND )
+   add_subdirectory( fft )
+endif()
+add_subdirectory( field )
+add_subdirectory( gather )
+add_subdirectory( geometry )
+add_subdirectory( gui )
+add_subdirectory( lbm )
+add_subdirectory( lbm_mesapd_coupling )
+add_subdirectory( mesa_pd )
+if( OPENMESH_FOUND )
+   add_subdirectory( mesh )
+   add_subdirectory( mesh_common )
+endif()
+add_subdirectory( pde )
+add_subdirectory( pe )
+add_subdirectory( pe_coupling )
+add_subdirectory( postprocessing )
+if (WALBERLA_BUILD_WITH_PYTHON)
+   add_subdirectory(python_coupling)
+endif ()
+add_subdirectory( simd )
+add_subdirectory( sqlite )
+add_subdirectory( stencil )
+add_subdirectory( timeloop )
+add_subdirectory( vtk )
 
diff --git a/src/blockforest/CMakeLists.txt b/src/blockforest/CMakeLists.txt
index 84027d327ed552e6cb0c9b35aec657fa308f3074..1498ef455a1be4e128c35329e22c80065b141cab 100644
--- a/src/blockforest/CMakeLists.txt
+++ b/src/blockforest/CMakeLists.txt
@@ -3,6 +3,51 @@ OPTION( WALBERLA_BLOCKFOREST_PRIMITIVE_BLOCKID "BlockForest: enables/disables Bl
 
 mark_as_advanced( WALBERLA_BLOCKFOREST_PRIMITIVE_BLOCKID )
 
-configure_file ( CMakeDefs.in.h  CMakeDefs.h )
+configure_file( CMakeDefs.in.h CMakeDefs.h )
 
-waLBerla_add_module( DEPENDS communication core domain_decomposition stencil )
+add_library( blockforest )
+target_link_libraries( blockforest PUBLIC communication core domain_decomposition stencil )
+target_sources( blockforest
+      PRIVATE
+      AABBRefinementSelection.h
+      all.h
+      BlockDataHandling.h
+      BlockForestEvaluation.h
+      BlockForestFile.h
+      BlockForest.h
+      Block.h
+      BlockID.h
+      BlockNeighborhoodConstruction.h
+      BlockNeighborhoodSection.h
+      BlockReconstruction.h
+      CMakeDefs.in.h
+      GlobalLoadBalancing.h
+      HilbertCurveConstruction.h
+      Initialization.h
+      OutputColor.h
+      PhantomBlockForest.h
+      PhantomBlock.h
+      SetupBlockForest.h
+      SetupBlock.h
+      StructuredBlockForest.h
+      Types.h
+      Utility.h
+      Block.cpp
+      BlockDataHandling.cpp
+      BlockForest.cpp
+      BlockForestEvaluation.cpp
+      BlockID.cpp
+      BlockNeighborhoodConstruction.cpp
+      BlockReconstruction.cpp
+      Initialization.cpp
+      OutputColor.cpp
+      PhantomBlock.cpp
+      PhantomBlockForest.cpp
+      SetupBlock.cpp
+      SetupBlockForest.cpp
+      StructuredBlockForest.cpp
+      Utility.cpp
+      )
+
+add_subdirectory( communication )
+add_subdirectory( loadbalancing )
\ No newline at end of file
diff --git a/src/blockforest/communication/CMakeLists.txt b/src/blockforest/communication/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9038ee5c643bd17ec5741ca2870dc15589545a06
--- /dev/null
+++ b/src/blockforest/communication/CMakeLists.txt
@@ -0,0 +1,11 @@
+target_sources( blockforest
+      PRIVATE
+      DirectionBasedReduceScheme.h
+      LocalCommunicationMode.h
+      NonUniformBufferedScheme.h
+      NonUniformPackInfo.h
+      UniformBufferedScheme.h
+      UniformDirectScheme.h
+      UniformDirectScheme.impl.h
+      UniformToNonUniformPackInfoAdapter.h
+      )
\ No newline at end of file
diff --git a/src/blockforest/loadbalancing/CMakeLists.txt b/src/blockforest/loadbalancing/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ba4d7c69787dda149a68b01a77cbab46dc2be1ef
--- /dev/null
+++ b/src/blockforest/loadbalancing/CMakeLists.txt
@@ -0,0 +1,17 @@
+target_sources( blockforest
+      PRIVATE
+      BlockInfo.h
+      Cartesian.h
+      DynamicCurve.h
+      DynamicDiffusive.h
+      DynamicParMetis.h
+      InfoCollection.h
+      NoPhantomData.h
+      PODPhantomData.h
+      StaticCurve.h
+      StaticParMetis.h
+      Cartesian.cpp
+      DynamicParMetis.cpp
+      StaticCurve.cpp
+      StaticParMetis.cpp
+      )
\ No newline at end of file
diff --git a/src/boundary/CMakeLists.txt b/src/boundary/CMakeLists.txt
index c46e4eee3a3f68f720be753f609db7637aafcfec..c122cbddc6a715ce446071a60c22dc11bb849b03 100644
--- a/src/boundary/CMakeLists.txt
+++ b/src/boundary/CMakeLists.txt
@@ -5,4 +5,13 @@
 ###################################################################################################
 
 
-waLBerla_add_module( DEPENDS core communication domain_decomposition field python_coupling stencil )
+add_library( boundary )
+target_link_libraries( boundary PUBLIC core communication domain_decomposition field stencil )
+target_sources( boundary
+      PRIVATE
+      BoundaryHandling.h
+      Boundary.h
+      BoundaryHandlingCollection.h
+      Boundary.cpp
+      BoundaryUID.h
+      )
diff --git a/src/boundary/communication/CMakeLists.txt b/src/boundary/communication/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..63d92d9db7fc2547845737fa5279844b3db2a4b9
--- /dev/null
+++ b/src/boundary/communication/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( boundary
+    PRIVATE
+    HandlingPackInfo.h     
+    )
diff --git a/src/communication/CMakeLists.txt b/src/communication/CMakeLists.txt
index 309ec2671d091413325f4984d432e60ee839997c..82b1a4cc2e6505c918f7f7512804973827f67f41 100644
--- a/src/communication/CMakeLists.txt
+++ b/src/communication/CMakeLists.txt
@@ -4,6 +4,13 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core domain_decomposition stencil )
-                        
+add_library( communication INTERFACE )
+target_sources( communication
+      INTERFACE
+      ReducePackInfo.h
+      UniformMPIDatatypeInfo.h
+      UniformPackInfo.h
+      )
+target_link_libraries( communication INTERFACE core domain_decomposition stencil )
+
 ###################################################################################################                        
\ No newline at end of file
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index b457a62c63f80b02e7dfa6a71e2ecc929b0fdbb7..f3a6dc20b97c034513391b21528648f51b394299 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -25,7 +25,67 @@ configure_file ( waLBerlaBuildInfo.in.cpp
 include( math/math.cmake )
 include( logging/logging.cmake )
 
-file ( GLOB_RECURSE sourceFiles ${WALBERLA_GLOB_FILES} )
-list( APPEND sourceFiles "${walberla_BINARY_DIR}/src/core/waLBerlaBuildInfo.cpp" )
+add_library( core )
+if( MPI_FOUND )
+   target_link_libraries( core PUBLIC MPI::MPI_CXX )
+endif()
+target_link_libraries( core PUBLIC ${SERVICE_LIBS} )
+target_sources( core
+      PRIVATE
+         Abort.cpp
+         Conversion.cpp
+         DataTypes.cpp
+         Environment.cpp
+         GetPID.cpp
+         Hostname.cpp
+         MemoryUsage.cpp
+         RandomUUID.cpp
+         Sleep.cpp
+         waLBerlaBuildInfo.cpp
+         Abort.h
+         AllSet.h
+         Any.h
+         Array.h
+         ConcatIterator.h
+         Conversion.h
+         DataTypes.h
+         EndianIndependentSerialization.h
+         Environment.h
+         Filesystem.h
+         FunctionTraits.h
+         GetPID.h
+         Hostname.h
+         Macros.h
+         MemoryUsage.h
+         MultiArrayIO.h
+         MultiArrayIO.impl.h
+         NonCopyable.h
+         NonCreateable.h
+         OpenMP.h
+         Optional.h
+         RandomUUID.h
+         Regex.h
+         Sanitizer.h
+         Set.h
+         SharedFunctor.h
+         Sleep.h
+         STLIO.h
+         stringToNum.h
+         StringUtility.h
+         StringUtility.impl.h
+         typeToString.h
+         UniqueID.h
+         Variant.h
+         VectorTrait.h
+         waLBerlaBuildInfo.h
+      )
 
-waLBerla_add_module( FILES ${sourceFiles} EXCLUDE "${walberla_SOURCE_DIR}/src/core/waLBerlaBuildInfo.in.cpp" )
+add_subdirectory( cell )
+add_subdirectory( debug )
+add_subdirectory( mpi )
+add_subdirectory( logging)
+add_subdirectory( load_balancing )
+add_subdirectory( config )
+add_subdirectory( math )
+add_subdirectory( timing )
+add_subdirectory( grid_generator )
\ No newline at end of file
diff --git a/src/core/cell/CMakeLists.txt b/src/core/cell/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fbc636d7c088ce46968d23034a0889b4ea587c66
--- /dev/null
+++ b/src/core/cell/CMakeLists.txt
@@ -0,0 +1,11 @@
+target_sources( core
+   PRIVATE
+      Cell.h
+      CellArray.h
+      CellInterval.cpp
+      CellInterval.h
+      CellSet.cpp
+      CellSet.h
+      CellVector.cpp
+      CellVector.h
+)
diff --git a/src/core/config/CMakeLists.txt b/src/core/config/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ea80d2ac43cdbd24c70a398b92578a8eb9f09861
--- /dev/null
+++ b/src/core/config/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( core
+      PRIVATE
+      Config.cpp
+      Config.h
+      Create.cpp
+      Create.h
+      Iterator.h
+      )
diff --git a/src/core/debug/CMakeLists.txt b/src/core/debug/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1d3a9743a757725614dadcb54e51d8b65afe65cd
--- /dev/null
+++ b/src/core/debug/CMakeLists.txt
@@ -0,0 +1,18 @@
+target_sources(core
+      PRIVATE
+      CMakeLists.txt
+      CheckFunctions.cpp
+      CheckFunctions.h
+      CheckFunctions.impl.h
+      Debug.cpp
+      Debug.h
+      OperatorCheck.h
+      PrintStacktrace.cpp
+      PrintStacktrace.h
+      TestSubsystem.cpp
+      TestSubsystem.h
+      all.h
+      demangle.h
+      extern/StackWalker.cpp
+      extern/StackWalker.h
+      )
diff --git a/src/core/grid_generator/CMakeLists.txt b/src/core/grid_generator/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4570ae56fb899e473e0f2283535188b7f9d7bad7
--- /dev/null
+++ b/src/core/grid_generator/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( core
+      PRIVATE
+         HCPIterator.cpp
+         HCPIterator.h
+         SCIterator.cpp
+         SCIterator.h
+      )
diff --git a/src/core/load_balancing/CMakeLists.txt b/src/core/load_balancing/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..17a1aea2362857b7af2a332ec63ad44b37b46340
--- /dev/null
+++ b/src/core/load_balancing/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( core
+      PRIVATE
+      MetisWrapper.h
+      ParMetisWrapper.h
+      MetisWrapper.cpp
+      ParMetisWrapper.cpp
+      )
\ No newline at end of file
diff --git a/src/core/logging/CMakeLists.txt b/src/core/logging/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..563e57263ad813d04f1c66ac7c20b84a248e7664
--- /dev/null
+++ b/src/core/logging/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( core
+      PRIVATE
+      Initialization.cpp
+      Initialization.h
+      Logging.cpp
+      Logging.h
+      Tracing.h
+      )
+
diff --git a/src/core/math/CMakeLists.txt b/src/core/math/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fc18eccf217cd3c2b13358cf5119c3db5f22a065
--- /dev/null
+++ b/src/core/math/CMakeLists.txt
@@ -0,0 +1,58 @@
+target_sources( core
+      PRIVATE
+      AABB.h
+      AABBFwd.h
+      Angles.h
+      Constants.h
+      DistributedSample.cpp
+      DistributedSample.h
+      FPClassify.h
+      FastInvSqrt.h
+      GenericAABB.h
+      GenericAABB.impl.h
+      IntegerFactorization.cpp
+      IntegerFactorization.h
+      KahanSummation.h
+      Limits.h
+      MathTrait.h
+      Matrix2.h
+      Matrix3.h
+      MatrixMxN.h
+      Parser.cpp
+      Parser.h
+      ParserOMP.cpp
+      ParserOMP.h
+      PhysicalCheck.cpp
+      PhysicalCheck.h
+      Plane.h
+      Primes.cpp
+      Primes.h
+      Quaternion.h
+      Random.cpp
+      Random.h
+      Rot3.h
+      RotationFunctions.h
+      Sample.cpp
+      Sample.h
+      Shims.h
+      SqrtTrait.h
+      Uint.cpp
+      Uint.h
+      Utility.h
+      Vector2.h
+      Vector3.h
+      extern/exprtk.h
+      equation_system/Equation.cpp
+      equation_system/Equation.h
+      equation_system/EquationParser.cpp
+      equation_system/EquationParser.h
+      equation_system/EquationSystem.cpp
+      equation_system/EquationSystem.h
+      equation_system/FwdEquation.h
+      equation_system/FwdOperator.h
+      equation_system/FwdVariable.h
+      equation_system/Operator.cpp
+      equation_system/Operator.h
+      equation_system/Variable.cpp
+      equation_system/Variable.h
+      )
diff --git a/src/core/mpi/CMakeLists.txt b/src/core/mpi/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..13cc3653bd41f03e1840abd09f71147eee3c57cd
--- /dev/null
+++ b/src/core/mpi/CMakeLists.txt
@@ -0,0 +1,37 @@
+target_sources( core
+      PRIVATE
+      Broadcast.h
+      BufferDataTypeExtensions.h
+      BufferSizeTrait.h
+      BufferSystem.h
+      BufferSystem.impl.h
+      BufferSystemHelper.h
+      BufferSystemHelper.impl.h
+      CMakeLists.txt
+      Datatype.h
+      Environment.h
+      Gather.h
+      Gatherv.cpp
+      Gatherv.h
+      MPIHelper.cpp
+      MPIHelper.h
+      MPIIO.cpp
+      MPIIO.h
+      MPIManager.cpp
+      MPIManager.h
+      MPITextFile.cpp
+      MPITextFile.h
+      MPIWrapper.h
+      OpenMPBufferSystem.h
+      OpenMPBufferSystem.impl.h
+      RecvBuffer.h
+      Reduce.h
+      SendBuffer.h
+      SetReduction.h
+      Tokenizing.cpp
+      Tokenizing.h
+      all.h
+      growPolicies/ConstantGrowth.h
+      growPolicies/LinearGrowth.h
+      growPolicies/OptimalGrowth.h
+      )
diff --git a/src/core/timing/CMakeLists.txt b/src/core/timing/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b949b2eeb07612321b6297a53c92fa39c33d0eab
--- /dev/null
+++ b/src/core/timing/CMakeLists.txt
@@ -0,0 +1,19 @@
+target_sources( core
+      PRIVATE
+         CpuPolicy.h
+         ReduceType.h
+         RemainingTimeLogger.h
+         StaticPolicy.cpp
+         StaticPolicy.h
+         Time.cpp
+         Time.h
+         Timer.h
+         TimingJSON.h
+         TimingNode.cpp
+         TimingNode.h
+         TimingPool.cpp
+         TimingPool.h
+         TimingTree.cpp
+         TimingTree.h
+         WcPolicy.h
+      )
diff --git a/src/cuda/CMakeLists.txt b/src/cuda/CMakeLists.txt
index 46b22c43a0056afc407c98341384e8d22b5147f8..bfefb9dcc680ac5506f2113108e7283efd8c579d 100644
--- a/src/cuda/CMakeLists.txt
+++ b/src/cuda/CMakeLists.txt
@@ -4,7 +4,43 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS blockforest core communication domain_decomposition executiontree field stencil lbm
-                     BUILD_ONLY_IF_FOUND CUDA )
+add_library( cuda )
+target_link_libraries( cuda PUBLIC blockforest core communication domain_decomposition executiontree field stencil lbm )
+target_sources( cuda
+      PRIVATE
+      AlignedAllocation.h
+      AddGPUFieldToStorage.h
+      ErrorChecking.h
+      ExecutionTreeGPU.h
+      FieldCopy.h
+      GPUCopy.cpp
+      NVTX.h
+      FieldIndexingXYZ.h
+      FieldIndexing3D.h
+      AddGPUFieldToStorage.impl.h
+      GPUField.h
+      FieldAccessor3D.h
+      DeviceSelectMPI.h
+      HostFieldAllocator.h
+      FieldAccessor.h
+      FieldIndexing3D.impl.h
+      GPUCopy.h
+      FieldAccessorXYZ.h
+      FieldIndexingXYZ.impl.h
+      ExecutionTreeSweepGPU.h
+      FieldIndexing.h
+      AlignedAllocation.cpp
+      GPUField.impl.h
+      ParallelStreams.cpp
+      FieldIndexing.impl.h
+      Kernel.h
+      ParallelStreams.h
+      CudaRAII.h
+      DeviceSelectMPI.cpp
+      )
+
+add_subdirectory( sweeps )
+add_subdirectory( communication )
+add_subdirectory( lbm )
 
 ###################################################################################################
\ No newline at end of file
diff --git a/src/cuda/communication/CMakeLists.txt b/src/cuda/communication/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b1fe9c3492eb1e60040469cb1ada41559c1121dd
--- /dev/null
+++ b/src/cuda/communication/CMakeLists.txt
@@ -0,0 +1,11 @@
+target_sources( cuda
+    PRIVATE
+    MemcpyPackInfo.h
+    UniformGPUScheme.impl.h
+    MemcpyPackInfo.impl.h
+    CustomMemoryBuffer.impl.h
+    GPUPackInfo.h
+    CustomMemoryBuffer.h
+    UniformGPUScheme.h
+    GeneratedGPUPackInfo.h     
+    )
diff --git a/src/cuda/lbm/CMakeLists.txt b/src/cuda/lbm/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a2db712aa018fd306019a4c43bf177f536f0c2f9
--- /dev/null
+++ b/src/cuda/lbm/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( cuda
+    PRIVATE
+    CombinedInPlaceGpuPackInfo.h     
+    )
diff --git a/src/cuda/sweeps/CMakeLists.txt b/src/cuda/sweeps/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..188a4cbae837e9e649f21c242f7a33e4fdbcc7ff
--- /dev/null
+++ b/src/cuda/sweeps/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( cuda
+    PRIVATE
+    GPUSweepBase.h     
+    )
diff --git a/src/domain_decomposition/CMakeLists.txt b/src/domain_decomposition/CMakeLists.txt
index dec43724f08b3414997af93b22e4ebe819191ae9..548c73ed4cb91812237f6c284ef0b0d1c665f82b 100644
--- a/src/domain_decomposition/CMakeLists.txt
+++ b/src/domain_decomposition/CMakeLists.txt
@@ -4,6 +4,31 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core )
-                        
+add_library( domain_decomposition )
+target_link_libraries( domain_decomposition PUBLIC core )
+target_sources( domain_decomposition
+      PRIVATE
+      BlockCounter.h
+      BlockDataHandling.h
+      BlockDataID.h
+      BlockStorage.h
+      BlockSweepWrapper.h
+      IBlock.h
+      IBlockID.h
+      MakeBlockDataInitFunction.h
+      MapPointToPeriodicDomain.h
+      PeriodicIntersect.h
+      PeriodicIntersectionVolume.h
+      SharedSweep.h
+      StructuredBlockStorageCellMapping.h
+      StructuredBlockStorage.h
+      BlockDataHandling.cpp
+      BlockStorage.cpp
+      IBlock.cpp
+      MapPointToPeriodicDomain.cpp
+      PeriodicIntersect.cpp
+      PeriodicIntersectionVolume.cpp
+      StructuredBlockStorage.cpp
+      )
+
 ###################################################################################################                        
\ No newline at end of file
diff --git a/src/executiontree/CMakeLists.txt b/src/executiontree/CMakeLists.txt
index 46737d9f904318c4ca91dfbbb5b894a195103483..8d7e31419ac497911a7a3ef462e7710b0b64eac1 100644
--- a/src/executiontree/CMakeLists.txt
+++ b/src/executiontree/CMakeLists.txt
@@ -4,6 +4,14 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core domain_decomposition timeloop )
+add_library( executiontree )
+target_link_libraries( executiontree PUBLIC core domain_decomposition timeloop )
+target_sources( executiontree
+      PRIVATE
+      ExecutionTreeSweep.h
+      ExecutionTree.cpp
+      ExecutionTree.h
+      ExecutionTree.impl.h
+      )
                         
 ###################################################################################################                        
\ No newline at end of file
diff --git a/src/fft/CMakeLists.txt b/src/fft/CMakeLists.txt
index ccd909ca9a5c9c37aaf6476215e30170fe311989..641010004b73855fd0fd4d2d47e247cef22afcb3 100644
--- a/src/fft/CMakeLists.txt
+++ b/src/fft/CMakeLists.txt
@@ -4,6 +4,12 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core blockforest field BUILD_ONLY_IF_FOUND ${FFT_REQUIRED_LIBRARIES} )
+add_library( fft )
+target_link_libraries( fft PUBLIC core blockforest field )
+target_sources( fft
+      PRIVATE
+      Fft.h
+      Fft.cpp
+      )
 
 ###################################################################################################
diff --git a/src/field/CMakeLists.txt b/src/field/CMakeLists.txt
index 5653ec542776e1cf98d66797015c270af39089ee..6ef0a5835f537082069fad394787375e2cad1e0f 100644
--- a/src/field/CMakeLists.txt
+++ b/src/field/CMakeLists.txt
@@ -11,6 +11,45 @@ mark_as_advanced( WALBERLA_THREAD_SAFE_FIELD_ALLOCATION )
 
 configure_file ( CMakeDefs.in.h  CMakeDefs.h )
 
-waLBerla_add_module( DEPENDS blockforest core communication domain_decomposition python_coupling stencil vtk )
+add_library( field )
+target_link_libraries( field PUBLIC blockforest core communication domain_decomposition stencil vtk )
+target_sources( field
+      PRIVATE
+      SwapableCompare.h
+      AccuracyEvaluation.h
+      FlagFunctions.h
+      AccuracyEvaluationLinePlot.h
+      VolumetricFlowRateEvaluation.h
+      GhostLayerField.h
+      GhostRegions.h
+      AddToStorage.h
+      EvaluationFilter.h
+      FlagField.h
+      Gather.h
+      Layout.h
+      SymmetryCheck.h
+      FileIO.impl.h
+      Field.impl.h
+      Field.h
+      FileIO.h
+      FlagField.impl.h
+      CMakeDefs.in.h
+      CellCounter.h
+      Printers.impl.h
+      MassEvaluation.h
+      GhostLayerField.impl.h
+      Printers.h
+      FieldClone.h
+      StabilityChecker.h
+      FlagUID.h
+      )
 
- 
\ No newline at end of file
+add_subdirectory( adaptors )
+add_subdirectory( allocation )
+add_subdirectory( blockforest )
+add_subdirectory( communication )
+add_subdirectory( distributors )
+add_subdirectory( interpolators )
+add_subdirectory( iterators )
+add_subdirectory( refinement )
+add_subdirectory( vtk )
\ No newline at end of file
diff --git a/src/field/adaptors/CMakeLists.txt b/src/field/adaptors/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b139d0e1499bb28eb692ceebdbdfec7b744d2694
--- /dev/null
+++ b/src/field/adaptors/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( field
+    PRIVATE
+    VectorFieldAccessor.h
+    GhostLayerFieldAdaptor.h
+    AdaptorIterator.h
+    AdaptorCreators.h
+    ComponentExtractionAdaptor.h     
+    )
diff --git a/src/field/allocation/CMakeLists.txt b/src/field/allocation/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d257a62cc39dffadc96ab91e5679db7f85bf2a2b
--- /dev/null
+++ b/src/field/allocation/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( field
+    PRIVATE
+    AlignedMalloc.cpp
+    AlignedMalloc.h
+    FieldAllocator.h     
+    )
diff --git a/src/field/blockforest/CMakeLists.txt b/src/field/blockforest/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cb64f75c12f7eaca6bbc829a49cac051a5b64524
--- /dev/null
+++ b/src/field/blockforest/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( field
+    PRIVATE
+    GradientRefinement.h
+    BlockDataHandling.h     
+    )
diff --git a/src/field/communication/CMakeLists.txt b/src/field/communication/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..005bda8d2ee0af014085cf1e5fa6be6cb19a0fb7
--- /dev/null
+++ b/src/field/communication/CMakeLists.txt
@@ -0,0 +1,11 @@
+target_sources( field
+    PRIVATE
+    MPIDatatypes.impl.h
+    StencilRestrictedMPIDatatypeInfo.h
+    StencilRestrictedPackInfo.h
+    PackInfo.h
+    ReducePackInfo.h
+    UniformPullReductionPackInfo.h
+    UniformMPIDatatypeInfo.h
+    MPIDatatypes.h     
+    )
diff --git a/src/field/distributors/CMakeLists.txt b/src/field/distributors/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b74a8d3f2241f124ea3459d103e95a993f5e41ab
--- /dev/null
+++ b/src/field/distributors/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( field
+    PRIVATE
+    NearestNeighborDistributor.h
+    KernelDistributor.h
+    DistributorCreators.h     
+    )
diff --git a/src/field/doc/CMakeLists.txt b/src/field/doc/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4f2d83c38de36e27908e50b8d41b8accc46b41fc
--- /dev/null
+++ b/src/field/doc/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( field
+    PRIVATE
+         
+    )  
diff --git a/src/field/interpolators/CMakeLists.txt b/src/field/interpolators/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2e78a0e25d55446a19ac538dca647e73812a0a7e
--- /dev/null
+++ b/src/field/interpolators/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources( field
+    PRIVATE
+    NearestNeighborFieldInterpolator.h
+    TrilinearInterpolator.h
+    TrilinearInterpolatorFwd.h
+    NearestNeighborInterpolator.h
+    TrilinearFieldInterpolator.h
+    KernelFieldInterpolator.h
+    FieldInterpolatorCreators.h     
+    )
diff --git a/src/field/iterators/CMakeLists.txt b/src/field/iterators/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..696f02855b086eade14b9356439447b66017b368
--- /dev/null
+++ b/src/field/iterators/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( field
+    PRIVATE
+    FieldIterator.h
+    IteratorMacros.h
+    FieldNeighborPointer.h
+    FieldPointer.h
+    FieldIterator.impl.h     
+    )
diff --git a/src/field/refinement/CMakeLists.txt b/src/field/refinement/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b88cbdabe00ad506c7da1c76ebc1691bff42429b
--- /dev/null
+++ b/src/field/refinement/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( field
+    PRIVATE
+    PackInfo.h     
+    )
diff --git a/src/field/vtk/CMakeLists.txt b/src/field/vtk/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8fbb8e8038676fe071f59c838f08d428d209b68e
--- /dev/null
+++ b/src/field/vtk/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( field
+    PRIVATE
+    FlagFieldCellFilter.h
+    FlagFieldMapping.h
+    VTKWriter.h     
+    )
diff --git a/src/gather/CMakeLists.txt b/src/gather/CMakeLists.txt
index 0519c21df8652aec8d4d7c7c21cb2da4aee3e371..19cdf86abbd3edf1cffe005f95a5a11aa9465b04 100644
--- a/src/gather/CMakeLists.txt
+++ b/src/gather/CMakeLists.txt
@@ -4,8 +4,21 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core
-                             domain_decomposition
-                             field )
-
+add_library( gather )
+target_link_libraries( gather PUBLIC core domain_decomposition field )
+target_sources( gather
+      PRIVATE
+      CellGatherPackInfo.h
+      FileGatherScheme.cpp
+      GnuPlotGraphWriter.h
+      CurveGatherPackInfo.h
+      CurveGatherPackInfo.impl.h
+      FileGatherScheme.h
+      MPIGatherScheme.h
+      CommonSchemeFunctions.h
+      DataProcessor.h
+      GatherPackInfo.h
+      MPIGatherScheme.cpp
+      CellGatherPackInfo.impl.h
+      )
 ###################################################################################################
diff --git a/src/geometry/CMakeLists.txt b/src/geometry/CMakeLists.txt
index c9fd5112a90ed928d8b755fe1909f1fd3fa92793..43972ee5fdd81a71939328bd69bfe7b5e9a08686 100644
--- a/src/geometry/CMakeLists.txt
+++ b/src/geometry/CMakeLists.txt
@@ -4,12 +4,18 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core
-                             domain_decomposition
-                             boundary
-                             field
-                             python_coupling
-                             stencil )
-target_link_libraries(geometry PRIVATE lodepng)
+add_library( geometry )
+target_sources( geometry
+      PRIVATE
+      GeometricalFunctions.h
+      InitBoundaryHandling.h
+      GeometricalFunctions.cpp
+      )
+target_link_libraries(geometry PUBLIC core domain_decomposition boundary field stencil PRIVATE lodepng)
 
+add_subdirectory( bodies )
+add_subdirectory( containment_octree )
+add_subdirectory( initializer )
+add_subdirectory( mesh )
+add_subdirectory( structured )
 ###################################################################################################
diff --git a/src/geometry/bodies/CMakeLists.txt b/src/geometry/bodies/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9a1194d4327a09c61cb9ad57be409ba12e4b9f82
--- /dev/null
+++ b/src/geometry/bodies/CMakeLists.txt
@@ -0,0 +1,18 @@
+target_sources( geometry
+    PRIVATE
+    Torus.h
+    BodyFromConfig.h
+    BodyFromConfig.cpp
+    Ellipsoid.h
+    Sphere.h
+    Cylinder.cpp
+    BodyLogic.h
+    Ellipsoid.cpp
+    AABBBody.h
+    Cylinder.h
+    Torus.cpp
+    BodyOverlapFunctions.h
+    Sphere.cpp
+    BodyOverlapFunctions.impl.h
+    DynamicBody.h     
+    )
diff --git a/src/geometry/containment_octree/CMakeLists.txt b/src/geometry/containment_octree/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5601695723e17a3542f2444d55db92238aa6c94c
--- /dev/null
+++ b/src/geometry/containment_octree/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources( geometry
+    PRIVATE
+    InsideLeafNode.h
+    OutsideLeafNode.h
+    IndeterminateLeafNode.h
+    BranchNode.h
+    ContainmentOctree.h
+    LeafNode.h
+    Node.h     
+    )
diff --git a/src/geometry/initializer/CMakeLists.txt b/src/geometry/initializer/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a6af8b35115c8e6dfed8e291a80e6fc0fe96f67a
--- /dev/null
+++ b/src/geometry/initializer/CMakeLists.txt
@@ -0,0 +1,27 @@
+target_sources( geometry
+    PRIVATE
+    BoundaryFromCellInterval.h
+    BoundaryFromBody.impl.h
+    BoundaryFromVoxelFile.cpp
+    BoundaryFromVoxelFile.impl.h
+    BoundaryFromBody.h
+    ScalarFieldFromBody.h
+    BoundaryFromVoxelFile.h
+    ScalarFieldFromBody.impl.h
+    ScalarFieldFromGrayScaleImage.h
+    ScalarFieldFromGrayScaleImage.cpp
+    ScalarFieldFromCellInterval.h
+    BoundaryFromImage.h
+    InitializationManager.h
+    BoundaryFromDomainBorder.impl.h
+    BoundaryFromDomainBorder.h
+    BoundaryFromImage.impl.h
+    Initializer.h
+    OverlapFieldFromBody.h
+    BoundarySetter.h
+    ScalarFieldFromCellInterval.impl.h
+    BoundaryFromCellInterval.impl.h
+    BoundarySetterFlagFieldSpecialization.h
+    InitializationManager.cpp
+    OverlapFieldFromBody.cpp     
+    )
diff --git a/src/geometry/mesh/CMakeLists.txt b/src/geometry/mesh/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4979f5fac2c693fa56b791951c9a8501f3df6433
--- /dev/null
+++ b/src/geometry/mesh/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( geometry
+    PRIVATE
+    TriangleMeshComm.h
+    TriangleMeshIO.h
+    TriangleMesh.cpp
+    TriangleMesh.h
+    TriangleMeshIO.cpp     
+    )
diff --git a/src/geometry/structured/CMakeLists.txt b/src/geometry/structured/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0b2c842aab082ad24a356cced9149c77798cc344
--- /dev/null
+++ b/src/geometry/structured/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources( geometry
+    PRIVATE
+    RGBAImage.h
+    RGBAImage.cpp
+    BasicVoxelFileReader.impl.h
+    GrayScaleImage.h
+    GrayScaleImage.cpp
+    BasicVoxelFileReader.h
+    BinaryRawFile.h
+    VoxelFileReader.impl.h
+    VoxelFileReader.h
+    BinaryRawFile.cpp     
+    )
diff --git a/src/gui/BlockSliceView/CMakeLists.txt b/src/gui/BlockSliceView/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..db4cf97e443c2dfdb525f0323a3f695c08bbd69e
--- /dev/null
+++ b/src/gui/BlockSliceView/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( gui
+    PRIVATE
+    FieldDisplayAdaptor.h
+    CellView.h
+    ScalarField3DisplayAdaptor.h
+    BlockSliceView.h
+    DisplayPropertiesItem.h
+    ScalarFieldDisplayAdaptor.impl.h
+    VectorFieldDisplayAdaptor.impl.h
+    ScalarField3DisplayAdaptor.impl.h
+    ISliceChangeListener.h
+    ScalarFieldDisplayAdaptor.h
+    FlagFieldDisplayAdaptor.impl.h
+    BlockSliceView.cpp
+    FlagFieldDisplayAdaptor.h
+    DisplayAdaptor.h
+    CellView.cpp
+    VectorFieldDisplayAdaptor.h
+    DisplayPropertiesItem.cpp     
+    )
diff --git a/src/gui/BlockView3D/CMakeLists.txt b/src/gui/BlockView3D/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6806b213412d2d4586134d0d0b3c6ed67f556a5a
--- /dev/null
+++ b/src/gui/BlockView3D/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( gui
+    PRIVATE
+    BlockDisplayObject.h
+    BlockDisplayObject.cpp
+    BlockView3D.h
+    BlockView3D.cpp     
+    )
diff --git a/src/gui/BlockViewText/CMakeLists.txt b/src/gui/BlockViewText/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5625b3c5307ab8fcbcd106a2106fdcd9233529ff
--- /dev/null
+++ b/src/gui/BlockViewText/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( gui
+    PRIVATE
+    BlockViewText.h
+    BlockViewText.cpp     
+    )
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index 88a49629e903f07ad24d3af933ead85b721b380d..35765ef1b6d5b927cbea550671d016c03243f330 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -19,10 +19,6 @@
 #----------------------------------------------------------------------------------
 
 
-
-SET ( GUI_REQUIRED_MODULES core domain_decomposition blockforest field timeloop stencil )
-
-
 # Sources from the gui base directory are always added, the parts including Qt Libs
 # are marked with ifdefs
 file( GLOB gui_SOURCES   RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp   )
@@ -90,6 +86,22 @@ if( WALBERLA_ENABLE_GUI )
 endif(WALBERLA_ENABLE_GUI)
 
 
-waLBerla_add_module ( DEPENDS ${GUI_REQUIRED_MODULES} FILES ${gui_SOURCES} )
-
+add_library( gui )
+target_link_libraries( gui PUBLIC core domain_decomposition blockforest field timeloop stencil )
+target_sources( gui
+      PRIVATE
+      PropertyTree.h
+      PropertyTree.impl.h
+      PropertyTree.cpp
+      Gui.h
+      CMakeDefs.in.h
+      Gui.cpp
+      )
 
+#TODO: this needs some additional refactoring. Does not resamble the mechanism from above!
+if( WALBERLA_ENABLE_GUI )
+    add_subdirectory( MainWindow )
+    add_subdirectory( BlockViewText )
+    add_subdirectory( BlockView3D )
+    add_subdirectory( BlockSliceView )
+endif()
diff --git a/src/gui/MainWindow/CMakeLists.txt b/src/gui/MainWindow/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..738fda509bde9c6e06b0fce6eafbf18fd96d5e07
--- /dev/null
+++ b/src/gui/MainWindow/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( gui
+    PRIVATE
+    GuiUtil.h
+    BlockTreeView.cpp
+    BlockTreeView.h
+    MainWindow.h
+    MainWindow.cpp
+    GuiUtil.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/api/CMakeLists.txt b/src/gui/extern/Qt3D/api/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a73e66e354560f433471853830d06d55c3f6f13e
--- /dev/null
+++ b/src/gui/extern/Qt3D/api/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( gui
+    PRIVATE
+    qopenglfunctions.h
+    qopenglfunctions.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/arrays/CMakeLists.txt b/src/gui/extern/Qt3D/arrays/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c033759d8b50f4a764e47f5991eab486312a32c3
--- /dev/null
+++ b/src/gui/extern/Qt3D/arrays/CMakeLists.txt
@@ -0,0 +1,26 @@
+target_sources( gui
+    PRIVATE
+    qglvertexbundle.h
+    qglattributedescription.cpp
+    qcustomdataarray.h
+    qcolor4ub.cpp
+    qglattributeset.cpp
+    qglattributevalue.h
+    qglattributevalue.cpp
+    qarray.cpp
+    qvector4darray.h
+    qglattributeset.h
+    qvector3darray.h
+    qarray.h
+    qglindexbuffer.cpp
+    qglattributedescription.h
+    qglvertexbundle_p.h
+    qglvertexbundle.cpp
+    qglindexbuffer.h
+    qvector4darray.cpp
+    qcolor4ub.h
+    qvector2darray.h
+    qcustomdataarray.cpp
+    qvector2darray.cpp
+    qvector3darray.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/effects/CMakeLists.txt b/src/gui/extern/Qt3D/effects/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..988ac2c2cf4a667050147a6de32f8e8cfe9caa7e
--- /dev/null
+++ b/src/gui/extern/Qt3D/effects/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( gui
+    PRIVATE
+    qglcolladafxeffectloader.h
+    qglshaderprogrameffect.h
+    qgllittextureeffect.cpp
+    qglflatcoloreffect.cpp
+    qgllittextureeffect_p.h
+    qglflattextureeffect.cpp
+    qglcolladafxeffectloader.cpp
+    qgllitmaterialeffect_p.h
+    qgllitmaterialeffect.cpp
+    qglcolladafxeffect_p.h
+    qglflatcoloreffect_p.h
+    qglcolladafxeffect.h
+    qglcolladafxeffectfactory.h
+    qglcolladafxeffectfactory.cpp
+    qglshaderprogrameffect.cpp
+    qglflattextureeffect_p.h
+    qglcolladafxeffect.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/geometry/CMakeLists.txt b/src/gui/extern/Qt3D/geometry/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e136f7f213482d4dff30973400c81647cdde5b3b
--- /dev/null
+++ b/src/gui/extern/Qt3D/geometry/CMakeLists.txt
@@ -0,0 +1,28 @@
+target_sources( gui
+    PRIVATE
+    qlogicalvertex.h
+    qglcube.h
+    qglsphere.cpp
+    qglmaterialcollection.cpp
+    qglteapot_data_p.h
+    qglsection.cpp
+    qglbuilder_p.h
+    qgeometrydata.h
+    qglcylinder.cpp
+    qglmaterialcollection.h
+    qglteapot.h
+    qlogicalvertex.cpp
+    qgldome.cpp
+    qvector_utils_p.h
+    qgeometrydata.cpp
+    qglcube.cpp
+    qglbezierpatches.h
+    qglbezierpatches.cpp
+    qglsection_p.h
+    qglteapot.cpp
+    qglbuilder.cpp
+    qglcylinder.h
+    qglbuilder.h
+    qglsphere.h
+    qgldome.h     
+    )
diff --git a/src/gui/extern/Qt3D/global/CMakeLists.txt b/src/gui/extern/Qt3D/global/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..306a98397e299f921c07ac785c3311c41664d3f5
--- /dev/null
+++ b/src/gui/extern/Qt3D/global/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( gui
+    PRIVATE
+    qglnamespace.cpp
+    qglnamespace.h
+    qt3dglobal.h     
+    )
diff --git a/src/gui/extern/Qt3D/graphicsview/CMakeLists.txt b/src/gui/extern/Qt3D/graphicsview/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8841b70916198c0f786757a97bfd49397c0ad9cb
--- /dev/null
+++ b/src/gui/extern/Qt3D/graphicsview/CMakeLists.txt
@@ -0,0 +1,17 @@
+target_sources( gui
+    PRIVATE
+    qglgraphicsviewportitem.h
+    qgraphicsrotation3d.cpp
+    qgraphicstranslation3d.cpp
+    qgraphicstranslation3d.h
+    qgraphicsbillboardtransform.h
+    qgraphicsembedscene.h
+    qgraphicsscale3d.cpp
+    qgraphicsrotation3d.h
+    qglgraphicsviewportitem.cpp
+    qgraphicsscale3d.h
+    qgraphicstransform3d.cpp
+    qgraphicsembedscene.cpp
+    qgraphicstransform3d.h
+    qgraphicsbillboardtransform.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/materials/CMakeLists.txt b/src/gui/extern/Qt3D/materials/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..769f0e6a4ff7902b2eeddb8b0a0bb033b2de13bc
--- /dev/null
+++ b/src/gui/extern/Qt3D/materials/CMakeLists.txt
@@ -0,0 +1,12 @@
+target_sources( gui
+    PRIVATE
+    qglabstractmaterial.h
+    qgltwosidedmaterial.cpp
+    qglcolormaterial.h
+    qglcolormaterial.cpp
+    qgltwosidedmaterial.h
+    qglmaterial.h
+    qglabstractmaterial.cpp
+    qglmaterial_p.h
+    qglmaterial.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/math3d/CMakeLists.txt b/src/gui/extern/Qt3D/math3d/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c64b2a31bb0fd4f873210cc94cb85fb30e9a597f
--- /dev/null
+++ b/src/gui/extern/Qt3D/math3d/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources( gui
+    PRIVATE
+    qtriangle3d.cpp
+    qplane3d.h
+    qtriangle3d.h
+    qray3d.h
+    qbox3d.cpp
+    qbox3d.h
+    qsphere3d.h
+    qray3d.cpp
+    qplane3d.cpp
+    qsphere3d.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/painting/CMakeLists.txt b/src/gui/extern/Qt3D/painting/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..187d98cfd53a01c9861da59fb1c0ecbbf5d3daec
--- /dev/null
+++ b/src/gui/extern/Qt3D/painting/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( gui
+    PRIVATE
+    qmatrix4x4stack.h
+    qglabstracteffect.h
+    qgllightmodel.cpp
+    qmatrix4x4stack.cpp
+    qglpainter_p.h
+    qmatrix4x4stack_p.h
+    qglpickcolors.cpp
+    qglabstracteffect.cpp
+    qgllightmodel.h
+    qglabstracteffect_p.h
+    qglpickcolors_p.h
+    qglext_p.h
+    qgllightparameters.cpp
+    qgllightparameters.h
+    qglpainter.h
+    qglext.cpp
+    qglpainter.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/private/CMakeLists.txt b/src/gui/extern/Qt3D/private/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3e23d33204d63168f85a4e5c2ec140aa86abc69e
--- /dev/null
+++ b/src/gui/extern/Qt3D/private/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( gui
+    PRIVATE
+    qglextensions_p.h
+    qfactoryloader_p.h     
+    )
diff --git a/src/gui/extern/Qt3D/scene/CMakeLists.txt b/src/gui/extern/Qt3D/scene/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a71295da55c99fcfb82074f6fabbce2d82eb3bf6
--- /dev/null
+++ b/src/gui/extern/Qt3D/scene/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( gui
+    PRIVATE
+    qglscenenode_p.h
+    qglsceneformatplugin.h
+    qglscenenode.cpp
+    qglrendersequencer.cpp
+    qglabstractscene.h
+    qglrenderordercomparator.h
+    qglscenenode.h
+    qglsceneformatplugin.cpp
+    qglrenderordercomparator.cpp
+    qglrenderorder.h
+    qglrendersequencer.h
+    qglpicknode.h
+    qglpicknode.cpp
+    qglabstractscene.cpp
+    qglrenderstate.h
+    qglrenderstate.cpp
+    qglrenderorder.cpp     
+    )
diff --git a/src/gui/extern/Qt3D/surfaces/CMakeLists.txt b/src/gui/extern/Qt3D/surfaces/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7ca057784fc6c0cef3184d0397fe25e7b3cbf257
--- /dev/null
+++ b/src/gui/extern/Qt3D/surfaces/CMakeLists.txt
@@ -0,0 +1,21 @@
+target_sources( gui
+    PRIVATE
+    qgldrawbuffersurface.cpp
+    qglabstractsurface.h
+    qglpaintersurface.cpp
+    qglwidgetsurface.h
+    qglpaintersurface_p.h
+    qglsubsurface.h
+    qglframebufferobjectsurface.cpp
+    qglmaskedsurface.cpp
+    qglwidgetsurface.cpp
+    qglpixelbuffersurface.cpp
+    qglsubsurface.cpp
+    qglframebufferobjectsurface.h
+    qglcontextsurface.cpp
+    qglcontextsurface_p.h
+    qglmaskedsurface_p.h
+    qglabstractsurface.cpp
+    qgldrawbuffersurface_p.h
+    qglpixelbuffersurface.h     
+    )
diff --git a/src/gui/extern/Qt3D/textures/CMakeLists.txt b/src/gui/extern/Qt3D/textures/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..30977fdce7324f8dd02f157dc7e41fb4c51d8471
--- /dev/null
+++ b/src/gui/extern/Qt3D/textures/CMakeLists.txt
@@ -0,0 +1,14 @@
+target_sources( gui
+    PRIVATE
+    qareaallocator.cpp
+    qgltexture2d.h
+    qareaallocator.h
+    qgltexturecube.cpp
+    qgltexturecube.h
+    qgltextureutils_p.h
+    qgltexture2d_p.h
+    qgltextureutils.cpp
+    qgltexture2d.cpp
+    qglsharedresource.cpp
+    qglsharedresource_p.h     
+    )
diff --git a/src/gui/extern/Qt3D/viewing/CMakeLists.txt b/src/gui/extern/Qt3D/viewing/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b7f97f9f02d9445aacb4ec5ff91fe18d6ede20e1
--- /dev/null
+++ b/src/gui/extern/Qt3D/viewing/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( gui
+    PRIVATE
+    qglcameraanimation.h
+    qglcameraanimation.cpp
+    qglview.cpp
+    qglcamera.cpp
+    qglcamera.h
+    qglview.h     
+    )
diff --git a/src/gui/extern/QtGradientEditor/CMakeLists.txt b/src/gui/extern/QtGradientEditor/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b42e203c43078383ae97f88bb8f6612336454039
--- /dev/null
+++ b/src/gui/extern/QtGradientEditor/CMakeLists.txt
@@ -0,0 +1,27 @@
+target_sources( gui
+    PRIVATE
+    qtcolorbutton.h
+    qtcolorline.h
+    qtcolorline.cpp
+    qtgradientviewdialog.cpp
+    qtgradientstopsmodel.cpp
+    qtgradientutils.cpp
+    qtgradientview.cpp
+    qtgradientmanager.h
+    qtgradientviewdialog.h
+    qtgradientwidget.cpp
+    qtgradientstopscontroller.h
+    qtgradientdialog.cpp
+    qtgradientstopswidget.h
+    qtcolorbutton.cpp
+    qtgradientstopswidget.cpp
+    qtgradientstopsmodel.h
+    qtgradientmanager.cpp
+    qtgradientview.h
+    qtgradientstopscontroller.cpp
+    qtgradienteditor.cpp
+    qtgradientdialog.h
+    qtgradientwidget.h
+    qtgradienteditor.h
+    qtgradientutils.h     
+    )
diff --git a/src/lbm/CMakeLists.txt b/src/lbm/CMakeLists.txt
index afc14c730327734463d60700d66c7434156d3b14..511aafa84a04ca44385c22acba0cd02891640cc3 100644
--- a/src/lbm/CMakeLists.txt
+++ b/src/lbm/CMakeLists.txt
@@ -4,19 +4,47 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS blockforest
-                             boundary
-                             communication
-                             core
-                             domain_decomposition
-                             field
-                             geometry
-                             python_coupling
-                             gui
-                             stencil
-                             timeloop
-                             vtk )
-                         
+add_library( lbm )
+target_link_libraries( lbm
+      PUBLIC
+      blockforest
+      boundary
+      communication
+      core
+      domain_decomposition
+      field
+      geometry
+      gui
+      stencil
+      timeloop
+      vtk
+      )
+target_sources( lbm
+      PRIVATE
+      PerformanceEvaluation.h
+      BlockForestEvaluation.h
+      IntelCompilerOptimization.h
+      PerformanceLogger.h
+      MassEvaluation.h
+      )
+
+add_subdirectory( vtk )
+add_subdirectory( blockforest )
+add_subdirectory( sweeps )
+add_subdirectory( communication )
+add_subdirectory( field )
+add_subdirectory( refinement )
+add_subdirectory( gui )
+add_subdirectory( boundary )
+add_subdirectory( mrt )
+add_subdirectory( evaluations )
+add_subdirectory( srt )
+add_subdirectory( geometry )
+add_subdirectory( trt )
+add_subdirectory( cumulant )
+add_subdirectory( lattice_model )
+add_subdirectory( inplace_streaming )
+
 ###################################################################################################
 
  
\ No newline at end of file
diff --git a/src/lbm/blockforest/CMakeLists.txt b/src/lbm/blockforest/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2fa5d1378bce5fb4bc57f09a0f66426528094ae6
--- /dev/null
+++ b/src/lbm/blockforest/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( lbm
+    PRIVATE
+    PostProcessing.h     
+    )
diff --git a/src/lbm/boundary/CMakeLists.txt b/src/lbm/boundary/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9916174cf0736872d3339e0382c783f4325fb9a6
--- /dev/null
+++ b/src/lbm/boundary/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( lbm
+    PRIVATE
+    SimplePressure.h
+    SimpleUBB.h
+    FreeSlip.h
+    SimplePAB.h
+    ParserUBB.h
+    DynamicUBB.h
+    Pressure.h
+    DiffusionDirichlet.h
+    Outlet.h
+    NoDiffusion.h
+    SimpleVelocityBoundary.h
+    FreeDiffusion.h
+    SimpleDiffusionDirichlet.h
+    Curved.h
+    NoSlip.h
+    VelocityBoundary.h
+    UBB.h     
+    )
diff --git a/src/lbm/boundary/factories/CMakeLists.txt b/src/lbm/boundary/factories/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f15a18fd203ea20c8736cf5566ee29616c710597
--- /dev/null
+++ b/src/lbm/boundary/factories/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( lbm
+    PRIVATE
+    DefaultDiffusionBoundaryHandling.h
+    DefaultBoundaryHandling.h
+    DefaultBoundaryHandlingCollection.h
+    ExtendedBoundaryHandlingFactory.h     
+    )
diff --git a/src/lbm/communication/CMakeLists.txt b/src/lbm/communication/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..daac664f2d929c8a106f83b9cb85c1608e425976
--- /dev/null
+++ b/src/lbm/communication/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( lbm
+    PRIVATE
+    PdfFieldMPIDatatypeInfo.h
+    SparsePdfFieldPackInfo.h
+    PdfFieldPackInfo.h     
+    )
diff --git a/src/lbm/cumulant/CMakeLists.txt b/src/lbm/cumulant/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f04767f95fc231cc4431cd7fb34a5a67a58e5f01
--- /dev/null
+++ b/src/lbm/cumulant/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( lbm
+    PRIVATE
+    CellwiseSweep.impl.h     
+    )
diff --git a/src/lbm/evaluations/CMakeLists.txt b/src/lbm/evaluations/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1e014fb72a9cfa5777058f80d9c65c530ff851c5
--- /dev/null
+++ b/src/lbm/evaluations/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( lbm
+    PRIVATE
+    Permeability.impl.h
+    Permeability.h     
+    )
diff --git a/src/lbm/field/CMakeLists.txt b/src/lbm/field/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..706196f4da0787792c1740faf98b71a0ae6890f1
--- /dev/null
+++ b/src/lbm/field/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( lbm
+    PRIVATE
+    MomentumDensity.h
+    MacroscopicValueCalculation.h
+    Equilibrium.h
+    DensityAndVelocity.h
+    QCriterion.h
+    DensityVelocityCallback.h
+    AddToStorage.h
+    QCriterionFieldWriter.h
+    VelocityFieldWriter.h
+    ShearRate.h
+    PdfField.h
+    Density.h
+    Vorticity.h
+    DensityAndMomentumDensity.h
+    Adaptors.h
+    PressureTensor.h     
+    )
+add_subdirectory( initializer )
\ No newline at end of file
diff --git a/src/lbm/field/initializer/CMakeLists.txt b/src/lbm/field/initializer/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4404f566cee2a51c6e1ba3718e853bafb39c75b5
--- /dev/null
+++ b/src/lbm/field/initializer/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( lbm
+    PRIVATE
+    PdfFieldInitializer.h
+    ExprSystemInitFunction.h
+    PdfFieldInitializer.impl.h
+    ExprSystemInitFunction.cpp     
+    )
diff --git a/src/lbm/geometry/CMakeLists.txt b/src/lbm/geometry/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a5c3af8d693905798f29aea67480af7241db829f
--- /dev/null
+++ b/src/lbm/geometry/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( lbm
+    PRIVATE
+    IntersectionRatio.h
+    IntersectionRatio.impl.h
+    IntersectionRatio.cpp     
+    )
diff --git a/src/lbm/geometry/initializer/CMakeLists.txt b/src/lbm/geometry/initializer/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4dcc7bc2fef01465b6117a518e4f042ce2edbd58
--- /dev/null
+++ b/src/lbm/geometry/initializer/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( lbm
+    PRIVATE
+    PoiseuilleInitializer.impl.h
+    PoiseuilleInitializer.h     
+    )
diff --git a/src/lbm/gui/CMakeLists.txt b/src/lbm/gui/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5ab3c5179f6a0d90d90f51e2bf3249c6058965ba
--- /dev/null
+++ b/src/lbm/gui/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( lbm
+    PRIVATE
+    Connection.h
+    PdfFieldDisplayAdaptor.impl.h
+    PdfFieldDisplayAdaptor.h     
+    )
diff --git a/src/lbm/inplace_streaming/CMakeLists.txt b/src/lbm/inplace_streaming/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6784a9a1a9b686897764debbd631c3b42a05bda5
--- /dev/null
+++ b/src/lbm/inplace_streaming/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( lbm
+    PRIVATE
+    TimestepTracker.h     
+    )
diff --git a/src/lbm/lattice_model/CMakeLists.txt b/src/lbm/lattice_model/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..58f62308c907bc18b4c37887e0e8b76cf7771114
--- /dev/null
+++ b/src/lbm/lattice_model/CMakeLists.txt
@@ -0,0 +1,14 @@
+target_sources( lbm
+    PRIVATE
+    CollisionModel.cpp
+    D3Q27.h
+    CollisionModel.h
+    LatticeModelBase.h
+    ForceModel.h
+    D3Q19.h
+    EquilibriumDistribution.h
+    D3Q15.h
+    NeighborsStencil.h
+    D2Q9.h
+    SmagorinskyLES.h     
+    )
diff --git a/src/lbm/mrt/CMakeLists.txt b/src/lbm/mrt/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6dc8a16b5e40cb9d0a807441e945dbd67d83d54f
--- /dev/null
+++ b/src/lbm/mrt/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( lbm
+    PRIVATE
+    SplitPureSweep.impl.h
+    SplitSweep.impl.h
+    CellwiseSweep.impl.h     
+    )
diff --git a/src/lbm/mrt/cell_operations/CMakeLists.txt b/src/lbm/mrt/cell_operations/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d5d533f233ef47fe79a2598bc77639217ea5d34d
--- /dev/null
+++ b/src/lbm/mrt/cell_operations/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( lbm
+    PRIVATE
+    DefaultCellOperation.impl.h     
+    )
diff --git a/src/lbm/refinement/CMakeLists.txt b/src/lbm/refinement/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6aff346986b0ea8a5f7ebf41d34ec9c0b061c6a9
--- /dev/null
+++ b/src/lbm/refinement/CMakeLists.txt
@@ -0,0 +1,14 @@
+target_sources( lbm
+    PRIVATE
+    TimeTracker.h
+    TimeStep.h
+    LinearExplosion.h
+    CurlBasedLevelDetermination.h
+    EqualLevelBorderStreamCorrection.h
+    TimeStepPdfPackInfo.h
+    PdfFieldPackInfo.h
+    BoundarySetup.h
+    VorticityBasedLevelDetermination.h
+    RefinementFunctorWrapper.h
+    PdfFieldSyncPackInfo.h     
+    )
diff --git a/src/lbm/srt/CMakeLists.txt b/src/lbm/srt/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e95415ab92683e312685788fff35f42b6da4f408
--- /dev/null
+++ b/src/lbm/srt/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( lbm
+    PRIVATE
+    AdvectionDiffusionSweep.impl.h
+    SplitPureSweep.impl.h
+    SplitSweep.impl.h
+    CellwiseSweep.impl.h     
+    )
diff --git a/src/lbm/srt/cell_operations/CMakeLists.txt b/src/lbm/srt/cell_operations/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6a8de6a5b6cc9a3d59c5d01dde73d71fbd030a42
--- /dev/null
+++ b/src/lbm/srt/cell_operations/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( lbm
+    PRIVATE
+    AdvectionDiffusionCellOperation.impl.h
+    DefaultCellOperation.impl.h     
+    )
diff --git a/src/lbm/sweeps/CMakeLists.txt b/src/lbm/sweeps/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3cf1a982fb3b95a3f248842043988a318dfd69ba
--- /dev/null
+++ b/src/lbm/sweeps/CMakeLists.txt
@@ -0,0 +1,12 @@
+target_sources( lbm
+    PRIVATE
+    FlagFieldSweepBase.h
+    SplitPureSweep.h
+    SweepBase.h
+    SweepWrappers.h
+    StreamPull.h
+    CellwiseSweep.h
+    ActiveCellSweep.h
+    Streaming.h
+    SplitSweep.h     
+    )
diff --git a/src/lbm/sweeps/cell_operations/CMakeLists.txt b/src/lbm/sweeps/cell_operations/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3875dd5abdb21ffb94f9c980b37748f5c73c1942
--- /dev/null
+++ b/src/lbm/sweeps/cell_operations/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( lbm
+    PRIVATE
+    DefaultCellOperation.h
+    AdvectionDiffusionCellOperation.h     
+    )
diff --git a/src/lbm/trt/CMakeLists.txt b/src/lbm/trt/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6dc8a16b5e40cb9d0a807441e945dbd67d83d54f
--- /dev/null
+++ b/src/lbm/trt/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( lbm
+    PRIVATE
+    SplitPureSweep.impl.h
+    SplitSweep.impl.h
+    CellwiseSweep.impl.h     
+    )
diff --git a/src/lbm/trt/cell_operations/CMakeLists.txt b/src/lbm/trt/cell_operations/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d5d533f233ef47fe79a2598bc77639217ea5d34d
--- /dev/null
+++ b/src/lbm/trt/cell_operations/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( lbm
+    PRIVATE
+    DefaultCellOperation.impl.h     
+    )
diff --git a/src/lbm/vtk/CMakeLists.txt b/src/lbm/vtk/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ad2713023e1aac8f513e4be576c458294cc0c9aa
--- /dev/null
+++ b/src/lbm/vtk/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources( lbm
+    PRIVATE
+    QCriterion.h
+    NonEquilibrium.h
+    CurlMagnitude.h
+    Density.h
+    Velocity.h
+    Vorticity.h
+    VTKOutput.h
+    PressureTensor.h
+    QCriterionCellFilter.h
+    VelocityCellFilter.h     
+    )
diff --git a/src/lbm_mesapd_coupling/CMakeLists.txt b/src/lbm_mesapd_coupling/CMakeLists.txt
index 1f7af49cecad9842836ab3c0e31ee65219412ea1..76f78cca8d6e4ea1613ef908f083a55a423d187e 100644
--- a/src/lbm_mesapd_coupling/CMakeLists.txt
+++ b/src/lbm_mesapd_coupling/CMakeLists.txt
@@ -5,4 +5,14 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS boundary blockforest core domain_decomposition field lbm mesa_pd stencil )
+add_library( lbm_mesapd_coupling )
+target_link_libraries( lbm_mesapd_coupling PUBLIC boundary blockforest core domain_decomposition field lbm mesa_pd stencil )
+target_sources( lbm_mesapd_coupling
+      PRIVATE
+      DataTypes.h
+      )
+
+add_subdirectory( amr )
+add_subdirectory( momentum_exchange_method )
+add_subdirectory( utility )
+add_subdirectory( mapping )
\ No newline at end of file
diff --git a/src/lbm_mesapd_coupling/amr/CMakeLists.txt b/src/lbm_mesapd_coupling/amr/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e88039b3e21e907176d8e5e2a61ce7d11631bd36
--- /dev/null
+++ b/src/lbm_mesapd_coupling/amr/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    BlockInfo.h
+    InfoCollection.h     
+    )
+
+add_subdirectory( level_determination )
+add_subdirectory( weight_assignment )
\ No newline at end of file
diff --git a/src/lbm_mesapd_coupling/amr/level_determination/CMakeLists.txt b/src/lbm_mesapd_coupling/amr/level_determination/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b6177fb27c2cb4b376c8642aed70019c8f8d84e8
--- /dev/null
+++ b/src/lbm_mesapd_coupling/amr/level_determination/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    ParticlePresenceLevelDetermination.h     
+    )
diff --git a/src/lbm_mesapd_coupling/amr/weight_assignment/CMakeLists.txt b/src/lbm_mesapd_coupling/amr/weight_assignment/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b13d50d4edf80d0ac939ba059dfd0d58be5e602b
--- /dev/null
+++ b/src/lbm_mesapd_coupling/amr/weight_assignment/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    WeightAssignmentFunctor.h
+    MetisAssignmentFunctor.cpp
+    MetisAssignmentFunctor.h
+    WeightEvaluationFunctions.h     
+    )
diff --git a/src/lbm_mesapd_coupling/mapping/CMakeLists.txt b/src/lbm_mesapd_coupling/mapping/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..04f7fd66d1e8d180c1862fb30385cf4b757131a8
--- /dev/null
+++ b/src/lbm_mesapd_coupling/mapping/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    ParticleMapping.h
+    ParticleBoundingBox.h     
+    )
diff --git a/src/lbm_mesapd_coupling/momentum_exchange_method/CMakeLists.txt b/src/lbm_mesapd_coupling/momentum_exchange_method/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e0c1a0bd3a1828cc74869951bede51cad674deaa
--- /dev/null
+++ b/src/lbm_mesapd_coupling/momentum_exchange_method/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    MovingParticleMapping.h     
+    )
diff --git a/src/lbm_mesapd_coupling/momentum_exchange_method/boundary/CMakeLists.txt b/src/lbm_mesapd_coupling/momentum_exchange_method/boundary/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..092fd13c0b5efa0b62a757786fb61a9a54fdb1c4
--- /dev/null
+++ b/src/lbm_mesapd_coupling/momentum_exchange_method/boundary/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    CurvedLinear.h
+    SimpleBB.h     
+    )
diff --git a/src/lbm_mesapd_coupling/momentum_exchange_method/reconstruction/CMakeLists.txt b/src/lbm_mesapd_coupling/momentum_exchange_method/reconstruction/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a5b4e0b9b1da2b81d1b156042ac60d7e52965992
--- /dev/null
+++ b/src/lbm_mesapd_coupling/momentum_exchange_method/reconstruction/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    PdfReconstructionManager.h
+    ExtrapolationDirectionFinder.h
+    Reconstructor.h     
+    )
diff --git a/src/lbm_mesapd_coupling/utility/CMakeLists.txt b/src/lbm_mesapd_coupling/utility/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..36f682d8efed81b54eae0fb662067e25786d26f4
--- /dev/null
+++ b/src/lbm_mesapd_coupling/utility/CMakeLists.txt
@@ -0,0 +1,16 @@
+target_sources( lbm_mesapd_coupling
+    PRIVATE
+    SubCyclingManager.h
+    AddHydrodynamicInteractionKernel.h
+    AddAccelerationOnParticlesKernel.h
+    SubCyclingManager.cpp
+    ParticleFunctions.h
+    ResetHydrodynamicForceTorqueKernel.h
+    ParticleSelector.h
+    LubricationCorrectionKernel.h
+    AddForceOnParticlesKernel.h
+    OmegaBulkAdaption.h
+    AverageHydrodynamicForceTorqueKernel.h
+    InspectionProbe.h
+    InitializeHydrodynamicForceTorqueForAveragingKernel.h     
+    )
diff --git a/src/mesa_pd/CMakeLists.txt b/src/mesa_pd/CMakeLists.txt
index 6fdb08da0a7bebc3c83fc71944fa74af7cdfc613..19eef8bf9d7e9858eb03113dba4c20c02782dda5 100644
--- a/src/mesa_pd/CMakeLists.txt
+++ b/src/mesa_pd/CMakeLists.txt
@@ -5,9 +5,19 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS blockforest core stencil vtk OPTIONAL_DEPENDS mesh_common )
+add_library( mesa_pd )
+target_link_libraries( mesa_pd PUBLIC blockforest core stencil vtk )
+add_subdirectory( collision_detection )
+add_subdirectory( common )
+add_subdirectory( data )
+add_subdirectory( domain )
+add_subdirectory( kernel )
+add_subdirectory( mpi )
+add_subdirectory( sorting )
+add_subdirectory( vtk )
 if(OPENMESH_CORE_FOUND)
     set( WALBERLA_MESAPD_CONVEX_POLYHEDRON_AVAILABLE ON CACHE INTERNAL "")
+    target_link_libraries( mesa_pd PUBLIC mesh_common )
     message( STATUS "MESA-PD: ConvexPolyhedron shape is available (OpenMesh dependency satisfied)" )
 else()
     set( WALBERLA_MESAPD_CONVEX_POLYHEDRON_AVAILABLE OFF CACHE INTERNAL "")
diff --git a/src/mesa_pd/collision_detection/CMakeLists.txt b/src/mesa_pd/collision_detection/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0f971b71a5ef2a655002793a088db64b27222fa4
--- /dev/null
+++ b/src/mesa_pd/collision_detection/CMakeLists.txt
@@ -0,0 +1,12 @@
+target_sources( mesa_pd
+    PRIVATE
+    AnalyticCollisionFunctions.h
+    GJK.h
+    GJK.cpp
+    GeneralContactDetection.h
+    Support.h
+    EPA.h
+    BroadPhase.h
+    EPA.cpp
+    AnalyticContactDetection.h     
+    )
diff --git a/src/mesa_pd/common/CMakeLists.txt b/src/mesa_pd/common/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..db4a239b7094716269975ab555944d851bc79d02
--- /dev/null
+++ b/src/mesa_pd/common/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( mesa_pd
+    PRIVATE
+    RayParticleIntersection.h
+    Contains.h
+    ParticleFunctions.h
+    AABBConversion.h     
+    )
diff --git a/src/mesa_pd/data/CMakeLists.txt b/src/mesa_pd/data/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..01e85915b46d1d0394421a5aac642ba7a4862125
--- /dev/null
+++ b/src/mesa_pd/data/CMakeLists.txt
@@ -0,0 +1,18 @@
+target_sources( mesa_pd
+    PRIVATE
+    ParticleStorage.h
+    IAccessor.h
+    LinkedCells.h
+    DataTypes.h
+    SparseLinkedCells.h
+    Flags.h
+    ContactHistory.h
+    ShapeStorage.h
+    STLOverloads.h
+    ParticleAccessorWithShape.h
+    ContactStorage.h
+    IContactAccessor.h
+    HashGrids.h
+    ParticleAccessor.h
+    ContactAccessor.h     
+    )
diff --git a/src/mesa_pd/data/shape/CMakeLists.txt b/src/mesa_pd/data/shape/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..da0f608796dbe7215f8d7eec482fb88f3241e64f
--- /dev/null
+++ b/src/mesa_pd/data/shape/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources( mesa_pd
+    PRIVATE
+    CylindricalBoundary.h
+    BaseShape.h
+    Ellipsoid.h
+    Sphere.h
+    ConvexPolyhedron.h
+    HalfSpace.h
+    Box.h     
+    )
diff --git a/src/mesa_pd/domain/CMakeLists.txt b/src/mesa_pd/domain/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eaac7e4cdb1b059523f257cdb1463cda2ca7085d
--- /dev/null
+++ b/src/mesa_pd/domain/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources( mesa_pd
+    PRIVATE
+    BlockForestDomain.cpp
+    IDomain.h
+    InfiniteDomain.h
+    BlockForestDataHandling.h
+    InfoCollection.h
+    BlockForestDataHandling.cpp
+    BlockForestDomain.h     
+    )
diff --git a/src/mesa_pd/kernel/CMakeLists.txt b/src/mesa_pd/kernel/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..884aeedeffc3c7954f246430e43b5b4bdfea50f7
--- /dev/null
+++ b/src/mesa_pd/kernel/CMakeLists.txt
@@ -0,0 +1,26 @@
+target_sources( mesa_pd
+    PRIVATE
+    NonLinearSpringDashpot.h
+    SingleCast.h
+    InitContactsForHCSITS.h
+    SpringDashpotSpring.h
+    VelocityVerlet.h
+    ForceLJ.h
+    HCSITSRelaxationStep.h
+    TemperatureIntegration.h
+    PFCDamping.h
+    HeatConduction.h
+    ExplicitEulerWithShape.h
+    AssocToBlock.h
+    InsertParticleIntoLinkedCells.h
+    ExplicitEuler.h
+    DoubleCast.h
+    ParticleSelector.h
+    InsertParticleIntoSparseLinkedCells.h
+    IntegrateParticlesHCSITS.h
+    DetectAndStoreContacts.h
+    SpringDashpot.h
+    LinearSpringDashpot.h
+    InitParticlesForHCSITS.h
+    SemiImplicitEuler.h     
+    )
diff --git a/src/mesa_pd/kernel/cnt/CMakeLists.txt b/src/mesa_pd/kernel/cnt/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..db078539bccfbd46b73670ff94fb2db833e5efd8
--- /dev/null
+++ b/src/mesa_pd/kernel/cnt/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources( mesa_pd
+    PRIVATE
+    IsotropicVDWContact.h
+    VBondContact.h
+    Parameters.h
+    AnisotropicVDWContact.h
+    IntegratedVDWContact.h
+    ViscousDamping.h
+    WallContact.h     
+    )
diff --git a/src/mesa_pd/mpi/CMakeLists.txt b/src/mesa_pd/mpi/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..04e543f8a2a52a86ffe4a1201525910fe0895683
--- /dev/null
+++ b/src/mesa_pd/mpi/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( mesa_pd
+    PRIVATE
+    SyncNextNeighborsBlockForest.h
+    BroadcastProperty.h
+    SyncNextNeighborsNoGhosts.cpp
+    SyncNextNeighbors.h
+    ReduceContactHistory.h
+    ShapePackUnpack.h
+    ContactFilter.h
+    ReduceProperty.h
+    SyncGhostOwners.h
+    SyncGhostOwners.cpp
+    ClearNextNeighborSync.h
+    RemoveAndNotify.cpp
+    SyncNextNeighborsNoGhosts.h
+    SyncNextNeighborsBlockForest.cpp
+    RemoveAndNotify.h
+    SyncNextNeighbors.cpp
+    ClearGhostOwnerSync.h     
+    )
diff --git a/src/mesa_pd/mpi/notifications/CMakeLists.txt b/src/mesa_pd/mpi/notifications/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c50238b775c0bc00aa6986c8c471ab237ba296f0
--- /dev/null
+++ b/src/mesa_pd/mpi/notifications/CMakeLists.txt
@@ -0,0 +1,21 @@
+target_sources( mesa_pd
+    PRIVATE
+    ParticleGhostCopyNotification.h
+    ParticleRemovalNotification.h
+    ParticleRemovalInformationNotification.h
+    HeatFluxNotification.h
+    VelocityUpdateNotification.h
+    ParticleRemoteMigrationNotification.h
+    ParseMessage.h
+    PackNotification.h
+    VelocityCorrectionNotification.h
+    ParticleCopyNotification.h
+    NewGhostParticleNotification.h
+    ParticleUpdateNotification.h
+    ContactHistoryNotification.h
+    ParticleMigrationNotification.h
+    HydrodynamicForceTorqueNotification.h
+    reset.h
+    ForceTorqueNotification.h
+    NotificationType.h     
+    )
diff --git a/src/mesa_pd/sorting/CMakeLists.txt b/src/mesa_pd/sorting/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4b6badef860b9b133b38b6907553826555a6121c
--- /dev/null
+++ b/src/mesa_pd/sorting/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( mesa_pd
+    PRIVATE
+    LinearizedCompareFunctor.h
+    HilbertCompareFunctor.h
+    LinearizedCompareFunctor.cpp
+    HilbertCompareFunctor.cpp     
+    )
diff --git a/src/mesa_pd/vtk/CMakeLists.txt b/src/mesa_pd/vtk/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ffda945a2195ddc9439994c303814efb54d5bf82
--- /dev/null
+++ b/src/mesa_pd/vtk/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( mesa_pd
+    PRIVATE
+    TensorGlyph.h
+    TensorGlyph.cpp
+    ParticleVtkOutput.cpp
+    OutputSelector.h
+    WriteOutput.h
+    ParticleVtkOutput.h     
+    )
diff --git a/src/mesa_pd/vtk/ConvexPolyhedron/CMakeLists.txt b/src/mesa_pd/vtk/ConvexPolyhedron/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a6a8cf4a0e37ed65d36ca82d5c6be9c7938e8d4f
--- /dev/null
+++ b/src/mesa_pd/vtk/ConvexPolyhedron/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( mesa_pd
+    PRIVATE
+    Types.h
+    MeshParticleVTKOutput.h     
+    )
diff --git a/src/mesa_pd/vtk/ConvexPolyhedron/data_sources/CMakeLists.txt b/src/mesa_pd/vtk/ConvexPolyhedron/data_sources/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..367bb6ea8d75fa261a9149c0a555a30a956c08f0
--- /dev/null
+++ b/src/mesa_pd/vtk/ConvexPolyhedron/data_sources/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( mesa_pd
+    PRIVATE
+    OutputSelectorFaceDataSource.h
+    FaceDataSource.h
+    SurfaceVelocityVertexDataSource.h
+    VertexDataSource.h
+    DataSourceAdapters.h
+    OutputSelectorVertexDataSource.h     
+    )
diff --git a/src/mesa_pd/vtk/ConvexPolyhedron/tesselation/CMakeLists.txt b/src/mesa_pd/vtk/ConvexPolyhedron/tesselation/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cdf2a2e4c51830df29cf42df955703216edd0c4f
--- /dev/null
+++ b/src/mesa_pd/vtk/ConvexPolyhedron/tesselation/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( mesa_pd
+    PRIVATE
+    ConvexPolyhedronTesselation.h     
+    )
diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt
index e53281ee904ac96c4570f5ae73ba4df065300fa2..9a47783b0b6d3ff79a36ef7ed95c04dead7403d1 100644
--- a/src/mesh/CMakeLists.txt
+++ b/src/mesh/CMakeLists.txt
@@ -4,8 +4,18 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS blockforest boundary core domain_decomposition
-                             python_coupling field geometry pe stencil mesh_common
-                     BUILD_ONLY_IF_FOUND OpenMesh)
+add_library( mesh )
+target_link_libraries( mesh PUBLIC blockforest boundary core domain_decomposition field geometry pe stencil mesh_common )
+if ( OPENMESH_CORE_FOUND )
+   target_link_directories( mesh PUBLIC OpenMeshCore)
+endif()
+target_sources( mesh
+      PRIVATE
+      MeshConversion.h
+      )
+
+add_subdirectory( blockforest )
+add_subdirectory( pe )
+add_subdirectory( boundary )
 
 ###################################################################################################
diff --git a/src/mesh/blockforest/CMakeLists.txt b/src/mesh/blockforest/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..166d1ee94852532ec58ef260c2724c8e14fa3ba4
--- /dev/null
+++ b/src/mesh/blockforest/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( mesh
+    PRIVATE
+    RefinementSelection.h
+    BlockForestInitialization.cpp
+    BlockWorkloadMemory.h
+    BlockExclusion.h
+    BlockForestInitialization.h     
+    )
diff --git a/src/mesh/boundary/CMakeLists.txt b/src/mesh/boundary/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..44f12efd6be21ae820c035d6cc7bb6db252454c4
--- /dev/null
+++ b/src/mesh/boundary/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources( mesh
+    PRIVATE
+    BoundarySetup.cpp
+    ColorToBoundaryMapper.h
+    BoundaryLocationFunction.h
+    BoundaryLocation.h
+    BoundaryUIDFaceDataSource.h
+    BoundarySetup.h
+    BoundaryInfo.h     
+    )
diff --git a/src/mesh/pe/CMakeLists.txt b/src/mesh/pe/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b6cab535d34d750a24e4bc3844f28878996624b6
--- /dev/null
+++ b/src/mesh/pe/CMakeLists.txt
@@ -0,0 +1,10 @@
+target_sources( mesh
+    PRIVATE
+    DefaultTesselation.h
+    Types.h     
+    )
+add_subdirectory( communication )
+add_subdirectory( raytracing )
+add_subdirectory( rigid_body )
+add_subdirectory( tesselation )
+add_subdirectory( vtk )
\ No newline at end of file
diff --git a/src/mesh/pe/communication/CMakeLists.txt b/src/mesh/pe/communication/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f84235cb9d736c5f93a37bffc1e0b4c4418c7cd8
--- /dev/null
+++ b/src/mesh/pe/communication/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( mesh
+    PRIVATE
+    ConvexPolyhedron.cpp
+    ConvexPolyhedron.h     
+    )
diff --git a/src/mesh/pe/raytracing/CMakeLists.txt b/src/mesh/pe/raytracing/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..67ee47c9f4a68317d044e168219051cc1be60307
--- /dev/null
+++ b/src/mesh/pe/raytracing/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( mesh
+    PRIVATE
+    Intersects.h     
+    )
diff --git a/src/mesh/pe/rigid_body/CMakeLists.txt b/src/mesh/pe/rigid_body/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f8413ca679229e23f2391f0bd6863d83ea30fa88
--- /dev/null
+++ b/src/mesh/pe/rigid_body/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( mesh
+    PRIVATE
+    ConvexPolyhedronFactory.h
+    ConvexPolyhedron.cpp
+    ConvexPolyhedron.h
+    ConvexPolyhedronFactory.cpp     
+    )
diff --git a/src/mesh/pe/tesselation/CMakeLists.txt b/src/mesh/pe/tesselation/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..437b5ad9d1568b50361f383edb0f8312aa2ba66e
--- /dev/null
+++ b/src/mesh/pe/tesselation/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( mesh
+    PRIVATE
+    Sphere.h
+    ConvexPolyhedron.h
+    Box.h     
+    )
diff --git a/src/mesh/pe/vtk/CMakeLists.txt b/src/mesh/pe/vtk/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..ed2b8bfe3b4bea33fe6d96b4a5e804b4bbb4f6d8
--- /dev/null
+++ b/src/mesh/pe/vtk/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( mesh
+    PRIVATE
+    CommonDataSources.h
+    PeVTKMeshWriter.h     
+    )
diff --git a/src/mesh_common/CMakeLists.txt b/src/mesh_common/CMakeLists.txt
index de3b9e33c2fc793fb0d68066aa4ff93a61376371..184b140eb75aa5f00961ffceda11d7313c37fd7a 100644
--- a/src/mesh_common/CMakeLists.txt
+++ b/src/mesh_common/CMakeLists.txt
@@ -4,6 +4,25 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core vtk BUILD_ONLY_IF_FOUND OpenMesh )
+add_library( mesh_common INTERFACE )
+target_link_libraries( mesh_common INTERFACE core vtk )
+if ( OPENMESH_CORE_FOUND )
+   target_link_directories( mesh_common INTERFACE OpenMeshCore)
+endif()
+target_sources( mesh_common
+      INTERFACE
+      DistanceFunction.h
+      QHull.h
+      MeshOperations.h
+      MeshIO.h
+      DistanceComputations.h
+      TriangleMeshes.h
+      MatrixVectorOperations.h
+      OpenMeshBufferTypeExtensions.h
+      PolyMeshes.h
+      )
+
+add_subdirectory( vtk )
+add_subdirectory( distance_octree )
 
 ###################################################################################################
diff --git a/src/mesh_common/distance_octree/CMakeLists.txt b/src/mesh_common/distance_octree/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8146a0ed93a4b4eec3d0caec5daa8e67d767c338
--- /dev/null
+++ b/src/mesh_common/distance_octree/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( mesh_common
+    INTERFACE
+    BranchNode.h
+    LeafNode.h
+    Node.h
+    DistanceOctree.h     
+    )
diff --git a/src/mesh_common/vtk/CMakeLists.txt b/src/mesh_common/vtk/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..570e32c99c43346361a152a5c4e069f9273b115f
--- /dev/null
+++ b/src/mesh_common/vtk/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( mesh_common
+    INTERFACE
+    CommonFilters.h
+    VTKMeshWriter.h
+    DistributedVTKMeshWriter.h
+    CommonDataSources.h     
+    )
diff --git a/src/pde/CMakeLists.txt b/src/pde/CMakeLists.txt
index 0b013dda8b65a581f5f5b99e300f84b1f2a0924e..33005a00678e66a07d5e607a236727404cc5320d 100644
--- a/src/pde/CMakeLists.txt
+++ b/src/pde/CMakeLists.txt
@@ -4,11 +4,17 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS blockforest
-                             boundary 
-                             core
-                             domain_decomposition
-                             field
-                             stencil )
+add_library( pde )
+target_link_libraries( pde PUBLIC blockforest boundary core domain_decomposition field stencil )
+target_sources( pde
+      PRIVATE
+      ConditionalResidualNorm.h
+      ResidualNormStencilField.h
+      ResidualNorm.h
+      )
+
+add_subdirectory( sweeps )
+add_subdirectory( boundary )
+add_subdirectory( iterations )
                          
 ###################################################################################################
diff --git a/src/pde/boundary/CMakeLists.txt b/src/pde/boundary/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7f5861ef04c789f26d6a8703f08f4cf745988c48
--- /dev/null
+++ b/src/pde/boundary/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( pde
+    PRIVATE
+    Dirichlet_withDx.h
+    Dirichlet.h
+    Neumann.h     
+    )
diff --git a/src/pde/iterations/CMakeLists.txt b/src/pde/iterations/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3356f0cb23433188f514cfe46c928d2094c90ce5
--- /dev/null
+++ b/src/pde/iterations/CMakeLists.txt
@@ -0,0 +1,11 @@
+target_sources( pde
+    PRIVATE
+    JacobiIteration.h
+    JacobiIteration.cpp
+    RBGSIteration.h
+    CGFixedStencilIteration.h
+    VCycles.h
+    VCycles.impl.h
+    RBGSIteration.cpp
+    CGIteration.h     
+    )
diff --git a/src/pde/sweeps/CMakeLists.txt b/src/pde/sweeps/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2f6d4893d713b2f0b64e79b3ceebc83bb647e424
--- /dev/null
+++ b/src/pde/sweeps/CMakeLists.txt
@@ -0,0 +1,15 @@
+target_sources( pde
+    PRIVATE
+    Multigrid.impl.h
+    StencilSweepBase.h
+    SweepBase.h
+    RBGS.h
+    RBGSFixedStencil.h
+    SOR.h
+    SweepBase.cpp
+    SORFixedStencil.h
+    Jacobi.h
+    StencilFieldSweepBase.h
+    Multigrid.h
+    JacobiFixedStencil.h     
+    )
diff --git a/src/pe/CMakeLists.txt b/src/pe/CMakeLists.txt
index 0030a0b275fe7eda1f302ecc8a1b32754e8140ef..12a3ebb4ee4e98f3c61fb092cf088005974c1c8b 100644
--- a/src/pe/CMakeLists.txt
+++ b/src/pe/CMakeLists.txt
@@ -5,5 +5,32 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core blockforest domain_decomposition geometry stencil vtk  )
-target_link_libraries(pe PRIVATE lodepng)
+add_library( pe )
+target_link_libraries( pe PUBLIC core blockforest domain_decomposition geometry stencil vtk PRIVATE lodepng )
+target_sources( pe
+      PRIVATE
+      Config.h
+      Thresholds.h
+      Thresholds.cpp
+      Materials.cpp
+      Types.h
+      basic.h
+      BlockFunctions.h
+      Materials.h
+      )
+
+add_subdirectory( cr )
+add_subdirectory( amr )
+add_subdirectory( vtk )
+add_subdirectory( raytracing )
+add_subdirectory( synchronization )
+add_subdirectory( ccd )
+add_subdirectory( debug )
+add_subdirectory( communication )
+add_subdirectory( bg )
+add_subdirectory( utility )
+add_subdirectory( contact )
+add_subdirectory( statistics )
+add_subdirectory( collision )
+add_subdirectory( rigidbody )
+add_subdirectory( fcd )
\ No newline at end of file
diff --git a/src/pe/amr/CMakeLists.txt b/src/pe/amr/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b5df7ae32eecef167115b105a61e858c652dac7f
--- /dev/null
+++ b/src/pe/amr/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe
+    PRIVATE
+    InfoCollection.cpp
+    InfoCollection.h     
+    )
+add_subdirectory( level_determination )
+add_subdirectory( weight_assignment )
\ No newline at end of file
diff --git a/src/pe/amr/level_determination/CMakeLists.txt b/src/pe/amr/level_determination/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3124c8f8a9f677dfa24544cbb364b6e336331b77
--- /dev/null
+++ b/src/pe/amr/level_determination/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( pe
+    PRIVATE
+    MinMaxLevelDetermination.h
+    MinMaxLevelDetermination.cpp     
+    )
diff --git a/src/pe/amr/weight_assignment/CMakeLists.txt b/src/pe/amr/weight_assignment/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7fdd4999b384c2544335b37586c375037391aa28
--- /dev/null
+++ b/src/pe/amr/weight_assignment/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( pe
+    PRIVATE
+    WeightAssignmentFunctor.h
+    MetisAssignmentFunctor.h     
+    )
diff --git a/src/pe/bg/CMakeLists.txt b/src/pe/bg/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..043041125a464e6c4a8d9fe2846d655fb94b5032
--- /dev/null
+++ b/src/pe/bg/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( pe
+    PRIVATE
+    SimpleBG.h
+    SimpleBGDataHandling.h
+    IBG.h     
+    )
diff --git a/src/pe/ccd/CMakeLists.txt b/src/pe/ccd/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bfc001c40d3f749aa1dfda9ec2a716294be86aa4
--- /dev/null
+++ b/src/pe/ccd/CMakeLists.txt
@@ -0,0 +1,12 @@
+target_sources( pe
+    PRIVATE
+    HashGrids.cpp
+    SimpleCCD.h
+    HashGridsDataHandling.h
+    CCDDataHandling.h
+    HashGridsBodyTrait.h
+    SimpleCCDDataHandling.h
+    ICCD.h
+    SimpleCCD.cpp
+    HashGrids.h     
+    )
diff --git a/src/pe/collision/CMakeLists.txt b/src/pe/collision/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..132304871e5508a8603ac041440be4ca212ecb6c
--- /dev/null
+++ b/src/pe/collision/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe
+    PRIVATE
+    GJK.h
+    GJK.cpp
+    EPA.h
+    EPA.cpp     
+    )
diff --git a/src/pe/communication/CMakeLists.txt b/src/pe/communication/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f6a10f37c990de2fd9ba73a1d250e43065bccf1c
--- /dev/null
+++ b/src/pe/communication/CMakeLists.txt
@@ -0,0 +1,22 @@
+target_sources( pe
+    PRIVATE
+    RigidBodyRemovalNotification.h
+    RigidBodyCopyNotification.h
+    RigidBodyRemoteMigrationNotification.h
+    RigidBodyMigrationNotification.h
+    RigidBodyVelocityCorrectionNotification.h
+    RigidBodyNewShadowCopyNotification.h
+    RigidBodyDeletionNotification.h
+    ParseMessage.h
+    PackNotification.h
+    Instantiate.h
+    RigidBodyVelocityUpdateNotification.h
+    Marshalling.h
+    RigidBodyUpdateNotification.h
+    Marshalling.cpp
+    RigidBodyForceNotification.h
+    DynamicMarshalling.h
+    RigidBodyRemovalInformationNotification.h
+    NotificationType.h     
+    )
+add_subdirectory( rigidbody )
\ No newline at end of file
diff --git a/src/pe/communication/rigidbody/CMakeLists.txt b/src/pe/communication/rigidbody/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..832e9bc007c9b3dff04b837dbdd8670ddaa2cc5a
--- /dev/null
+++ b/src/pe/communication/rigidbody/CMakeLists.txt
@@ -0,0 +1,14 @@
+target_sources( pe
+    PRIVATE
+    Capsule.h
+    Capsule.cpp
+    Box.cpp
+    Squirmer.cpp
+    Ellipsoid.h
+    Union.h
+    Sphere.h
+    Ellipsoid.cpp
+    Box.h
+    Sphere.cpp
+    Squirmer.h     
+    )
diff --git a/src/pe/contact/CMakeLists.txt b/src/pe/contact/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8c7387e86b1a6ff8c04b69f516592168edd35fbd
--- /dev/null
+++ b/src/pe/contact/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe
+    PRIVATE
+    Contact.h
+    ContactFunctions.h
+    ContactFunctions.impl.h
+    Contact.cpp     
+    )
diff --git a/src/pe/cr/CMakeLists.txt b/src/pe/cr/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6ed5db65546c3f55d505be7ed6d21e817d58c6bc
--- /dev/null
+++ b/src/pe/cr/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources( pe
+    PRIVATE
+    HCSITSBodyTrait.h
+    Integrators.h
+    PlainIntegrator.h
+    HCSITS.h
+    PlainIntegrator.impl.h
+    HCSITS.impl.h
+    DEM.h
+    ICR.h
+    DEM.impl.h
+    ContactResolvers.h     
+    )
diff --git a/src/pe/debug/CMakeLists.txt b/src/pe/debug/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..15053b394716d715aa6681ff25130fd528d3c668
--- /dev/null
+++ b/src/pe/debug/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( pe
+    PRIVATE
+    BodyData.cpp
+    BodyData.h     
+    )
diff --git a/src/pe/fcd/CMakeLists.txt b/src/pe/fcd/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5a720cdb046a4b0e111651e6f50bbbb9a29059ee
--- /dev/null
+++ b/src/pe/fcd/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( pe
+    PRIVATE
+    GenericFCD.h
+    SimpleFCD.h
+    IFCD.h
+    SimpleFCDDataHandling.h
+    AnalyticCollisionDetection.h
+    GJKEPACollideFunctor.h     
+    )
diff --git a/src/pe/raytracing/CMakeLists.txt b/src/pe/raytracing/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a130633b515cd20ed853dae86a6b05f76bbaf0b6
--- /dev/null
+++ b/src/pe/raytracing/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources( pe
+    PRIVATE
+    Intersects.h
+    Ray.cpp
+    Raytracer.h
+    ShadingParameters.h
+    Color.cpp
+    Color.h
+    Lighting.h
+    ShadingFunctions.h
+    Ray.h
+    Raytracer.cpp     
+    )
diff --git a/src/pe/rigidbody/CMakeLists.txt b/src/pe/rigidbody/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..36c0cca2e6ebae83819dad53e83f37876a5e9547
--- /dev/null
+++ b/src/pe/rigidbody/CMakeLists.txt
@@ -0,0 +1,45 @@
+target_sources( pe
+    PRIVATE
+    RigidBodyIterator.h
+    UnionFactory.h
+    PlaneFactory.cpp
+    SetBodyTypeIDs.h
+    RigidBody.h
+    RigidBody.cpp
+    GeomPrimitive.cpp
+    SphereFactory.h
+    Capsule.h
+    PlaneFactory.h
+    Capsule.cpp
+    Plane.h
+    CylindricalBoundary.h
+    Box.cpp
+    Squirmer.cpp
+    Owner.h
+    Plane.cpp
+    MPIRigidBodyTrait.h
+    EllipsoidFactory.cpp
+    Ellipsoid.h
+    Union.h
+    Sphere.h
+    CylindricalBoundaryFactory.cpp
+    StorageDataHandling.h
+    CylindricalBoundary.cpp
+    CapsuleFactory.h
+    Ellipsoid.cpp
+    CapsuleFactory.cpp
+    SphereFactory.cpp
+    EllipsoidFactory.h
+    BodyIterators.h
+    SquirmerFactory.cpp
+    CylindricalBoundaryFactory.h
+    BodyStorage.h
+    Box.h
+    GeomPrimitive.h
+    SquirmerFactory.h
+    RigidBodyCastIterator.h
+    BoxFactory.h
+    Sphere.cpp
+    Squirmer.h
+    BoxFactory.cpp     
+    )
diff --git a/src/pe/statistics/CMakeLists.txt b/src/pe/statistics/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..224b36ca2ea3da5cc96857fc49a3beb39e7c6708
--- /dev/null
+++ b/src/pe/statistics/CMakeLists.txt
@@ -0,0 +1,5 @@
+target_sources( pe
+    PRIVATE
+    BodyStatistics.cpp
+    BodyStatistics.h     
+    )
diff --git a/src/pe/synchronization/CMakeLists.txt b/src/pe/synchronization/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..83f27e3881a30bd80840fcd478566410346cd90f
--- /dev/null
+++ b/src/pe/synchronization/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( pe
+    PRIVATE
+    SyncNextNeighbors.h
+    SyncShadowOwners.h
+    ClearSynchronization.h
+    SyncForces.h
+    RemoveAndNotify.h     
+    )
diff --git a/src/pe/utility/CMakeLists.txt b/src/pe/utility/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3f9f429a53a2006f07acc63626b2441f5bfb1a91
--- /dev/null
+++ b/src/pe/utility/CMakeLists.txt
@@ -0,0 +1,13 @@
+target_sources( pe
+    PRIVATE
+    DestroyBody.cpp
+    Distance.h
+    GetBody.cpp
+    GetInfo.h
+    DestroyBody.h
+    Overlap.cpp
+    GetInfo.cpp
+    Overlap.h
+    GetBody.h
+    BodyCast.h     
+    )
diff --git a/src/pe/vtk/CMakeLists.txt b/src/pe/vtk/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..01cb517447f485db70d6926295e45fc9dfb977ef
--- /dev/null
+++ b/src/pe/vtk/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( pe
+    PRIVATE
+    EllipsoidVtkOutput.cpp
+    BodyVtkOutput.h
+    SphereVtkOutput.cpp
+    SphereVtkOutput.h
+    BodyVtkOutput.cpp
+    EllipsoidVtkOutput.h     
+    )
diff --git a/src/pe_coupling/CMakeLists.txt b/src/pe_coupling/CMakeLists.txt
index 01cff7984139842f96941d2cca49d29cc4d11f80..7883137c42abcf7d1ffd9ed281dc9fa045a7830b 100644
--- a/src/pe_coupling/CMakeLists.txt
+++ b/src/pe_coupling/CMakeLists.txt
@@ -4,6 +4,15 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS blockforest boundary communication core domain_decomposition field geometry lbm pe stencil vtk ) 
+add_library( pe_coupling )
+target_link_libraries( pe_coupling PUBLIC blockforest boundary communication core domain_decomposition field geometry lbm pe stencil vtk )
+
+add_subdirectory( amr )
+add_subdirectory( discrete_particle_methods )
+add_subdirectory( momentum_exchange_method )
+add_subdirectory( utility )
+add_subdirectory( partially_saturated_cells_method )
+add_subdirectory( geometry )
+add_subdirectory( mapping )
                          
 ###################################################################################################
diff --git a/src/pe_coupling/amr/CMakeLists.txt b/src/pe_coupling/amr/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4304ceaf447a3249a7fdfb3b5d0cb1861a9298d3
--- /dev/null
+++ b/src/pe_coupling/amr/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( pe_coupling
+    PRIVATE
+    InfoCollection.cpp
+    BlockInfo.h
+    InfoCollection.h     
+    )
+add_subdirectory( level_determination )
+add_subdirectory( weight_assignment )
diff --git a/src/pe_coupling/amr/level_determination/CMakeLists.txt b/src/pe_coupling/amr/level_determination/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..19072c57c47e1aeb809b7c744d9e99d4b183a992
--- /dev/null
+++ b/src/pe_coupling/amr/level_determination/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe_coupling
+    PRIVATE
+    GlobalBodyPresenceLevelDetermination.cpp
+    BodyPresenceLevelDetermination.cpp
+    GlobalBodyPresenceLevelDetermination.h
+    BodyPresenceLevelDetermination.h     
+    )
diff --git a/src/pe_coupling/amr/weight_assignment/CMakeLists.txt b/src/pe_coupling/amr/weight_assignment/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5698849c10fd956fc0eeb3eaff718b1153222221
--- /dev/null
+++ b/src/pe_coupling/amr/weight_assignment/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( pe_coupling
+    PRIVATE
+    WeightAssignmentFunctor.h
+    MetisAssignmentFunctor.cpp
+    WeightAssignmentFunctor.cpp
+    MetisAssignmentFunctor.h
+    WeightEvaluationFunctions.cpp
+    WeightEvaluationFunctions.h     
+    )
diff --git a/src/pe_coupling/discrete_particle_methods/CMakeLists.txt b/src/pe_coupling/discrete_particle_methods/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b35ee183f4bb091022051ffbaefd8fa01f4209d3
--- /dev/null
+++ b/src/pe_coupling/discrete_particle_methods/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_subdirectory( correlations )
+add_subdirectory( evaluators )
+add_subdirectory( gns_lbm )
+add_subdirectory( utility )
\ No newline at end of file
diff --git a/src/pe_coupling/discrete_particle_methods/correlations/CMakeLists.txt b/src/pe_coupling/discrete_particle_methods/correlations/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..38f6af98352b417f6cd53da8038a939040e7be16
--- /dev/null
+++ b/src/pe_coupling/discrete_particle_methods/correlations/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( pe_coupling
+    PRIVATE
+    DragForceCorrelations.h
+    LiftForceCorrelations.h
+    AddedMassForceCorrelations.h     
+    )
diff --git a/src/pe_coupling/discrete_particle_methods/evaluators/CMakeLists.txt b/src/pe_coupling/discrete_particle_methods/evaluators/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..18b816062972697d6cbe63cc2b3a724bc080f720
--- /dev/null
+++ b/src/pe_coupling/discrete_particle_methods/evaluators/CMakeLists.txt
@@ -0,0 +1,17 @@
+target_sources( pe_coupling
+    PRIVATE
+    EffectiveViscosityFieldEvaluator.h
+    AddedMassForceEvaluator.h
+    StressTensorGradientFieldEvaluator.h
+    VelocityCurlFieldEvaluator.h
+    PressureFieldEvaluator.h
+    VelocityGradientFieldEvaluator.h
+    PressureGradientFieldEvaluator.h
+    LiftForceEvaluator.h
+    SolidVolumeFractionFieldEvaluator.h
+    VelocityFieldEvaluator.h
+    InteractionForceEvaluator.h
+    VelocityTotalTimeDerivativeFieldEvaluator.h
+    BodyVelocityTimeDerivativeEvaluator.h
+    LubricationForceEvaluator.h     
+    )
diff --git a/src/pe_coupling/discrete_particle_methods/gns_lbm/CMakeLists.txt b/src/pe_coupling/discrete_particle_methods/gns_lbm/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e97a9c4fc8fbef985bb8770a41783dadbade1777
--- /dev/null
+++ b/src/pe_coupling/discrete_particle_methods/gns_lbm/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( pe_coupling
+    PRIVATE
+    GNSSweep.h     
+    )
diff --git a/src/pe_coupling/discrete_particle_methods/gns_lbm/utility/CMakeLists.txt b/src/pe_coupling/discrete_particle_methods/gns_lbm/utility/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b5ac25e11febc6042653b8da6686d27ec4215c65
--- /dev/null
+++ b/src/pe_coupling/discrete_particle_methods/gns_lbm/utility/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe_coupling
+    PRIVATE
+    GNSPressureFieldEvaluator.h
+    GNSVelocityFieldEvaluator.h
+    GNSExternalForceToForceFieldAdder.h
+    GNSSmagorinskyLESField.h     
+    )
diff --git a/src/pe_coupling/discrete_particle_methods/utility/CMakeLists.txt b/src/pe_coupling/discrete_particle_methods/utility/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b6c117c97d8124e9c2aac229400c278ce59106ed
--- /dev/null
+++ b/src/pe_coupling/discrete_particle_methods/utility/CMakeLists.txt
@@ -0,0 +1,9 @@
+target_sources( pe_coupling
+    PRIVATE
+    BodyVelocityInitializer.h
+    AveragedInteractionForceFieldToForceFieldAdder.h
+    CombinedReductionFieldCommunication.h
+    ExternalForceToForceFieldAdder.h
+    FieldDataSwapper.h
+    ForceFieldResetter.h     
+    )
diff --git a/src/pe_coupling/geometry/CMakeLists.txt b/src/pe_coupling/geometry/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9331843e2cd06f8275b52ca6e825ca8c0c101369
--- /dev/null
+++ b/src/pe_coupling/geometry/CMakeLists.txt
@@ -0,0 +1,8 @@
+target_sources( pe_coupling
+    PRIVATE
+    SphereEquivalentDiameter.h
+    PeIntersectionRatio.cpp
+    PeIntersectionRatio.h
+    PeOverlapFraction.h
+    PeBodyOverlapFunctions.h     
+    )
diff --git a/src/pe_coupling/mapping/CMakeLists.txt b/src/pe_coupling/mapping/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4954955a1d01e7097c3e1a697e19b58fba18fb5e
--- /dev/null
+++ b/src/pe_coupling/mapping/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( pe_coupling
+    PRIVATE
+    BodyMapping.h
+    BodyBBMapping.h
+    BodyBBMapping.cpp     
+    )
diff --git a/src/pe_coupling/momentum_exchange_method/CMakeLists.txt b/src/pe_coupling/momentum_exchange_method/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..db5a4e0f83fa9a03e49728deadd1a4ac15676cfc
--- /dev/null
+++ b/src/pe_coupling/momentum_exchange_method/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe_coupling
+    PRIVATE
+    BodyMapping.h     
+    )
+add_subdirectory( boundary )
+add_subdirectory( destruction )
+add_subdirectory( restoration )
diff --git a/src/pe_coupling/momentum_exchange_method/boundary/CMakeLists.txt b/src/pe_coupling/momentum_exchange_method/boundary/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1c082cba5c1bdf481872b376a022c4de7953f976
--- /dev/null
+++ b/src/pe_coupling/momentum_exchange_method/boundary/CMakeLists.txt
@@ -0,0 +1,6 @@
+target_sources( pe_coupling
+    PRIVATE
+    CurvedQuadratic.h
+    CurvedLinear.h
+    SimpleBB.h     
+    )
diff --git a/src/pe_coupling/momentum_exchange_method/destruction/CMakeLists.txt b/src/pe_coupling/momentum_exchange_method/destruction/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e237634a3a73c378fe93f057c867e5f6db19299e
--- /dev/null
+++ b/src/pe_coupling/momentum_exchange_method/destruction/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources( pe_coupling
+    PRIVATE
+    Destroyer.h     
+    )
diff --git a/src/pe_coupling/momentum_exchange_method/restoration/CMakeLists.txt b/src/pe_coupling/momentum_exchange_method/restoration/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6930bd57e4d8fc54b1df871e32d8f971fe274323
--- /dev/null
+++ b/src/pe_coupling/momentum_exchange_method/restoration/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe_coupling
+    PRIVATE
+    ExtrapolationDirectionFinder.h
+    ExtrapolationDirectionFinder.cpp
+    Reconstructor.h
+    PDFReconstruction.h     
+    )
diff --git a/src/pe_coupling/partially_saturated_cells_method/CMakeLists.txt b/src/pe_coupling/partially_saturated_cells_method/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..df940c6fb7745ea225e2ff68b02102713014c687
--- /dev/null
+++ b/src/pe_coupling/partially_saturated_cells_method/CMakeLists.txt
@@ -0,0 +1,7 @@
+target_sources( pe_coupling
+    PRIVATE
+    PSMUtility.h
+    BodyAndVolumeFractionMapping.cpp
+    PSMSweep.h
+    BodyAndVolumeFractionMapping.h     
+    )
diff --git a/src/pe_coupling/utility/CMakeLists.txt b/src/pe_coupling/utility/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..007e856e04cb79f3e0149d1aedae9891597ce480
--- /dev/null
+++ b/src/pe_coupling/utility/CMakeLists.txt
@@ -0,0 +1,17 @@
+target_sources( pe_coupling
+    PRIVATE
+    LubricationCorrection.h
+    TimeStep.h
+    BodiesForceTorqueContainer.cpp
+    LubricationCorrection.cpp
+    TimeStep.cpp
+    BodiesForceTorqueContainer.h
+    ForceOnBodiesAdder.h
+    ForceTorqueOnBodiesResetter.cpp
+    ForceOnBodiesAdder.cpp
+    BodySelectorFunctions.h
+    ForceTorqueOnBodiesScaler.h
+    BodySelectorFunctions.cpp
+    ForceTorqueOnBodiesScaler.cpp
+    ForceTorqueOnBodiesResetter.h     
+    )
diff --git a/src/postprocessing/CMakeLists.txt b/src/postprocessing/CMakeLists.txt
index 82f92b79c5ec5c0cc628a215607518544e44e1e0..1a1ad27e0f345fd4995d47389513252e7d23fc18 100644
--- a/src/postprocessing/CMakeLists.txt
+++ b/src/postprocessing/CMakeLists.txt
@@ -4,11 +4,14 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core
-                             domain_decomposition
-                             field
-                             python_coupling
-                             stencil
-                             geometry )
+add_library( postprocessing )
+target_link_libraries( postprocessing PUBLIC core domain_decomposition field geometry )
+target_sources( postprocessing
+      PRIVATE
+      MarchingCubes.impl.h
+      MarchingCubes.h
+      FieldToSurfaceMesh.h
+      FieldToSurfaceMesh.cpp
+      )
 
 ###################################################################################################
diff --git a/src/python_coupling/CMakeLists.txt b/src/python_coupling/CMakeLists.txt
index 758289636ada5eefe4bdf7d8d02290c8f83dedcd..08266d3a9a51a452ba7022de56994f935fa7861c 100644
--- a/src/python_coupling/CMakeLists.txt
+++ b/src/python_coupling/CMakeLists.txt
@@ -1,4 +1,20 @@
-if (WALBERLA_BUILD_WITH_PYTHON)
-   waLBerla_add_module(DEPENDS core communication domain_decomposition stencil field blockforest vtk cuda)
-   target_link_libraries(python_coupling PUBLIC pybind11::embed core domain_decomposition)
-endif()
\ No newline at end of file
+ add_library( python_coupling )
+ target_link_libraries( python_coupling PUBLIC pybind11::embed core communication domain_decomposition stencil field blockforest vtk )
+ if( WALBERLA_BUILD_WITH_CUDA )
+  target_link_libraries( python_coupling PUBLIC cuda )
+ endif()
+ target_sources( python_coupling
+       PRIVATE
+       Manager.cpp
+       PythonWrapper.h
+       DictWrapper.impl.h
+       DictWrapper.h
+       CreateConfig.h
+       PythonCallback.cpp
+       Manager.h
+       PythonCallback.h
+       CreateConfig.cpp
+       )
+
+ add_subdirectory( export )
+ add_subdirectory( helper )
\ No newline at end of file
diff --git a/src/python_coupling/export/CMakeLists.txt b/src/python_coupling/export/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bea431188570ec668ce21d5d50ebf2d372c81591
--- /dev/null
+++ b/src/python_coupling/export/CMakeLists.txt
@@ -0,0 +1,20 @@
+target_sources( python_coupling
+    PRIVATE
+    GatherExport.impl.h
+    VTKExport.cpp
+    CUDAExport.h
+    FieldCommunicationExport.impl.h
+    BasicExport.cpp
+    BlockForestCommunicationExport.h
+    VTKExport.h
+    MPIExport.cpp
+    BlockForestExport.cpp
+    BlockForestCommunicationExport.impl.h
+    MPIExport.h
+    FieldCommunicationExport.h
+    BlockForestExport.h
+    BasicExport.h
+    FieldExport.impl.h
+    FieldExports.h
+    CUDAExport.impl.h     
+    )
diff --git a/src/python_coupling/helper/CMakeLists.txt b/src/python_coupling/helper/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2c9fc4587c42d8af5dfe014bf57388286f79ec4b
--- /dev/null
+++ b/src/python_coupling/helper/CMakeLists.txt
@@ -0,0 +1,14 @@
+target_sources( python_coupling
+    PRIVATE
+    ConfigFromDict.h
+    MplHelpers.h
+    PybindHelper.h
+    SliceToCellInterval.h
+    BlockStorageExportHelpers.h
+    ModuleInit.cpp
+    PythonIterableToStdVector.h
+    OwningIterator.h
+    ConfigFromDict.cpp
+    BlockStorageExportHelpers.cpp
+    ModuleInit.h     
+    )
diff --git a/src/simd/CMakeLists.txt b/src/simd/CMakeLists.txt
index f618b53a29573b840ffddd7c6f130301afdf8748..f850ff00d6037f4b731836e754009af0e3e85f7e 100644
--- a/src/simd/CMakeLists.txt
+++ b/src/simd/CMakeLists.txt
@@ -5,5 +5,18 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core  )
+add_library( simd INTERFACE )
+target_link_libraries( simd INTERFACE core )
+target_sources( simd
+      INTERFACE
+      AVX.h
+      SSE4.h
+      Scalar.h
+      AlignedAllocator.h
+      StreamOutput.h
+      IntelVecTypesCppOperators.h
+      SIMD.h
+      AVX2.h
+      SSE2.h
+      )
 
diff --git a/src/sqlite/CMakeLists.txt b/src/sqlite/CMakeLists.txt
index f2809e2d9a8b98efaa0f429a4e3495465e3d7314..b7b33975158874dc2f7dfad346963ac45f674cc6 100644
--- a/src/sqlite/CMakeLists.txt
+++ b/src/sqlite/CMakeLists.txt
@@ -4,7 +4,12 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core )
-target_link_libraries( sqlite PRIVATE sqlite3 )
+add_library( sqlite )
+target_link_libraries( sqlite PUBLIC core PRIVATE sqlite3 )
+target_sources( sqlite
+      PRIVATE
+      SQLite.cpp
+      SQLite.h
+      )
 
 ###################################################################################################
diff --git a/src/stencil/CMakeLists.txt b/src/stencil/CMakeLists.txt
index e13003faaf4ff203dcc440a4fce306a50c3be38c..466e376fab0d4f5965f483fb834aa7d339748a88 100644
--- a/src/stencil/CMakeLists.txt
+++ b/src/stencil/CMakeLists.txt
@@ -4,6 +4,26 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core )
+add_library( stencil INTERFACE )
+target_sources( stencil
+      INTERFACE
+      AABBQuadrant.h
+      D2CornerStencil.h
+      D2Q4.h
+      D2Q5.h
+      D2Q9.h
+      D3CornerStencil.h
+      D3EdgeCornerStencil.h
+      D3Q15.h
+      D3Q19.h
+      D3Q27.h
+      D3Q6.h
+      D3Q7.h
+      Directions.h
+      EdgeStencil.h
+      Iterator.h
+      Stencil.in.h
+      )
+target_link_libraries( stencil INTERFACE core )
 
 ###################################################################################################
diff --git a/src/timeloop/CMakeLists.txt b/src/timeloop/CMakeLists.txt
index 465f95bb4806b2b27466bb978b396e31fa07d88b..9035c3d9ab1a6620f39b1a5e38295e9704ae3d0d 100644
--- a/src/timeloop/CMakeLists.txt
+++ b/src/timeloop/CMakeLists.txt
@@ -4,7 +4,18 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core domain_decomposition python_coupling )
-                      
+add_library( timeloop )
+target_link_libraries( timeloop PUBLIC core domain_decomposition )
+target_sources( timeloop
+      PRIVATE
+      ITimeloop.h
+      PerformanceMeter.h
+      SelectableFunctionCreators.h
+      SweepTimeloop.h
+      Timeloop.h
+      PerformanceMeter.cpp
+      SweepTimeloop.cpp
+      Timeloop.cpp
+)
 
 ###################################################################################################
diff --git a/src/vtk/CMakeLists.txt b/src/vtk/CMakeLists.txt
index 6a12fce9b6bf3e367c9741c36f60a52aa06ac9f1..2b21bd8d5f1d4bd70a4b7efc85b4ee9ced6ba4b4 100644
--- a/src/vtk/CMakeLists.txt
+++ b/src/vtk/CMakeLists.txt
@@ -4,6 +4,26 @@
 #
 ###################################################################################################
 
-waLBerla_add_module( DEPENDS core blockforest domain_decomposition python_coupling )
+add_library( vtk )
+target_sources( vtk
+      PRIVATE
+      Base64Writer.cpp
+      Base64Writer.h
+      DumpBlockStructureLevel.h
+      CellBBCellFilter.h
+      Initialization.h
+      Initialization.cpp
+      PointDataSource.h
+      BlockCellDataWriter.h
+      VTKTrait.h
+      VTKOutput.cpp
+      VTKOutput.h
+      DumpBlockStructureProcess.h
+      AABBCellFilter.h
+      PolylineDataSource.h
+      UtilityFunctions.h
+      ChainedFilter.h
+      )
+target_link_libraries( vtk PUBLIC core blockforest domain_decomposition )
 
 ###################################################################################################
diff --git a/tests/blockforest/CMakeLists.txt b/tests/blockforest/CMakeLists.txt
index 5c710c5bc835533ce21423695766b02e9645ce0b..4778166c984c9c4ad07c615527bf6e129afcf971 100644
--- a/tests/blockforest/CMakeLists.txt
+++ b/tests/blockforest/CMakeLists.txt
@@ -4,16 +4,16 @@
 #
 ###################################################################################################
 
-waLBerla_compile_test ( FILES BlockIDTest.cpp )
+waLBerla_compile_test ( FILES BlockIDTest.cpp DEPENDS core )
 waLBerla_execute_test ( NAME BlockIDTest LABELS longrun )
 
-waLBerla_compile_test( FILES SetupBlockForestTest.cpp )
+waLBerla_compile_test( FILES SetupBlockForestTest.cpp DEPENDS core )
 waLBerla_execute_test( NAME SetupBlockForestTest LABELS longrun CONFIGURATIONS Release RelWithDbgInfo )
 
-waLBerla_compile_test( FILES BlockForestTest.cpp )
+waLBerla_compile_test( FILES BlockForestTest.cpp DEPENDS core domain_decomposition )
 waLBerla_execute_test( NAME BlockForestTest PROCESSES 4 )
 
-waLBerla_compile_test( FILES DeterministicCreation.cpp )
+waLBerla_compile_test( FILES DeterministicCreation.cpp DEPENDS core )
 waLBerla_execute_test( NAME DeterministicCreation PROCESSES 8 )
 
 waLBerla_compile_test( NAME   SaveLoad FILES SaveLoadTest.cpp DEPENDS core blockforest  )
@@ -27,27 +27,29 @@ set_property( TEST SaveLoad04 PROPERTY DEPENDS SaveLoad02 ) #serialize runs of t
 set_property( TEST SaveLoad08 PROPERTY DEPENDS SaveLoad04 ) #serialize runs of tets to avoid i/o conflicts when running ctest with -jN
 endif()
 
-waLBerla_compile_test( FILES StructuredBlockForestTest.cpp )
+waLBerla_compile_test( FILES StructuredBlockForestTest.cpp DEPENDS core domain_decomposition )
 waLBerla_execute_test( NAME StructuredBlockForestTest )
 
-waLBerla_compile_test( FILES BlockDataIOTest.cpp DEPENDS field )
-waLBerla_execute_test( NAME BlockDataIOTest1 COMMAND $<TARGET_FILE:BlockDataIOTest> )
-waLBerla_execute_test( NAME BlockDataIOTest3 COMMAND $<TARGET_FILE:BlockDataIOTest> PROCESSES 3 )
-waLBerla_execute_test( NAME BlockDataIOTest8 COMMAND $<TARGET_FILE:BlockDataIOTest> PROCESSES 8 )
+waLBerla_compile_test( FILES BlockDataIOTest.cpp DEPENDS core field )
+waLBerla_execute_test( NAME BlockDataIOTest1 COMMAND $<TARGET_FILE:BlockDataIOTest> DEPENDS_ON_TARGETS BlockDataIOTest )
+waLBerla_execute_test( NAME BlockDataIOTest3 COMMAND $<TARGET_FILE:BlockDataIOTest> PROCESSES 3 DEPENDS_ON_TARGETS BlockDataIOTest )
+waLBerla_execute_test( NAME BlockDataIOTest8 COMMAND $<TARGET_FILE:BlockDataIOTest> PROCESSES 8 DEPENDS_ON_TARGETS BlockDataIOTest )
 #serialize runs of tests to avoid i/o conflicts when running ctest with -jN
 if( WALBERLA_BUILD_WITH_MPI )
-   set_property( TEST BlockDataIOTest3 PROPERTY DEPENDS BlockDataIOTest1 )
-   set_property( TEST BlockDataIOTest8 PROPERTY DEPENDS BlockDataIOTest3 )
+   if( TARGET BlockDataIOTest )
+      set_property( TEST BlockDataIOTest3 PROPERTY DEPENDS BlockDataIOTest1 )
+      set_property( TEST BlockDataIOTest8 PROPERTY DEPENDS BlockDataIOTest3 )
+   endif()
 endif( WALBERLA_BUILD_WITH_MPI )
 
 # communication
 
 waLBerla_compile_test( FILES communication/GhostLayerCommTest.cpp DEPENDS field timeloop )
-waLBerla_execute_test( NAME GhostLayerCommTest1 COMMAND $<TARGET_FILE:GhostLayerCommTest> )
-waLBerla_execute_test( NAME GhostLayerCommTest4 COMMAND $<TARGET_FILE:GhostLayerCommTest> PROCESSES 4 )
-waLBerla_execute_test( NAME GhostLayerCommTest8 COMMAND $<TARGET_FILE:GhostLayerCommTest> PROCESSES 8 )
+waLBerla_execute_test( NAME GhostLayerCommTest1 COMMAND $<TARGET_FILE:GhostLayerCommTest> DEPENDS_ON_TARGETS GhostLayerCommTest )
+waLBerla_execute_test( NAME GhostLayerCommTest4 COMMAND $<TARGET_FILE:GhostLayerCommTest> PROCESSES 4 DEPENDS_ON_TARGETS GhostLayerCommTest )
+waLBerla_execute_test( NAME GhostLayerCommTest8 COMMAND $<TARGET_FILE:GhostLayerCommTest> PROCESSES 8 DEPENDS_ON_TARGETS GhostLayerCommTest )
 
 waLBerla_compile_test( FILES communication/DirectionBasedReduceCommTest.cpp DEPENDS field timeloop )
-waLBerla_execute_test( NAME DirectionBasedReduceCommTest1 COMMAND $<TARGET_FILE:DirectionBasedReduceCommTest> )
-waLBerla_execute_test( NAME DirectionBasedReduceCommTest3 COMMAND $<TARGET_FILE:DirectionBasedReduceCommTest> PROCESSES 3 )
-waLBerla_execute_test( NAME DirectionBasedReduceCommTest8 COMMAND $<TARGET_FILE:DirectionBasedReduceCommTest> PROCESSES 8 )
+waLBerla_execute_test( NAME DirectionBasedReduceCommTest1 COMMAND $<TARGET_FILE:DirectionBasedReduceCommTest> DEPENDS_ON_TARGETS DirectionBasedReduceCommTest )
+waLBerla_execute_test( NAME DirectionBasedReduceCommTest3 COMMAND $<TARGET_FILE:DirectionBasedReduceCommTest> PROCESSES 3 DEPENDS_ON_TARGETS DirectionBasedReduceCommTest )
+waLBerla_execute_test( NAME DirectionBasedReduceCommTest8 COMMAND $<TARGET_FILE:DirectionBasedReduceCommTest> PROCESSES 8 DEPENDS_ON_TARGETS DirectionBasedReduceCommTest )
diff --git a/tests/core/CMakeLists.txt b/tests/core/CMakeLists.txt
index 798a0b89d36c0db03ba53ff00dd79937f9b2a9a7..d4b4b2f6b0d0cc5094f5e630cff2d9d2adfa8c49 100644
--- a/tests/core/CMakeLists.txt
+++ b/tests/core/CMakeLists.txt
@@ -82,9 +82,10 @@ waLBerla_compile_test( FILES math/GenericAABBTest.cpp DEPENDS stencil domain_dec
 waLBerla_execute_test( NAME GenericAABBTest )
 
 if( WALBERLA_BUILD_WITH_BOOST )
-waLBerla_compile_test( FILES math/PhysicalCheckTest.cpp DEPENDS stencil )
-waLBerla_execute_test( NAME PhysicalCheckTest
-                       COMMAND $<TARGET_FILE:PhysicalCheckTest>  ${CMAKE_CURRENT_SOURCE_DIR}/math/PhysicalCheckTestInput.prm )
+   waLBerla_compile_test( FILES math/PhysicalCheckTest.cpp DEPENDS stencil )
+   waLBerla_execute_test( NAME PhysicalCheckTest
+         COMMAND $<TARGET_FILE:PhysicalCheckTest> ${CMAKE_CURRENT_SOURCE_DIR}/math/PhysicalCheckTestInput.prm
+         DEPENDS_ON_TARGETS PhysicalCheckTest )
 endif( WALBERLA_BUILD_WITH_BOOST )
 
 
@@ -164,7 +165,7 @@ waLBerla_execute_test( NAME TimingPoolTest PROCESSES 3  )
 waLBerla_compile_test( FILES timing/TimingTreeTest.cpp )
 waLBerla_execute_test( NAME TimingTreeTest PROCESSES 3)
 
-waLBerla_compile_test( FILES timing/SweepTimeloopTimerReduction.cpp DEPENDS timeloop blockforest )
+waLBerla_compile_test( FILES timing/SweepTimeloopTimerReduction.cpp DEPENDS blockforest domain_decomposition timeloop)
 waLBerla_execute_test( NAME SweepTimeloopTimerReduction PROCESSES 9  )
 
 
diff --git a/tests/cuda/CMakeLists.txt b/tests/cuda/CMakeLists.txt
index aae265a7b70a4d09aeb8530a193ee743c5398c56..723f7818710f502a792d0e5732fc0cf70f4bec01 100644
--- a/tests/cuda/CMakeLists.txt
+++ b/tests/cuda/CMakeLists.txt
@@ -15,7 +15,7 @@ waLBerla_execute_test( NAME  GPUPackInfoCommunicationTest )
 waLBerla_compile_test( FILES communication/GPUBlockSelectorCommunicationTest.cpp DEPENDS domain_decomposition blockforest stencil )
 waLBerla_execute_test( NAME  GPUBlockSelectorCommunicationTest )
 
-waLBerla_compile_test( FILES FieldTransferTest )
+waLBerla_compile_test( FILES FieldTransferTest.cpp )
 waLBerla_execute_test( NAME  FieldTransferTest )
 
 waLBerla_compile_test( FILES SimpleKernelTest.cpp Kernels.cu DEPENDS blockforest timeloop gui )
@@ -38,10 +38,10 @@ waLBerla_compile_test( FILES codegen/CodegenPoissonGPU.cpp DEPENDS gui cuda time
 waLBerla_execute_test( NAME CodegenPoissonGPU )
 
 # The following tests work only for CUDA enabled MPI
-waLBerla_compile_test( FILES communication/CommTest )
+waLBerla_compile_test( FILES communication/CommTest.cpp )
 #waLBerla_execute_test( NAME  CommTest PROCESSES 2)
 
-waLBerla_compile_test( FILES CudaMPI DEPENDS blockforest timeloop gui )
+waLBerla_compile_test( FILES CudaMPI.cpp DEPENDS blockforest timeloop gui )
 #waLBerla_execute_test( NAME  CudaMPI )
 
 waLBerla_compile_test( FILES AlignmentTest.cpp DEPENDS blockforest timeloop )
@@ -56,4 +56,4 @@ waLBerla_generate_target_from_python(NAME CodegenGeneratedGPUFieldPackInfo FILE
 waLBerla_compile_test( FILES codegen/GeneratedFieldPackInfoTestGPU.cpp
         DEPENDS blockforest core field CodegenGeneratedGPUFieldPackInfo )
 waLBerla_execute_test( NAME GeneratedFieldPackInfoTestGPU )
-endif()
\ No newline at end of file
+endif()
diff --git a/tests/field/CMakeLists.txt b/tests/field/CMakeLists.txt
index 199e0180199dcf6a7c75ab06dfa76f62bc614cb5..aa0ee9bb11cae93dba2f982647cece2d071cb59d 100644
--- a/tests/field/CMakeLists.txt
+++ b/tests/field/CMakeLists.txt
@@ -38,8 +38,8 @@ waLBerla_compile_test( FILES adaptors/AdaptorTest.cpp DEPENDS blockforest gui lb
 waLBerla_execute_test( NAME AdaptorTest )
 
 waLBerla_compile_test( FILES FieldGatherTest.cpp DEPENDS blockforest gui )
-waLBerla_execute_test( NAME FieldGatherTest3 COMMAND $<TARGET_FILE:FieldGatherTest>  PROCESSES 3 )
-waLBerla_execute_test( NAME FieldGatherTest1 COMMAND $<TARGET_FILE:FieldGatherTest>  PROCESSES 1 )
+waLBerla_execute_test( NAME FieldGatherTest3 COMMAND $<TARGET_FILE:FieldGatherTest>  PROCESSES 3 DEPENDS_ON_TARGETS FieldGatherTest )
+waLBerla_execute_test( NAME FieldGatherTest1 COMMAND $<TARGET_FILE:FieldGatherTest>  PROCESSES 1 DEPENDS_ON_TARGETS FieldGatherTest )
 
 waLBerla_compile_test( FILES FieldFileIOTest.cpp DEPENDS blockforest )
 waLBerla_execute_test( NAME FieldFileIOTest1Proc  COMMAND $<TARGET_FILE:FieldFileIOTest> PROCESSES 1  )
diff --git a/tests/lbm/CMakeLists.txt b/tests/lbm/CMakeLists.txt
index a8cc3e9f91a2a3090a299f314abcbe84a8f6c707..fbcd45ff86750ca08ba0765f788bcb5b0caa9fbb 100644
--- a/tests/lbm/CMakeLists.txt
+++ b/tests/lbm/CMakeLists.txt
@@ -37,8 +37,8 @@ waLBerla_execute_test( NAME DiffusionDirichletTest2 COMMAND $<TARGET_FILE:Diffus
 
 
 waLBerla_compile_test( FILES DiffusionTest.cpp DEPENDS field blockforest timeloop vtk gui postprocessing)
-waLBerla_execute_test( NAME  DiffusionTestCorr COMMAND $<TARGET_FILE:DiffusionTest>  -c 1  -dx 0.01  -dt 0.002  -d 0.005  -v 5  -err 0.0025 )
-waLBerla_execute_test( NAME  DiffusionTestNone COMMAND $<TARGET_FILE:DiffusionTest>  -c 0  -dx 0.01  -dt 0.002  -d 0.005  -v 5  -err 0.0040 )
+waLBerla_execute_test( NAME  DiffusionTestCorr COMMAND $<TARGET_FILE:DiffusionTest>  -c 1  -dx 0.01  -dt 0.002  -d 0.005  -v 5  -err 0.0025 DEPENDS_ON_TARGETS DiffusionTest )
+waLBerla_execute_test( NAME  DiffusionTestNone COMMAND $<TARGET_FILE:DiffusionTest>  -c 0  -dx 0.01  -dt 0.002  -d 0.005  -v 5  -err 0.0040 DEPENDS_ON_TARGETS DiffusionTest )
 
 
 waLBerla_compile_test( FILES refinement/Uniformity.cpp DEPENDS blockforest stencil )
diff --git a/utilities/refactorCMake.py b/utilities/refactorCMake.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5262a96ca5cf4c23ecdbaf45bdb1fafde5fb7c4
--- /dev/null
+++ b/utilities/refactorCMake.py
@@ -0,0 +1,64 @@
+import argparse
+
+#!/usr/bin/env python3
+
+import os
+import re
+
+
+def create_cmake_lists (folder, module_name, top_level=True, deps = []):
+    header_and_source = []
+    subfolder = []
+    newline = '\n    '
+    add_sub = '\nadd_subdirectory( '
+    for entry in os.scandir(folder):
+        if entry.name == 'all.h':
+            continue
+        if entry.is_file():
+            if entry.name.endswith('.h') or entry.name.endswith('.cpp'):
+                header_and_source += [entry.name]
+        else:
+            if entry.name != 'doc' and entry.name != 'CMakeFiles':
+                subfolder += [entry.name]
+            create_cmake_lists(folder + '/' + entry.name, module_name, False)
+
+    print(subfolder)
+    if not header_and_source:
+        return
+
+    if top_level:
+        with open(folder + '/CMakeListsRefactor.txt', 'w') as f:
+            content = f"""add_library( {module_name} )
+target_link_libraries( {module_name} PUBLIC {' '.join(x for x in deps)} )
+target_sources( {module_name}
+    PRIVATE
+    {newline.join(x for x in header_and_source)}     
+    )
+
+add_subdirectory( {add_sub.join(x + ' )' for x in subfolder)}
+"""
+            f.write(content)
+    else:
+        with open(folder + '/CMakeLists.txt', 'w') as f:
+            content = f"""target_sources( {module_name}
+    PRIVATE
+    {newline.join(x for x in header_and_source)}     
+    )
+"""
+            f.write(content)
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description='Refactor CMakeLists.txt file')
+    parser.add_argument('folder', type=str, help='Folder to be refactored; a CMakeListsRefactor.txt file will be created in each subfolder')
+    args = parser.parse_args()
+
+    print(args.folder)
+    with open(args.folder + '/CMakeLists.txt', 'r') as f:
+        depsRaw = re.findall(r'DEPENDS (.*)\)', f.read(), re.DOTALL)
+    deps = []
+    if depsRaw:
+        deps = depsRaw[0].split()
+
+    create_cmake_lists( args.folder, args.folder.split('/')[-1], True, deps )
+