diff --git a/modules/camera/include/vkcv/camera/CameraHandle.hpp b/modules/camera/include/vkcv/camera/CameraHandle.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b681f93cb0e753af8d383f890ccc263ed650f998
--- /dev/null
+++ b/modules/camera/include/vkcv/camera/CameraHandle.hpp
@@ -0,0 +1,31 @@
+#pragma once
+/**
+ * @authors Tobias Frisch
+ * @file include/vkcv/camera/CameraHandle.hpp
+ * @brief CameraHandle class of the camera module for the vkcv framework.
+ */
+
+#include <vkcv/Handles.hpp>
+
+namespace vkcv::camera {
+	
+	/**
+     * @addtogroup vkcv_camera
+     * @{
+     */
+	
+	class CameraManager;
+	
+	/**
+	 * @brief Handle class for cameras.
+	 */
+	class CameraHandle : public Handle {
+		friend class CameraManager;
+	
+	private:
+		using Handle::Handle;
+	};
+	
+	/** @} */
+	
+}
\ No newline at end of file
diff --git a/modules/camera/include/vkcv/camera/CameraManager.hpp b/modules/camera/include/vkcv/camera/CameraManager.hpp
index 092e1fc8552a192368b06216e2f51d2b291946d7..c54ec94094d7ed13775832cd57b7aa77cf92ef80 100644
--- a/modules/camera/include/vkcv/camera/CameraManager.hpp
+++ b/modules/camera/include/vkcv/camera/CameraManager.hpp
@@ -6,10 +6,14 @@
  * controller objects. Camera objects can be created and bound to a specific camera controller via this class.
  */
 
+#include "CameraHandle.hpp"
+#include "ControllerType.hpp"
 #include "PilotCameraController.hpp"
 #include "TrackballCameraController.hpp"
 #include "CameraController.hpp"
+
 #include "vkcv/Window.hpp"
+
 #include <GLFW/glfw3.h>
 #include <functional>
 
@@ -20,17 +24,6 @@ namespace vkcv::camera {
      * @{
      */
 
-    /**
-     * @brief Used for specifying existing types of camera controllers when adding a new controller object to the
-     * #CameraManager.
-     */
-    enum class ControllerType {
-        NONE,
-        PILOT,
-        TRACKBALL,
-        TRACE
-    };
-
     /**
      * @brief Used for managing an arbitrary amount of camera controllers.
      */
@@ -46,7 +39,7 @@ namespace vkcv::camera {
         Window& m_window;
         std::vector<Camera> m_cameras;
         std::vector<ControllerType> m_cameraControllerTypes;
-        uint32_t m_activeCameraIndex;
+        uint64_t m_activeCameraIndex;
 
         PilotCameraController m_pilotController;
         TrackballCameraController m_trackController;
@@ -140,26 +133,26 @@ namespace vkcv::camera {
          * @brief Adds a new camera object to the #CameraManager and binds it to a camera controller object of specified
          * @p controllerType.
          * @param[in] controllerType The type of the camera controller.
-         * @return The index of the newly created camera object.
+         * @return The handle of the newly created camera object.
          */
-		uint32_t addCamera(ControllerType controllerType = ControllerType::NONE);
+		CameraHandle addCamera(ControllerType controllerType = ControllerType::NONE);
 	
 		/**
 		 * @brief Adds a new camera object to the #CameraManager and binds it to a camera controller object of specified
 		 * @p controllerType.
 		 * @param[in] controllerType The type of the camera controller.
 		 * @param[in] camera The new camera object.
-		 * @return The index of the newly bound camera object.
+		 * @return The handle of the newly bound camera object.
 		 */
-		uint32_t addCamera(ControllerType controllerType, const Camera& camera);
+		CameraHandle addCamera(ControllerType controllerType, const Camera& camera);
 
         /**
-         * @brief Gets the stored camera object located at @p cameraIndex.
-         * @param[in] cameraIndex The camera index.
-         * @return The camera object at @p cameraIndex.
-         * @throws std::runtime_error If @p cameraIndex is not a valid camera index.
+         * @brief Gets the stored camera object located by @p cameraHandle.
+         * @param[in] cameraHandle The camera handle.
+         * @return The camera object by @p cameraHandle.
+         * @throws std::runtime_error If @p cameraHandle is not a valid camera handle.
          */
-        Camera& getCamera(uint32_t cameraIndex);
+        Camera& getCamera(const CameraHandle& cameraHandle);
 
         /**
          * @brief Gets the stored camera object set as the active camera.
@@ -168,34 +161,34 @@ namespace vkcv::camera {
         Camera& getActiveCamera();
 
         /**
-         * @brief Sets the stored camera object located at @p cameraIndex as the active camera.
-         * @param[in] cameraIndex The camera index.
-         * @throws std::runtime_error If @p cameraIndex is not a valid camera index.
+         * @brief Sets the stored camera object located at @p cameraHandle as the active camera.
+         * @param[in] cameraHandle The camera handle.
+         * @throws std::runtime_error If @p cameraHandle is not a valid camera handle.
          */
-        void setActiveCamera(uint32_t cameraIndex);
+        void setActiveCamera(const CameraHandle& cameraHandle);
 
         /**
-         * @brief Gets the index of the stored active camera object.
-         * @return The active camera index.
+         * @brief Gets the handle of the stored active camera object.
+         * @return The active camera handle.
          */
-        uint32_t getActiveCameraIndex() const;
+		CameraHandle getActiveCameraHandle() const;
 
         /**
-         * @brief Binds a stored camera object located at @p cameraIndex to a camera controller of specified
+         * @brief Binds a stored camera object located by @p cameraHandle to a camera controller of specified
          * @p controllerType.
-         * @param[in] cameraIndex The camera index.
+         * @param[in] cameraHandle The camera handle.
          * @param[in] controllerType The type of the camera controller.
-         * @throws std::runtime_error If @p cameraIndex is not a valid camera index.
+         * @throws std::runtime_error If @p cameraHandle is not a valid camera handle.
          */
-        void setControllerType(uint32_t cameraIndex, ControllerType controllerType);
+        void setControllerType(const CameraHandle& cameraHandle, ControllerType controllerType);
 
         /**
-         * @brief Gets the currently bound camera controller type of the stored camera object located at @p cameraIndex.
-         * @param[in] cameraIndex The camera index.
+         * @brief Gets the currently bound camera controller type of the stored camera object located by @p cameraHandle.
+         * @param[in] cameraHandle The camera handle.
          * @return The type of the camera controller of the specified camera object.
-         * @throws std::runtime_error If @p cameraIndex is not a valid camera index.
+         * @throws std::runtime_error If @p cameraHandle is not a valid camera handle.
          */
-        ControllerType getControllerType(uint32_t cameraIndex);
+        ControllerType getControllerType(const CameraHandle& cameraHandle);
 
         /**
          * @brief Updates all stored camera controllers in respect to @p deltaTime.
diff --git a/modules/camera/include/vkcv/camera/ControllerType.hpp b/modules/camera/include/vkcv/camera/ControllerType.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..c1a5ef34bf8172956d5c9812f45b73f746c48838
--- /dev/null
+++ b/modules/camera/include/vkcv/camera/ControllerType.hpp
@@ -0,0 +1,28 @@
+#pragma once
+/**
+ * @authors Tobias Frisch
+ * @file include/vkcv/camera/ControllerType.hpp
+ * @brief ControllerType enum of the camera module for the vkcv framework.
+ */
+
+namespace vkcv::camera {
+	
+	/**
+     * @addtogroup vkcv_camera
+     * @{
+     */
+	
+	/**
+     * @brief Used for specifying existing types of camera controllers when adding a new controller object to the
+     * #CameraManager.
+     */
+	enum class ControllerType {
+		NONE,
+		PILOT,
+		TRACKBALL,
+		TRACE
+	};
+	
+	/** @} */
+	
+}
diff --git a/modules/camera/src/vkcv/camera/CameraManager.cpp b/modules/camera/src/vkcv/camera/CameraManager.cpp
index 4c713c29e5dad7b72bbdbb1372e4cf0f5bb3d162..a2ead14ce30d8088ea77ecbfd20d5af29c2c181d 100644
--- a/modules/camera/src/vkcv/camera/CameraManager.cpp
+++ b/modules/camera/src/vkcv/camera/CameraManager.cpp
@@ -35,8 +35,8 @@ namespace vkcv::camera {
 
     void CameraManager::resizeCallback(int width, int height) {
         if (glfwGetWindowAttrib(m_window.getWindow(), GLFW_ICONIFIED) == GLFW_FALSE) {
-            for (size_t i = 0; i < m_cameras.size(); i++) {
-                getCamera(i).setRatio(static_cast<float>(width) / static_cast<float>(height));;
+            for (auto& camera : m_cameras) {
+				camera.setRatio(static_cast<float>(width) / static_cast<float>(height));;
             }
         }
     }
@@ -110,67 +110,67 @@ namespace vkcv::camera {
     }
 
     CameraController& CameraManager::getActiveController() {
-    	const ControllerType type = getControllerType(getActiveCameraIndex());
+    	const ControllerType type = getControllerType(getActiveCameraHandle());
     	return getControllerByType(type);
     }
 	
-	uint32_t CameraManager::addCamera(ControllerType controllerType) {
+	CameraHandle CameraManager::addCamera(ControllerType controllerType) {
     	const float ratio = static_cast<float>(m_window.getWidth()) / static_cast<float>(m_window.getHeight());
     	
         Camera camera;
         camera.setPerspective(glm::radians(60.0f), ratio, 0.1f, 10.0f);
         return addCamera(controllerType, camera);
     }
-    
-    uint32_t CameraManager::addCamera(ControllerType controllerType, const Camera &camera) {
+	
+	CameraHandle CameraManager::addCamera(ControllerType controllerType, const Camera &camera) {
     	const uint32_t index = static_cast<uint32_t>(m_cameras.size());
     	m_cameras.push_back(camera);
 		m_cameraControllerTypes.push_back(controllerType);
-		return index;
+		return CameraHandle(index);
     }
 
-    Camera& CameraManager::getCamera(uint32_t cameraIndex) {
-        if (cameraIndex < 0 || cameraIndex >= m_cameras.size()) {
+    Camera& CameraManager::getCamera(const CameraHandle& cameraHandle) {
+        if (cameraHandle.getId() < 0 || cameraHandle.getId() >= m_cameras.size()) {
         	vkcv_log(LogLevel::ERROR, "Invalid camera index: The index must range from 0 to %lu", m_cameras.size());
         	return getActiveCamera();
         }
         
-        return m_cameras[cameraIndex];
+        return m_cameras[cameraHandle.getId()];
     }
 
     Camera& CameraManager::getActiveCamera() {
-        return m_cameras[getActiveCameraIndex()];
+        return m_cameras[m_activeCameraIndex];
     }
 
-    void CameraManager::setActiveCamera(uint32_t cameraIndex) {
-        if (cameraIndex < 0 || cameraIndex >= m_cameras.size()) {
+    void CameraManager::setActiveCamera(const CameraHandle& cameraHandle) {
+        if (cameraHandle.getId() < 0 || cameraHandle.getId() >= m_cameras.size()) {
 			vkcv_log(LogLevel::ERROR, "Invalid camera index: The index must range from 0 to %lu", m_cameras.size());
 			return;
         }
         
-        m_activeCameraIndex = cameraIndex;
+        m_activeCameraIndex = cameraHandle.getId();
     }
 
-    uint32_t CameraManager::getActiveCameraIndex() const {
-        return m_activeCameraIndex;
+    CameraHandle CameraManager::getActiveCameraHandle() const {
+        return CameraHandle(m_activeCameraIndex);
     }
 
-    void CameraManager::setControllerType(uint32_t cameraIndex, ControllerType controllerType) {
-        if (cameraIndex < 0 || cameraIndex >= m_cameras.size()) {
+    void CameraManager::setControllerType(const CameraHandle& cameraHandle, ControllerType controllerType) {
+        if (cameraHandle.getId() < 0 || cameraHandle.getId() >= m_cameras.size()) {
 			vkcv_log(LogLevel::ERROR, "Invalid camera index: The index must range from 0 to %lu", m_cameras.size());
 			return;
         }
         
-        m_cameraControllerTypes[cameraIndex] = controllerType;
+        m_cameraControllerTypes[cameraHandle.getId()] = controllerType;
     }
 
-    ControllerType CameraManager::getControllerType(uint32_t cameraIndex) {
-        if (cameraIndex < 0 || cameraIndex >= m_cameras.size()) {
+    ControllerType CameraManager::getControllerType(const CameraHandle& cameraHandle) {
+        if (cameraHandle.getId() < 0 || cameraHandle.getId() >= m_cameras.size()) {
 			vkcv_log(LogLevel::ERROR, "Invalid camera index: The index must range from 0 to %lu", m_cameras.size());
 			return ControllerType::NONE;
         }
         
-        return m_cameraControllerTypes[cameraIndex];
+        return m_cameraControllerTypes[cameraHandle.getId()];
     }
 
     CameraController& CameraManager::getControllerByType(ControllerType controllerType) {
diff --git a/projects/bindless_textures/src/main.cpp b/projects/bindless_textures/src/main.cpp
index d4cb8d68ed783ccdac10f87311813d1b7d9f0959..42af6910cd0102f01df29d470269882ebd1cb0d0 100644
--- a/projects/bindless_textures/src/main.cpp
+++ b/projects/bindless_textures/src/main.cpp
@@ -213,10 +213,10 @@ int main(int argc, const char** argv) {
 	drawcall.useDescriptorSet(0, descriptorSet);
 
     vkcv::camera::CameraManager cameraManager(window);
-    uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+    auto camHandle0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 	
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -3));
+	cameraManager.getCamera(camHandle0).setPosition(glm::vec3(0, 0, -3));
 	
 	core.run([&](const vkcv::WindowHandle &windowHandle, double t, double dt,
 				 uint32_t swapchainWidth, uint32_t swapchainHeight) {
diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index 738723ff7ee7974b33bc13d0f825258fb9f8048b..472b781905fc446c592bef74bc0262792e8c3988 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -213,17 +213,17 @@ int main(int argc, const char **argv) {
 	vkcv::Window& window = core.getWindow (windowHandle);
 	vkcv::camera::CameraManager cameraManager (window);
 	
-	uint32_t trackballIdx = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
-	cameraManager.getCamera(trackballIdx).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));   // set camera to look at the center of the particle volume
-	uint32_t pilotIdx = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	auto trackballHandle = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+	auto pilotHandle = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	
-	cameraManager.getCamera(trackballIdx).setNearFar(0.1f, 50.0f);
-	cameraManager.getCamera(trackballIdx).setPosition(glm::vec3(0, 0, -25));
+	cameraManager.getCamera(trackballHandle).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));   // set camera to look at the center of the particle volume
+	cameraManager.getCamera(trackballHandle).setNearFar(0.1f, 50.0f);
+	cameraManager.getCamera(trackballHandle).setPosition(glm::vec3(0, 0, -25));
 	
-	cameraManager.getCamera(pilotIdx).setNearFar(0.1f, 50.0f);
-	cameraManager.getCamera(pilotIdx).setPosition(glm::vec3(0, 0, 25));
+	cameraManager.getCamera(pilotHandle).setNearFar(0.1f, 50.0f);
+	cameraManager.getCamera(pilotHandle).setPosition(glm::vec3(0, 0, 25));
 	
-	cameraManager.setActiveCamera(pilotIdx);
+	cameraManager.setActiveCamera(pilotHandle);
 	
 	vkcv::gui::GUI gui (core, windowHandle);
 	vkcv::shader::GLSLCompiler compiler;
diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp
index e043494492ab65b529d17e97ce6ccafbc5a71b8d..4ab560c4dbddc67c9b1d9b1721ffa5efb33e0af4 100644
--- a/projects/first_mesh/src/main.cpp
+++ b/projects/first_mesh/src/main.cpp
@@ -146,9 +146,9 @@ int main(int argc, const char** argv) {
 	drawcall.useDescriptorSet(0, descriptorSet);
 
     vkcv::camera::CameraManager cameraManager(window);
-    uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+    auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -3));
+	cameraManager.getCamera(camHandle).setPosition(glm::vec3(0, 0, -3));
 	
 	core.run([&](const vkcv::WindowHandle &windowHandle, double t, double dt,
 				 uint32_t swapchainWidth, uint32_t swapchainHeight) {
diff --git a/projects/first_scene/src/main.cpp b/projects/first_scene/src/main.cpp
index bcd6b6ae0ec16346bcbd6cb5ba53631b3cdbde88..7867bc6ef2cb711c949d24a2827460b1de1b4729 100644
--- a/projects/first_scene/src/main.cpp
+++ b/projects/first_scene/src/main.cpp
@@ -37,13 +37,13 @@ int main(int argc, const char** argv) {
 
     vkcv::gui::GUI gui (core, windowHandle);
 
-    uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
-	uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+    auto camHandle0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	auto camHandle1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 	
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(-8, 1, -0.5));
-	cameraManager.getCamera(camIndex0).setNearFar(0.1f, 30.0f);
+	cameraManager.getCamera(camHandle0).setPosition(glm::vec3(-8, 1, -0.5));
+	cameraManager.getCamera(camHandle0).setNearFar(0.1f, 30.0f);
 	
-	cameraManager.getCamera(camIndex1).setNearFar(0.1f, 30.0f);
+	cameraManager.getCamera(camHandle1).setNearFar(0.1f, 30.0f);
 
 	vkcv::scene::Scene scene = vkcv::scene::Scene::load(
 			core,
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 5d249d04525ed7da820ff34382462bd82e8b450f..aae046da7f84bcf26017f5fe609732aa2e0e4df7 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -66,9 +66,9 @@ int main(int argc, const char** argv) {
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
     vkcv::camera::CameraManager cameraManager(window);
-    uint32_t camIndex = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+    auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	
-	cameraManager.getCamera(camIndex).setPosition(glm::vec3(0, 0, -2));
+	cameraManager.getCamera(camHandle).setPosition(glm::vec3(0, 0, -2));
 
 	core.run([&](const vkcv::WindowHandle &windowHandle, double t, double dt,
 			uint32_t swapchainWidth, uint32_t swapchainHeight) {
diff --git a/projects/head_demo/src/main.cpp b/projects/head_demo/src/main.cpp
index de0cfdbb12e0177aa9ec1cfacd5a4040772e232e..1b6533cfdd3726ad8b1901ae5bbb800d5c65b81d 100644
--- a/projects/head_demo/src/main.cpp
+++ b/projects/head_demo/src/main.cpp
@@ -30,13 +30,13 @@ int main(int argc, const char** argv) {
 	
 	vkcv::gui::GUI gui (core, windowHandle);
 	
-	uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
-	uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+	auto camHandle0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	auto camHandle1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 	
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(15.5f, 0, 0));
-	cameraManager.getCamera(camIndex0).setNearFar(0.1f, 30.0f);
+	cameraManager.getCamera(camHandle0).setPosition(glm::vec3(15.5f, 0, 0));
+	cameraManager.getCamera(camHandle0).setNearFar(0.1f, 30.0f);
 	
-	cameraManager.getCamera(camIndex1).setNearFar(0.1f, 30.0f);
+	cameraManager.getCamera(camHandle1).setNearFar(0.1f, 30.0f);
 	
 	vkcv::scene::Scene scene = vkcv::scene::Scene::load(
 			core,
diff --git a/projects/indirect_dispatch/src/App.cpp b/projects/indirect_dispatch/src/App.cpp
index c52acec190bb1a6e405107b4b231922fc6bad846..f17a3df647359018411e5bebcc3175295359678b 100644
--- a/projects/indirect_dispatch/src/App.cpp
+++ b/projects/indirect_dispatch/src/App.cpp
@@ -66,9 +66,9 @@ bool App::initialize() {
 	m_linearSampler = vkcv::samplerLinear(m_core, true);
 	m_renderTargets = createRenderTargets(m_core, m_windowWidth, m_windowHeight);
 
-	const int cameraIndex = m_cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
-	m_cameraManager.getCamera(cameraIndex).setPosition(glm::vec3(0, 1, -3));
-	m_cameraManager.getCamera(cameraIndex).setNearFar(0.1f, 30.f);
+	auto cameraHandle = m_cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	m_cameraManager.getCamera(cameraHandle).setPosition(glm::vec3(0, 1, -3));
+	m_cameraManager.getCamera(cameraHandle).setNearFar(0.1f, 30.f);
 	
 	vkcv::DescriptorWrites meshPassDescriptorWrites;
 	meshPassDescriptorWrites.writeSampledImage(0, m_gridTexture);
diff --git a/projects/indirect_draw/src/main.cpp b/projects/indirect_draw/src/main.cpp
index 5519ac41cdd0793b846438658a5ebd0f31a18499..5951c8c0653011810902a6e8499d02c96d07fd1c 100644
--- a/projects/indirect_draw/src/main.cpp
+++ b/projects/indirect_draw/src/main.cpp
@@ -505,10 +505,10 @@ int main(int argc, const char** argv) {
     }
 
     vkcv::camera::CameraManager cameraManager (window);
-    uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+    auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -3));
-	cameraManager.getCamera(camIndex0).setNearFar(0.1f, 20.f);
+	cameraManager.getCamera(camHandle).setPosition(glm::vec3(0, 0, -3));
+	cameraManager.getCamera(camHandle).setNearFar(0.1f, 20.f);
 
     vkcv::ImageHandle depthBuffer;
 	
@@ -518,7 +518,7 @@ int main(int argc, const char** argv) {
     ceiledDispatchCount = std::ceil(ceiledDispatchCount);
     const vkcv::DispatchSize dispatchCount = static_cast<uint32_t>(ceiledDispatchCount);
 
-    vkcv::DescriptorSetUsage cullingUsage (0, cullingDescSet, {});
+    vkcv::DescriptorSetUsage cullingUsage = vkcv::useDescriptorSet(0, cullingDescSet);
     vkcv::PushConstants emptyPushConstant(0);
 
     bool updateFrustumPlanes    = true;
diff --git a/projects/mesh_shader/src/main.cpp b/projects/mesh_shader/src/main.cpp
index 1c743d168eeefa8531c18cf64dae23c71f6f7893..512e1e6d1e6ea694289cb862ecae425b6bf8ee66 100644
--- a/projects/mesh_shader/src/main.cpp
+++ b/projects/mesh_shader/src/main.cpp
@@ -310,9 +310,9 @@ int main(int argc, const char** argv) {
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
 	vkcv::camera::CameraManager cameraManager(window);
-	uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -2));
+	cameraManager.getCamera(camHandle).setPosition(glm::vec3(0, 0, -2));
 
 	bool useMeshShader          = true;
 	bool updateFrustumPlanes    = true;
diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index 0c581f2c086cf78e082cf8cb75c0f784109e6f4b..00bb497b9798064c4b5ac449d6bac8495a1783e8 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -194,17 +194,17 @@ int main(int argc, const char **argv) {
 	drawcall.useDescriptorSet(0, descriptorSet);
 	
     glm::vec4 colorData = glm::vec4(1.0f, 1.0f, 0.0f, 1.0f);
-    uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
-    uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+    auto camHandle0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+    auto camHandle1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 
-    cameraManager.getCamera(camIndex0).setNearFar(0.1, 30);
-    cameraManager.getCamera(camIndex1).setNearFar(0.1, 30);
+    cameraManager.getCamera(camHandle0).setNearFar(0.1, 30);
+    cameraManager.getCamera(camHandle0).setNearFar(0.1, 30);
 
-    cameraManager.setActiveCamera(1);
+    cameraManager.setActiveCamera(camHandle1);
 
-    cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -2));
-    cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, -2.0f));
-    cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));
+    cameraManager.getCamera(camHandle1).setPosition(glm::vec3(0, 0, -2));
+    cameraManager.getCamera(camHandle1).setPosition(glm::vec3(0.0f, 0.0f, -2.0f));
+    cameraManager.getCamera(camHandle1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));
 
 	const auto swapchainExtent = core.getSwapchainExtent(window.getSwapchain());
 	
diff --git a/projects/path_tracer/src/main.cpp b/projects/path_tracer/src/main.cpp
index 1ce693997a8c4f75978705194edc0f9ba527f725..53f52c3d724b8db14641108d9b8a0e33e1844600 100644
--- a/projects/path_tracer/src/main.cpp
+++ b/projects/path_tracer/src/main.cpp
@@ -219,9 +219,9 @@ int main(int argc, const char** argv) {
 	}
 
 	vkcv::camera::CameraManager cameraManager(core.getWindow(windowHandle));
-	uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -2));
+	cameraManager.getCamera(camHandle).setPosition(glm::vec3(0, 0, -2));
 	
 	int     frameIndex      = 0;
 	bool    clearMeanImage  = true;
diff --git a/projects/rtx_ambient_occlusion/src/main.cpp b/projects/rtx_ambient_occlusion/src/main.cpp
index b04a39350165481e78c34e2083f3c4b7434a2972..f5d8a46feefd070967d0f68742ad0c3b2749f160 100644
--- a/projects/rtx_ambient_occlusion/src/main.cpp
+++ b/projects/rtx_ambient_occlusion/src/main.cpp
@@ -35,8 +35,8 @@ int main(int argc, const char** argv) {
 	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, 800, 600, true);
 
 	vkcv::camera::CameraManager cameraManager(core.getWindow(windowHandle));
-	uint32_t camIndex = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
-	cameraManager.getCamera(camIndex).setNearFar(0.1f, 30.0f);
+	auto camHandle = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+	cameraManager.getCamera(camHandle).setNearFar(0.1f, 30.0f);
 	
     // get Teapot vertices and indices
     Teapot teapot;
diff --git a/projects/saf_r/src/main.cpp b/projects/saf_r/src/main.cpp
index 5f95aa9a0607eb723143d4bdf07784cb41a5862e..fce53bd68b38d3dd0c1fcfc2cb18c49722ee300e 100644
--- a/projects/saf_r/src/main.cpp
+++ b/projects/saf_r/src/main.cpp
@@ -190,12 +190,13 @@ int main(int argc, const char** argv) {
 
 	//create the camera
 	vkcv::camera::CameraManager cameraManager(window);
-	uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
-	uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+	auto camHandle0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	auto camHandle1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 
-	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, 2));
-	cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, 0.0f));
-	cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, -1.0f));
+	cameraManager.getCamera(camHandle0).setPosition(glm::vec3(0, 0, 2));
+	
+	cameraManager.getCamera(camHandle1).setPosition(glm::vec3(0.0f, 0.0f, 0.0f));
+	cameraManager.getCamera(camHandle1).setCenter(glm::vec3(0.0f, 0.0f, -1.0f));
 	
 	core.run([&](const vkcv::WindowHandle &windowHandle, double t, double dt,
 				 uint32_t swapchainWidth, uint32_t swapchainHeight) {
diff --git a/projects/sph/src/main.cpp b/projects/sph/src/main.cpp
index bb729bcd5cd5f01e4cf3fe12d400e42703fe8504..043d135257ce63398ec34e5f6d47e4f4ffd6c61d 100644
--- a/projects/sph/src/main.cpp
+++ b/projects/sph/src/main.cpp
@@ -208,17 +208,17 @@ int main(int argc, const char **argv) {
 	drawcall.useDescriptorSet(0, descriptorSet);
 	
     glm::vec4 colorData = glm::vec4(1.0f, 1.0f, 0.0f, 1.0f);
-    uint32_t camIndex0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
-    uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+    auto camHandle0 = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+    auto camHandle1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 
-    cameraManager.getCamera(camIndex0).setNearFar(0.1, 30);
-    cameraManager.getCamera(camIndex1).setNearFar(0.1, 30);
-
-    cameraManager.setActiveCamera(1);
-
-    cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -2.5));
-    cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, -2.5f));
-    cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));
+    cameraManager.getCamera(camHandle0).setNearFar(0.1, 30);
+	cameraManager.getCamera(camHandle0).setPosition(glm::vec3(0, 0, -2.5));
+	
+    cameraManager.setActiveCamera(camHandle1);
+	
+	cameraManager.getCamera(camHandle1).setNearFar(0.1, 30);
+    cameraManager.getCamera(camHandle1).setPosition(glm::vec3(0.0f, 0.0f, -2.5f));
+    cameraManager.getCamera(camHandle1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));
 
 	const auto swapchainExtent = core.getSwapchainExtent(window.getSwapchain());
 	
diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index 38a582ae6ad2511a94642f86ebb96f70be1f64bb..ac2b2b6a19c23e039178da43705a4f1033fa6682 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -108,15 +108,15 @@ int main(int argc, const char** argv) {
 	});
 
 	vkcv::camera::CameraManager cameraManager(window);
-	uint32_t camIndex  = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
-	uint32_t camIndex2 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+	auto camHandle0  = cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
+	auto camHandle1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
 
-	cameraManager.getCamera(camIndex).setPosition(glm::vec3(0.f, 0.f, 3.f));
-	cameraManager.getCamera(camIndex).setNearFar(0.1f, 30.0f);
-	cameraManager.getCamera(camIndex).setYaw(180.0f);
-	cameraManager.getCamera(camIndex).setFov(glm::radians(37.8));	// fov of a 35mm lens
+	cameraManager.getCamera(camHandle0).setPosition(glm::vec3(0.f, 0.f, 3.f));
+	cameraManager.getCamera(camHandle0).setNearFar(0.1f, 30.0f);
+	cameraManager.getCamera(camHandle0).setYaw(180.0f);
+	cameraManager.getCamera(camHandle0).setFov(glm::radians(37.8));	// fov of a 35mm lens
 	
-	cameraManager.getCamera(camIndex2).setNearFar(0.1f, 30.0f);
+	cameraManager.getCamera(camHandle1).setNearFar(0.1f, 30.0f);
 
 	vkcv::asset::Scene mesh;
 
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index b361f68cdb67c74ae8aea69e39c00bbf54b46470..1c3eb776b43d29ffe53aa62a03e3bc06fe145767 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -301,8 +301,8 @@ int main(int argc, const char **argv) {
 	
 	vkcv::gui::GUI gui (core, windowHandle);
 	
-	uint32_t trackballIdx = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
-	cameraManager.getCamera(trackballIdx).setCenter(glm::vec3(0.5f, 0.5f, 0.5f));   // set camera to look at the center of the particle volume
+	auto trackballHandle = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
+	cameraManager.getCamera(trackballHandle).setCenter(glm::vec3(0.5f, 0.5f, 0.5f));   // set camera to look at the center of the particle volume
 	cameraManager.addCamera(vkcv::camera::ControllerType::PILOT);
 	
 	auto swapchainExtent = core.getSwapchainExtent(window.getSwapchain());