diff --git a/CMakeLists.txt b/CMakeLists.txt
index 15f953b3b3b46e7e6f86526d90a53a5d4d40d3bc..aaeb42034749a7566798b2b0dda4589d2ac2b1fb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -118,12 +118,14 @@ message(STATUS "Framework:")
 message(" - Includes: [ ${vkcv_includes} ]")
 message(" - Libraries: [ ${vkcv_libraries} ]")
 message(" - Flags: [ ${vkcv_flags} ]")
+message(" - Headers: [ ${vkcv_headers} ]")
 
 # set the compiler flags for the framework
 set(CMAKE_CXX_FLAGS ${vkcv_flags})
 
 # create VkCV framework as library using all source files
 add_library(vkcv ${vkcv_build_attribute} ${vkcv_sources})
+set_target_properties(vkcv PROPERTIES PUBLIC_HEADER "${vkcv_headers}")
 
 if(MSVC)
   #enable multicore compilation on visual studio
@@ -171,4 +173,7 @@ if (vkcv_parent_scope)
 	
 	set(vkcv_includes ${vkcv_includes} PARENT_SCOPE)
 	set(vkcv_libraries ${vkcv_libraries} PARENT_SCOPE)
-endif()
\ No newline at end of file
+endif()
+
+install(TARGETS vkcv PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv)
diff --git a/config/Libraries.cmake b/config/Libraries.cmake
index f78ca1f5df4ef40683b7948473dbc6a506f67cd1..02f9ebfa02a85f8ecef50e89fa0d15f6468a1223 100644
--- a/config/Libraries.cmake
+++ b/config/Libraries.cmake
@@ -54,3 +54,6 @@ if (vkcv_definitions)
 endif ()
 
 list(JOIN vkcv_flags " " vkcv_flags)
+
+# add custom function to filter headers from source file lists
+include(${vkcv_config_ext}/FilterHeaders.cmake)
diff --git a/config/Sources.cmake b/config/Sources.cmake
index 4cae57fd99c284a93f7522da18af020a33d6406e..b693dea53180ac1f9499403e16a2f6aeb3f975d2 100644
--- a/config/Sources.cmake
+++ b/config/Sources.cmake
@@ -154,6 +154,8 @@ set(vkcv_sources
 		${vkcv_source}/vkcv/RayTracingPipelineConfig.cpp
 )
 
+filter_headers(vkcv_sources ${vkcv_include} vkcv_headers)
+
 if (BUILD_CLANG_FORMAT)
 	message(STATUS "Clang-Format: ON")
 	
diff --git a/config/ext/FilterHeaders.cmake b/config/ext/FilterHeaders.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..cf5ae34c5f686bf462e5a1b53c4ac6caf56733e5
--- /dev/null
+++ b/config/ext/FilterHeaders.cmake
@@ -0,0 +1,14 @@
+
+function(filter_headers sources include_path headers)
+	set(header_list "")
+	
+	foreach(src_path IN ITEMS ${${sources}})
+		string(FIND ${src_path} ${include_path} src_include_dir)
+		
+		if (${src_include_dir} MATCHES 0)
+			list(APPEND header_list ${src_path})
+		endif()
+	endforeach()
+	
+	set(${headers} "${header_list}" PARENT_SCOPE)
+endfunction()
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index e5bc34dfdf183f8dc26639771f44201597beaa73..fd3c4cfdfedff17e6952d8b2222aca37d0510d24 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -13,7 +13,6 @@ add_subdirectory(material)
 add_subdirectory(meshlet)
 add_subdirectory(scene)
 add_subdirectory(shader_compiler)
-add_subdirectory(testing)
 add_subdirectory(upscaling)
 
 message(STATUS "Modules:")
diff --git a/modules/algorithm/CMakeLists.txt b/modules/algorithm/CMakeLists.txt
index d4eeaa261d10f50bd6c4bc8a43455cb252be50cf..57085a38910d4b1f4d7682497e4d699f65416c08 100644
--- a/modules/algorithm/CMakeLists.txt
+++ b/modules/algorithm/CMakeLists.txt
@@ -13,6 +13,8 @@ set(vkcv_algorithm_sources
 		${vkcv_algorithm_source}/vkcv/algorithm/SinglePassDownsampler.cpp
 )
 
+filter_headers(vkcv_algorithm_sources ${vkcv_algorithm_include} vkcv_algorithm_headers)
+
 # Setup some path variables to load libraries
 set(vkcv_algorithm_lib lib)
 set(vkcv_algorithm_lib_path ${PROJECT_SOURCE_DIR}/${vkcv_algorithm_lib})
@@ -22,6 +24,7 @@ include(config/FidelityFX_SPD.cmake)
 
 # adding source files to the project
 add_library(vkcv_algorithm ${vkcv_build_attribute} ${vkcv_algorithm_sources})
+set_target_properties(vkcv_algorithm PROPERTIES PUBLIC_HEADER "${vkcv_algorithm_headers}")
 
 # link the required libraries to the module
 target_link_libraries(vkcv_algorithm ${vkcv_algorithm_libraries} vkcv vkcv_shader_compiler vkcv_camera vkcv_asset_loader)
@@ -39,3 +42,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_algorithm PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/algorithm)
diff --git a/modules/asset_loader/CMakeLists.txt b/modules/asset_loader/CMakeLists.txt
index 03e1888786d5382d854edaf77ee89d4e063e0fc6..9e6d400577daf07b85ee52953fab013ee23ff947 100644
--- a/modules/asset_loader/CMakeLists.txt
+++ b/modules/asset_loader/CMakeLists.txt
@@ -14,8 +14,11 @@ set(vkcv_asset_loader_sources
 		${vkcv_asset_loader_source}/vkcv/asset/asset_loader.cpp
 )
 
+filter_headers(vkcv_asset_loader_sources ${vkcv_asset_loader_include} vkcv_asset_loader_headers)
+
 # adding source files to the module
 add_library(vkcv_asset_loader ${vkcv_build_attribute} ${vkcv_asset_loader_sources})
+set_target_properties(vkcv_asset_loader PROPERTIES PUBLIC_HEADER "${vkcv_asset_loader_headers}")
 
 # Setup some path variables to load libraries
 set(vkcv_asset_loader_lib lib)
@@ -48,3 +51,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_asset_loader PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/asset)
diff --git a/modules/camera/CMakeLists.txt b/modules/camera/CMakeLists.txt
index dbe5c85c0ae839a0b0ab8c3de059c442d22f2d59..4cf68f9c4171dbd29e7b29fa2b73d20e333b2531 100644
--- a/modules/camera/CMakeLists.txt
+++ b/modules/camera/CMakeLists.txt
@@ -11,17 +11,24 @@ set(vkcv_camera_include ${PROJECT_SOURCE_DIR}/include)
 set(vkcv_camera_sources
 		${vkcv_camera_include}/vkcv/camera/Camera.hpp
 		${vkcv_camera_source}/vkcv/camera/Camera.cpp
+		
 		${vkcv_camera_include}/vkcv/camera/CameraManager.hpp
 		${vkcv_camera_source}/vkcv/camera/CameraManager.cpp
+		
 		${vkcv_camera_include}/vkcv/camera/CameraController.hpp
+		
 		${vkcv_camera_include}/vkcv/camera/PilotCameraController.hpp
 		${vkcv_camera_source}/vkcv/camera/PilotCameraController.cpp
+		
 		${vkcv_camera_include}/vkcv/camera/TrackballCameraController.hpp
 		${vkcv_camera_source}/vkcv/camera/TrackballCameraController.cpp
 )
 
+filter_headers(vkcv_camera_sources ${vkcv_camera_include} vkcv_camera_headers)
+
 # adding source files to the project
 add_library(vkcv_camera ${vkcv_build_attribute} ${vkcv_camera_sources})
+set_target_properties(vkcv_camera PROPERTIES PUBLIC_HEADER "${vkcv_camera_headers}")
 
 # Setup some path variables to load libraries
 set(vkcv_camera_lib lib)
@@ -51,3 +58,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_camera PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/camera)
diff --git a/modules/effects/CMakeLists.txt b/modules/effects/CMakeLists.txt
index ea350fd4492c201bd247a40b94273829c1654a89..94bb819d2a00443827ed40f5e015cc0745f61667 100644
--- a/modules/effects/CMakeLists.txt
+++ b/modules/effects/CMakeLists.txt
@@ -16,6 +16,8 @@ set(vkcv_effects_sources
 		${vkcv_effects_source}/vkcv/effects/BloomAndFlaresEffect.cpp
 )
 
+filter_headers(vkcv_effects_sources ${vkcv_effects_include} vkcv_effects_headers)
+
 set(vkcv_effects_shaders ${PROJECT_SOURCE_DIR}/shaders)
 
 include_shader(${vkcv_effects_shaders}/bloomDownsample.comp ${vkcv_effects_include} ${vkcv_effects_source})
@@ -35,6 +37,7 @@ list(APPEND vkcv_effects_sources ${vkcv_effects_include}/lensFlares.comp.hxx)
 
 # adding source files to the project
 add_library(vkcv_effects ${vkcv_build_attribute} ${vkcv_effects_sources})
+set_target_properties(vkcv_effects PROPERTIES PUBLIC_HEADER "${vkcv_effects_headers}")
 
 # link the required libraries to the module
 target_link_libraries(vkcv_effects ${vkcv_effects_libraries} vkcv vkcv_shader_compiler vkcv_camera vkcv_asset_loader)
@@ -52,3 +55,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_effects PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/effects)
diff --git a/modules/geometry/CMakeLists.txt b/modules/geometry/CMakeLists.txt
index ffadd9c60733aa6cadda3837e3f6a7ab4d26f3e3..13613cde71249ecafe6b99db715c4ba4579a6d64 100644
--- a/modules/geometry/CMakeLists.txt
+++ b/modules/geometry/CMakeLists.txt
@@ -11,22 +11,31 @@ set(vkcv_geometry_include ${PROJECT_SOURCE_DIR}/include)
 set(vkcv_geometry_sources
 		${vkcv_geometry_include}/vkcv/geometry/Geometry.hpp
 		${vkcv_geometry_source}/vkcv/geometry/Geometry.cpp
+		
 		${vkcv_geometry_include}/vkcv/geometry/Volume.hpp
 		${vkcv_geometry_source}/vkcv/geometry/Volume.cpp
+		
 		${vkcv_geometry_include}/vkcv/geometry/Circular.hpp
 		${vkcv_geometry_source}/vkcv/geometry/Circular.cpp
+		
 		${vkcv_geometry_include}/vkcv/geometry/Sphere.hpp
 		${vkcv_geometry_source}/vkcv/geometry/Sphere.cpp
+		
 		${vkcv_geometry_include}/vkcv/geometry/Cuboid.hpp
 		${vkcv_geometry_source}/vkcv/geometry/Cuboid.cpp
+		
 		${vkcv_geometry_include}/vkcv/geometry/Cylinder.hpp
 		${vkcv_geometry_source}/vkcv/geometry/Cylinder.cpp
+		
 		${vkcv_geometry_include}/vkcv/geometry/Teapot.hpp
 		${vkcv_geometry_source}/vkcv/geometry/Teapot.cpp
 )
 
+filter_headers(vkcv_geometry_sources ${vkcv_geometry_include} vkcv_geometry_headers)
+
 # adding source files to the project
 add_library(vkcv_geometry ${vkcv_build_attribute} ${vkcv_geometry_sources})
+set_target_properties(vkcv_geometry PROPERTIES PUBLIC_HEADER "${vkcv_geometry_headers}")
 
 # Setup some path variables to load libraries
 set(vkcv_geometry_lib lib)
@@ -56,3 +65,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_geometry PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/geometry)
diff --git a/modules/gui/CMakeLists.txt b/modules/gui/CMakeLists.txt
index 34d80c934f0444e3afb02ae3a22ec3c4a49b8eff..c442efedca8c8cdd8de7cc5c388814a3bc7fcd09 100644
--- a/modules/gui/CMakeLists.txt
+++ b/modules/gui/CMakeLists.txt
@@ -12,7 +12,9 @@ set(vkcv_gui_include ${PROJECT_SOURCE_DIR}/include)
 set(vkcv_gui_sources
 		${vkcv_gui_include}/vkcv/gui/GUI.hpp
 		${vkcv_gui_source}/vkcv/gui/GUI.cpp
-		)
+)
+
+filter_headers(vkcv_gui_sources ${vkcv_gui_include} vkcv_gui_headers)
 
 # Setup some path variables to load libraries
 set(vkcv_gui_lib lib)
@@ -23,6 +25,7 @@ include(config/ImGui.cmake)
 
 # adding source files to the module
 add_library(vkcv_gui ${vkcv_build_attribute} ${vkcv_gui_sources} ${vkcv_imgui_sources})
+set_target_properties(vkcv_gui PROPERTIES PUBLIC_HEADER "${vkcv_gui_headers}")
 
 # link the required libraries to the module
 target_link_libraries(vkcv_gui ${vkcv_gui_libraries} vkcv ${vkcv_libraries})
@@ -42,3 +45,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_gui PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/gui)
diff --git a/modules/material/CMakeLists.txt b/modules/material/CMakeLists.txt
index ee3b36e8f411f3d4d6d86a19e498f2faa0513f86..eed59f3fd2a80a00762443719ffbe8f05b625a87 100644
--- a/modules/material/CMakeLists.txt
+++ b/modules/material/CMakeLists.txt
@@ -14,8 +14,11 @@ set(vkcv_material_sources
 		${vkcv_material_source}/vkcv/material/Material.cpp
 )
 
+filter_headers(vkcv_material_sources ${vkcv_material_include} vkcv_material_headers)
+
 # adding source files to the module
 add_library(vkcv_material ${vkcv_build_attribute} ${vkcv_material_sources})
+set_target_properties(vkcv_material PROPERTIES PUBLIC_HEADER "${vkcv_material_headers}")
 
 # link the required libraries to the module
 target_link_libraries(vkcv_material vkcv ${vkcv_libraries})
@@ -33,3 +36,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_material PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/material)
diff --git a/modules/meshlet/CMakeLists.txt b/modules/meshlet/CMakeLists.txt
index a3b232e56ec86f65e1114c6ee570f512e7d3b13b..2dcec4f101fcbbc0da94e46f1da5091e7e8db4dc 100644
--- a/modules/meshlet/CMakeLists.txt
+++ b/modules/meshlet/CMakeLists.txt
@@ -17,11 +17,14 @@ set(vkcv_meshlet_sources
 		${vkcv_meshlet_source}/vkcv/meshlet/Tipsify.cpp
 
 		${vkcv_meshlet_include}/vkcv/meshlet/Forsyth.hpp
-		${vkcv_meshlet_source}/vkcv/meshlet/Forsyth.cpp)
+		${vkcv_meshlet_source}/vkcv/meshlet/Forsyth.cpp
+)
+
+filter_headers(vkcv_meshlet_sources ${vkcv_meshlet_include} vkcv_meshlet_headers)
 
 # adding source files to the module
 add_library(vkcv_meshlet ${vkcv_build_attribute} ${vkcv_meshlet_sources})
-
+set_target_properties(vkcv_meshlet PROPERTIES PUBLIC_HEADER "${vkcv_meshlet_headers}")
 
 # link the required libraries to the module
 target_link_libraries(vkcv_meshlet vkcv ${vkcv_libraries})
@@ -42,3 +45,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_meshlet PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/meshlet)
diff --git a/modules/scene/CMakeLists.txt b/modules/scene/CMakeLists.txt
index 39effd0f802bb9d8ef4b318d5f1d233fa93db492..8e1f50e0e6b62bf17019aa81b6f6fe91372ab0d8 100644
--- a/modules/scene/CMakeLists.txt
+++ b/modules/scene/CMakeLists.txt
@@ -29,8 +29,11 @@ set(vkcv_scene_sources
 		${vkcv_scene_source}/vkcv/scene/Scene.cpp
 )
 
+filter_headers(vkcv_scene_sources ${vkcv_scene_include} vkcv_scene_headers)
+
 # adding source files to the module
 add_library(vkcv_scene ${vkcv_build_attribute} ${vkcv_scene_sources})
+set_target_properties(vkcv_scene PROPERTIES PUBLIC_HEADER "${vkcv_scene_headers}")
 
 # link the required libraries to the module
 target_link_libraries(vkcv_scene vkcv)
@@ -62,3 +65,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_scene PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/scene)
diff --git a/modules/shader_compiler/CMakeLists.txt b/modules/shader_compiler/CMakeLists.txt
index 63182aaf34ad9d09d3f9a3dca7360cbed1875c04..1389e1a91866ddfaa9e273fabdc50fa0aa5dee5f 100644
--- a/modules/shader_compiler/CMakeLists.txt
+++ b/modules/shader_compiler/CMakeLists.txt
@@ -17,8 +17,11 @@ set(vkcv_shader_compiler_sources
 		${vkcv_shader_compiler_source}/vkcv/shader/GLSLCompiler.cpp
 )
 
+filter_headers(vkcv_shader_compiler_sources ${vkcv_shader_compiler_include} vkcv_shader_compiler_headers)
+
 # adding source files to the module
 add_library(vkcv_shader_compiler ${vkcv_build_attribute} ${vkcv_shader_compiler_sources})
+set_target_properties(vkcv_shader_compiler PROPERTIES PUBLIC_HEADER "${vkcv_shader_compiler_headers}")
 
 # Setup some path variables to load libraries
 set(vkcv_shader_compiler_lib lib)
@@ -43,3 +46,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_shader_compiler PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/shader)
diff --git a/modules/testing/CMakeLists.txt b/modules/testing/CMakeLists.txt
deleted file mode 100644
index 60f5a82732b9e095f05b0d6a551b825a6d05f3dd..0000000000000000000000000000000000000000
--- a/modules/testing/CMakeLists.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-cmake_minimum_required(VERSION 3.16)
-project(vkcv_testing)
-
-# setting c++ standard for the project
-set(CMAKE_CXX_STANDARD 20)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
-
-set(vkcv_testing_source ${PROJECT_SOURCE_DIR}/src)
-set(vkcv_testing_include ${PROJECT_SOURCE_DIR}/include)
-
-set(vkcv_testing_sources
-		${vkcv_testing_include}/vkcv/testing/Test.hpp
-		${vkcv_testing_source}/vkcv/testing/Test.cpp
-)
-
-# adding source files to the project
-add_library(vkcv_testing ${vkcv_build_attribute} ${vkcv_testing_sources})
-
-# add the own include directory for public headers
-target_include_directories(vkcv_testing BEFORE PUBLIC ${vkcv_testing_include})
-
-if (vkcv_parent_scope)
-	list(APPEND vkcv_modules_includes ${vkcv_testing_include})
-	list(APPEND vkcv_modules_libraries vkcv_testing)
-	
-	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
-	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
-endif()
diff --git a/modules/testing/include/vkcv/testing/Test.hpp b/modules/testing/include/vkcv/testing/Test.hpp
deleted file mode 100644
index 7f020ce4f9541f5ccc87ba7f1c63828aaece2014..0000000000000000000000000000000000000000
--- a/modules/testing/include/vkcv/testing/Test.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-namespace vkcv::testing {
-	
-	class Test {
-	private:
-	public:
-		void test(int test_value);
-		
-	};
-	
-}
diff --git a/modules/testing/src/vkcv/testing/Test.cpp b/modules/testing/src/vkcv/testing/Test.cpp
deleted file mode 100644
index 302fe986666f9dbda3d1955fc8c6720821b2d173..0000000000000000000000000000000000000000
--- a/modules/testing/src/vkcv/testing/Test.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-
-#include "vkcv/testing/Test.hpp"
-
-namespace vkcv::testing {
-	
-	void Test::test(int test_value) {
-		// TODO: this is an example
-	}
-
-}
diff --git a/modules/upscaling/CMakeLists.txt b/modules/upscaling/CMakeLists.txt
index 0a5ee06dd695a3f3596c238bc0ef4383c011cf24..825234af3ad13acc39ec31e92ed717d67ed80760 100644
--- a/modules/upscaling/CMakeLists.txt
+++ b/modules/upscaling/CMakeLists.txt
@@ -25,6 +25,8 @@ set(vkcv_upscaling_sources
 		${vkcv_upscaling_source}/vkcv/upscaling/FSR2Upscaling.cpp
 )
 
+filter_headers(vkcv_upscaling_sources ${vkcv_upscaling_include} vkcv_upscaling_headers)
+
 # Setup some path variables to load libraries
 set(vkcv_upscaling_lib lib)
 set(vkcv_upscaling_lib_path ${PROJECT_SOURCE_DIR}/${vkcv_upscaling_lib})
@@ -43,6 +45,7 @@ add_compile_definitions(${vkcv_upscaling_definitions})
 
 # adding source files to the project
 add_library(vkcv_upscaling ${vkcv_build_attribute} ${vkcv_upscaling_sources})
+set_target_properties(vkcv_upscaling PROPERTIES PUBLIC_HEADER "${vkcv_upscaling_headers}")
 
 # link the required libraries to the module
 target_link_libraries(vkcv_upscaling ${vkcv_upscaling_libraries} vkcv vkcv_shader_compiler)
@@ -60,3 +63,6 @@ if (vkcv_parent_scope)
 	set(vkcv_modules_includes ${vkcv_modules_includes} PARENT_SCOPE)
 	set(vkcv_modules_libraries ${vkcv_modules_libraries} PARENT_SCOPE)
 endif()
+
+install(TARGETS vkcv_upscaling PUBLIC_HEADER DESTINATION
+		${CMAKE_INSTALL_INCLUDEDIR}/vkcv/upscaling)
diff --git a/projects/first_triangle/CMakeLists.txt b/projects/first_triangle/CMakeLists.txt
index 660979099b0fe0096478443a86ddf48c14bd61b0..cd6c65291978a1d0d34d2320b2ab3186b8c04500 100644
--- a/projects/first_triangle/CMakeLists.txt
+++ b/projects/first_triangle/CMakeLists.txt
@@ -9,7 +9,16 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 add_project(first_triangle src/main.cpp)
 
 # including headers of dependencies and the VkCV framework
-target_include_directories(first_triangle SYSTEM BEFORE PRIVATE ${vkcv_include} ${vkcv_includes} ${vkcv_testing_include} ${vkcv_camera_include} ${vkcv_shader_compiler_include} ${vkcv_gui_include})
+target_include_directories(first_triangle SYSTEM BEFORE PRIVATE
+		${vkcv_include}
+		${vkcv_includes}
+		${vkcv_camera_include}
+		${vkcv_shader_compiler_include}
+		${vkcv_gui_include})
 
 # linking with libraries from all dependencies and the VkCV framework
-target_link_libraries(first_triangle vkcv vkcv_testing vkcv_camera vkcv_shader_compiler vkcv_gui)
+target_link_libraries(first_triangle
+		vkcv
+		vkcv_camera
+		vkcv_shader_compiler
+		vkcv_gui)
diff --git a/projects/indirect_dispatch/CMakeLists.txt b/projects/indirect_dispatch/CMakeLists.txt
index ad59d5b24efa1af1b387253b4c007fd25c50500f..e9d2689d34ff4a33851437d326a807a18296cc7f 100644
--- a/projects/indirect_dispatch/CMakeLists.txt
+++ b/projects/indirect_dispatch/CMakeLists.txt
@@ -28,7 +28,6 @@ target_sources(indirect_dispatch PRIVATE
 target_include_directories(indirect_dispatch SYSTEM BEFORE PRIVATE
 		${vkcv_include}
 		${vkcv_includes}
-		${vkcv_testing_include}
 		${vkcv_camera_include}
 		${vkcv_shader_compiler_include}
 		${vkcv_gui_include}
@@ -41,7 +40,6 @@ target_link_libraries(indirect_dispatch
 		${vkcv_libraries}
 		vkcv_asset_loader
 		${vkcv_asset_loader_libraries}
-		vkcv_testing
 		vkcv_camera
 		vkcv_shader_compiler
 		vkcv_gui
diff --git a/projects/mesh_shader/CMakeLists.txt b/projects/mesh_shader/CMakeLists.txt
index 04b632effa28101a105100c768da712676378c99..6d26631c01026f3ac521c7e5fa829ed8ebfc0112 100644
--- a/projects/mesh_shader/CMakeLists.txt
+++ b/projects/mesh_shader/CMakeLists.txt
@@ -9,7 +9,21 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 add_project(mesh_shader src/main.cpp)
 
 # including headers of dependencies and the VkCV framework
-target_include_directories(mesh_shader SYSTEM BEFORE PRIVATE ${vkcv_include} ${vkcv_includes} ${vkcv_testing_include} ${vkcv_camera_include} ${vkcv_meshlet_include} ${vkcv_shader_compiler_include} ${vkcv_gui_include})
+target_include_directories(mesh_shader SYSTEM BEFORE PRIVATE
+		${vkcv_include}
+		${vkcv_includes}
+		${vkcv_camera_include}
+		${vkcv_meshlet_include}
+		${vkcv_shader_compiler_include}
+		${vkcv_gui_include})
 
 # linking with libraries from all dependencies and the VkCV framework
-target_link_libraries(mesh_shader vkcv ${vkcv_libraries} vkcv_asset_loader ${vkcv_asset_loader_libraries} vkcv_testing vkcv_camera vkcv_meshlet vkcv_shader_compiler vkcv_gui)
\ No newline at end of file
+target_link_libraries(mesh_shader
+		vkcv
+		${vkcv_libraries}
+		vkcv_asset_loader
+		${vkcv_asset_loader_libraries}
+		vkcv_camera
+		vkcv_meshlet
+		vkcv_shader_compiler
+		vkcv_gui)
\ No newline at end of file
diff --git a/projects/particle_simulation/CMakeLists.txt b/projects/particle_simulation/CMakeLists.txt
index 860bfa15a4b77b71ac79e3433326feb6aa3d7123..ed0874fb071aadf801b03be62b7b1b8e8da47aaa 100644
--- a/projects/particle_simulation/CMakeLists.txt
+++ b/projects/particle_simulation/CMakeLists.txt
@@ -17,7 +17,6 @@ add_project(particle_simulation
 target_include_directories(particle_simulation SYSTEM BEFORE PRIVATE
 		${vkcv_include}
 		${vkcv_includes}
-		${vkcv_testing_include}
 		${vkcv_camera_include}
 		${vkcv_shader_compiler_include}
 		${vkcv_effects_include})
@@ -25,7 +24,6 @@ target_include_directories(particle_simulation SYSTEM BEFORE PRIVATE
 # linking with libraries from all dependencies and the VkCV framework
 target_link_libraries(particle_simulation
 		vkcv
-		vkcv_testing
 		vkcv_camera
 		vkcv_shader_compiler
 		vkcv_effects)
diff --git a/projects/path_tracer/CMakeLists.txt b/projects/path_tracer/CMakeLists.txt
index 56f14090ce68b91d0d7163360faaf413fb9e3de9..03e5eec5ddbada873297d53d224d57f97b4436a9 100644
--- a/projects/path_tracer/CMakeLists.txt
+++ b/projects/path_tracer/CMakeLists.txt
@@ -9,7 +9,19 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 add_project(path_tracer src/main.cpp)
 
 # including headers of dependencies and the VkCV framework
-target_include_directories(path_tracer SYSTEM BEFORE PRIVATE ${vkcv_include} ${vkcv_includes} ${vkcv_testing_include} ${vkcv_asset_loader_include} ${vkcv_camera_include} ${vkcv_shader_compiler_include} ${vkcv_gui_include})
+target_include_directories(path_tracer SYSTEM BEFORE PRIVATE
+		${vkcv_include}
+		${vkcv_includes}
+		${vkcv_asset_loader_include}
+		${vkcv_camera_include}
+		${vkcv_shader_compiler_include}
+		${vkcv_gui_include})
 
 # linking with libraries from all dependencies and the VkCV framework
-target_link_libraries(path_tracer vkcv vkcv_testing vkcv_asset_loader ${vkcv_asset_loader_libraries} vkcv_camera vkcv_shader_compiler vkcv_gui)
+target_link_libraries(path_tracer
+		vkcv
+		vkcv_asset_loader
+		${vkcv_asset_loader_libraries}
+		vkcv_camera
+		vkcv_shader_compiler
+		vkcv_gui)
diff --git a/projects/ray_tracer/CMakeLists.txt b/projects/ray_tracer/CMakeLists.txt
index 8c8d80b45e2c0f1ec160d509b194b8339da1205f..351fae3dfb9fe5c49c29840da9564ec4b38cc99a 100644
--- a/projects/ray_tracer/CMakeLists.txt
+++ b/projects/ray_tracer/CMakeLists.txt
@@ -9,7 +9,17 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 add_project(ray_tracer src/main.cpp "src/scene.hpp")
 
 # including headers of dependencies and the VkCV framework
-target_include_directories(ray_tracer SYSTEM BEFORE PRIVATE ${vkcv_include} ${vkcv_includes} ${vkcv_testing_include} ${vkcv_asset_loader_include} ${vkcv_camera_include} ${vkcv_shader_compiler_include})
+target_include_directories(ray_tracer SYSTEM BEFORE PRIVATE
+		${vkcv_include}
+		${vkcv_includes}
+		${vkcv_asset_loader_include}
+		${vkcv_camera_include}
+		${vkcv_shader_compiler_include})
 
 # linking with libraries from all dependencies and the VkCV framework
-target_link_libraries(ray_tracer vkcv vkcv_testing vkcv_asset_loader ${vkcv_asset_loader_libraries} vkcv_camera vkcv_shader_compiler)
+target_link_libraries(ray_tracer
+		vkcv
+		vkcv_asset_loader
+		${vkcv_asset_loader_libraries}
+		vkcv_camera
+		vkcv_shader_compiler)
diff --git a/projects/sph/CMakeLists.txt b/projects/sph/CMakeLists.txt
index 685004f7be9d8f4ef3e0409543dbb0f964d55e9c..01a6e083116622965b9f58c2837f6287871da50e 100644
--- a/projects/sph/CMakeLists.txt
+++ b/projects/sph/CMakeLists.txt
@@ -17,7 +17,6 @@ add_project(sph
 target_include_directories(sph SYSTEM BEFORE PRIVATE
 		${vkcv_include}
 		${vkcv_includes}
-		${vkcv_testing_include}
 		${vkcv_camera_include}
 		${vkcv_shader_compiler_include}
 		${vkcv_effects_include})
@@ -25,7 +24,6 @@ target_include_directories(sph SYSTEM BEFORE PRIVATE
 # linking with libraries from all dependencies and the VkCV framework
 target_link_libraries(sph
 		vkcv
-		vkcv_testing
 		vkcv_camera
 		vkcv_shader_compiler
 		vkcv_effects)