diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index ad75a3eaaed4a578bfa9f60ab6f4b69eb723059d..54a6e03c075fb92ef4c9d3347078f703e4777959 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -754,7 +754,7 @@ int main(int argc, const char **argv) {
 			voxelHeight
 	);
 	
-	voxelImageConfig.setSupportingStorage(true);
+	voxelSamplesConfig.setSupportingStorage(true);
 	
 	vkcv::Image voxelSamples = vkcv::image(
 			core,
diff --git a/projects/head_demo/src/main.cpp b/projects/head_demo/src/main.cpp
index b3ed708e008ca10b9095a71de180f4615772505f..771689e95dac49f96d1d308de9aedf3c19f43e15 100644
--- a/projects/head_demo/src/main.cpp
+++ b/projects/head_demo/src/main.cpp
@@ -17,12 +17,20 @@ int main(int argc, const char** argv) {
 	uint32_t windowWidth = 800;
 	uint32_t windowHeight = 600;
 	
+	vkcv::Features features;
+	features.requireExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
+	
+	features.requireFeature([](vk::PhysicalDeviceFeatures& features) {
+		features.setGeometryShader(true);
+	});
+	
 	vkcv::Core core = vkcv::Core::create(
 			applicationName,
 			VK_MAKE_VERSION(0, 0, 1),
 			{vk::QueueFlagBits::eTransfer, vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eCompute},
-			{ VK_KHR_SWAPCHAIN_EXTENSION_NAME }
+			features
 	);
+	
 	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, true);
 	vkcv::Window& window = core.getWindow(windowHandle);
 	vkcv::camera::CameraManager cameraManager(window);
diff --git a/projects/indirect_dispatch/src/App.cpp b/projects/indirect_dispatch/src/App.cpp
index 18a6b9ad5d807758c5123d45bf9408364f89fa6d..b441c3dda9f51f3cb3c51c15ea29d8069d4ec6ac 100644
--- a/projects/indirect_dispatch/src/App.cpp
+++ b/projects/indirect_dispatch/src/App.cpp
@@ -27,6 +27,38 @@ const char* MotionBlurModeLabels[3] = {
 		"Tile visualisation"
 };
 
+static vkcv::Features getAppFeatures() {
+	vkcv::Features features;
+	features.requireExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
+	
+	features.requireFeature([](vk::PhysicalDeviceFeatures& features) {
+		features.setShaderInt16(true);
+	});
+	
+	features.requireExtensionFeature<vk::PhysicalDeviceSubgroupSizeControlFeatures>(
+			VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME,
+			[](vk::PhysicalDeviceSubgroupSizeControlFeatures &features) {
+				features.setSubgroupSizeControl(true);
+			}
+	);
+	
+	features.requireExtensionFeature<vk::PhysicalDeviceShaderFloat16Int8Features>(
+			VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME,
+			[](vk::PhysicalDeviceShaderFloat16Int8Features &features) {
+				features.setShaderFloat16(true);
+			}
+	);
+	
+	features.tryExtensionFeature<vk::PhysicalDeviceCoherentMemoryFeaturesAMD>(
+			VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME,
+			[](vk::PhysicalDeviceCoherentMemoryFeaturesAMD &features) {
+				features.setDeviceCoherentMemory(true);
+			}
+	);
+	
+	return features;
+}
+
 App::App() : 
 	m_applicationName("Indirect Dispatch"),
 	m_windowWidth(AppConfig::defaultWindowWidth),
@@ -35,7 +67,7 @@ App::App() :
 		m_applicationName,
 		VK_MAKE_VERSION(0, 0, 1),
 		{ vk::QueueFlagBits::eGraphics ,vk::QueueFlagBits::eCompute , vk::QueueFlagBits::eTransfer },
-		{ VK_KHR_SWAPCHAIN_EXTENSION_NAME })),
+		getAppFeatures())),
 	m_windowHandle(m_core.createWindow(m_applicationName, m_windowWidth, m_windowHeight, true)),
 	m_cameraManager(m_core.getWindow(m_windowHandle)){}
 
diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index 6b6e2eea46dd6d0e87d2cb8e33ce4c69c4429ca1..fe58a620b37b7d0d2bc93a59536b50317729baf8 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -25,6 +25,12 @@ int main(int argc, const char** argv) {
 	vkcv::Features features;
 	features.requireExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
 	
+	features.requireFeature([](vk::PhysicalDeviceFeatures& features) {
+		features.setGeometryShader(true);
+		features.setDepthClamp(true);
+		features.setShaderInt16(true);
+	});
+	
 	features.requireExtensionFeature<vk::PhysicalDeviceDescriptorIndexingFeatures>(
 			VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME,
 			[](vk::PhysicalDeviceDescriptorIndexingFeatures& features) {
diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp
index c26bf632e3278364f61e77a66745f75c1ccc3684..1d92268e244d62e6efc71bc2c9a3a6387bb5e7f0 100644
--- a/src/vkcv/Context.cpp
+++ b/src/vkcv/Context.cpp
@@ -409,58 +409,6 @@ namespace vkcv {
 		featureManager.useExtension("VK_KHR_portability_subset", true);
 #endif
 
-		if (featureManager.useExtension(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, false)) {
-			featureManager.useFeatures<vk::PhysicalDeviceShaderFloat16Int8Features>(
-				[](vk::PhysicalDeviceShaderFloat16Int8Features &features) {
-					features.setShaderFloat16(true);
-				},
-				false
-			);
-		}
-
-		if (featureManager.useExtension(VK_KHR_16BIT_STORAGE_EXTENSION_NAME, false)) {
-			featureManager.useFeatures<vk::PhysicalDevice16BitStorageFeatures>(
-				[](vk::PhysicalDevice16BitStorageFeatures &features) {
-					features.setStorageBuffer16BitAccess(true);
-				},
-				false
-			);
-		}
-		
-		if (featureManager.useExtension(VK_AMD_DEVICE_COHERENT_MEMORY_EXTENSION_NAME, false)) {
-			featureManager.useFeatures<vk::PhysicalDeviceCoherentMemoryFeaturesAMD>(
-				[](vk::PhysicalDeviceCoherentMemoryFeaturesAMD &features) {
-					features.setDeviceCoherentMemory(true);
-				},
-				false
-			);
-		}
-		
-		if (featureManager.useExtension(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false)) {
-			featureManager.useFeatures<vk::PhysicalDeviceSubgroupSizeControlFeatures>(
-					[](vk::PhysicalDeviceSubgroupSizeControlFeatures &features) {
-						features.setSubgroupSizeControl(true);
-					},
-					false
-			);
-		}
-		
-		if (featureManager.useExtension(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, false)) {
-			featureManager.useFeatures<vk::PhysicalDeviceIndexTypeUint8FeaturesEXT>(
-				[](vk::PhysicalDeviceIndexTypeUint8FeaturesEXT &features) {
-					features.setIndexTypeUint8(true);
-				},
-				false
-			);
-		}
-
-		featureManager.useFeatures([](vk::PhysicalDeviceFeatures &features) {
-			features.setFragmentStoresAndAtomics(true);
-			features.setGeometryShader(true);
-			features.setDepthClamp(true);
-			features.setShaderInt16(true);
-		});
-
 		for (const auto &feature : features.getList()) {
 			feature(featureManager);
 		}