diff --git a/include/vkcv/DescriptorWrites.hpp b/include/vkcv/DescriptorWrites.hpp
index caff4cef865c2cfc909e0aa41974a18e5d18a9b3..4bc306bcb3d50bab5683f2599d04807987cc11ae 100644
--- a/include/vkcv/DescriptorWrites.hpp
+++ b/include/vkcv/DescriptorWrites.hpp
@@ -61,7 +61,7 @@ namespace vkcv {
 	 */
 	struct AccelerationDescriptorWrite {
 		uint32_t binding;
-		std::vector<vk::AccelerationStructureKHR> structures;
+		std::vector<AccelerationStructureHandle> structures;
 	};
 
 	/**
@@ -154,12 +154,12 @@ namespace vkcv {
 		 * of a descriptor set.
 		 *
 		 * @param[in] binding Binding index
-		 * @param[in] structures Acceleration structures
+		 * @param[in] structures Acceleration structure handles
 		 * @return Instance of descriptor writes
 		 */
 		DescriptorWrites &
 		writeAcceleration(uint32_t binding,
-						  const std::vector<vk::AccelerationStructureKHR> &structures);
+						  const std::vector<AccelerationStructureHandle> &structures);
 
 		/**
 		 * @brief Returns the list of stored write entries for sampled images.
diff --git a/projects/rt_ambient_occlusion/src/main.cpp b/projects/rt_ambient_occlusion/src/main.cpp
index 7c77334bf2efd0e80a3aa7cb2f6ffe4ec3611703..c668ce40738984b78f2418869207aa6ef35f0a9f 100644
--- a/projects/rt_ambient_occlusion/src/main.cpp
+++ b/projects/rt_ambient_occlusion/src/main.cpp
@@ -103,7 +103,7 @@ int main(int argc, const char** argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.writeAcceleration(1, { core.getVulkanAccelerationStructure(scene_tlas) });
+		writes.writeAcceleration(1, { scene_tlas });
 		writes.writeStorageBuffer(2, geometryData.getVertexBufferBinding().m_buffer);
 		writes.writeStorageBuffer(3, geometryData.getIndexBuffer());
 		core.writeDescriptorSet(descriptorSetHandles[0], writes);
diff --git a/src/vkcv/DescriptorSetManager.cpp b/src/vkcv/DescriptorSetManager.cpp
index b33221b15cd430f95ebf70e47bf1a5e83b73ee7b..76f36e4702c996ee770f407d9cf50a73c67342a9 100644
--- a/src/vkcv/DescriptorSetManager.cpp
+++ b/src/vkcv/DescriptorSetManager.cpp
@@ -147,10 +147,28 @@ namespace vkcv {
 
 		std::vector<vk::DescriptorImageInfo> imageInfos;
 		std::vector<vk::DescriptorBufferInfo> bufferInfos;
+		
+		bufferInfos.reserve(
+				writes.getUniformBufferWrites().size() +
+				writes.getStorageBufferWrites().size()
+		);
+		
+		std::vector<vk::AccelerationStructureKHR> accelerationStructures;
+		std::vector<size_t> accelerationStructureOffsets;
+		
+		accelerationStructureOffsets.reserve(writes.getAccelerationWrites().size());
 
 		std::vector<vk::WriteDescriptorSetAccelerationStructureKHR> writeStructures;
 
 		std::vector<WriteDescriptorSetInfo> writeInfos;
+		writeInfos.reserve(
+				writes.getSampledImageWrites().size() +
+				writes.getStorageImageWrites().size() +
+				writes.getUniformBufferWrites().size() +
+				writes.getStorageBufferWrites().size() +
+				writes.getSamplerWrites().size() +
+				writes.getAccelerationWrites().size()
+		);
 
 		for (const auto &write : writes.getSampledImageWrites()) {
 			const vk::ImageLayout layout =
@@ -209,15 +227,17 @@ namespace vkcv {
 
 			bufferInfos.push_back(bufferInfo);
 
-			WriteDescriptorSetInfo vulkanWrite = { 0,
-												   bufferInfos.size(),
-												   0,
-												   write.binding,
-												   0,
-												   1,
-												   write.dynamic ?
-													   vk::DescriptorType::eUniformBufferDynamic :
-													   vk::DescriptorType::eUniformBuffer };
+			WriteDescriptorSetInfo vulkanWrite = {
+					0,
+					bufferInfos.size(),
+					0,
+					write.binding,
+					0,
+					1,
+					write.dynamic ?
+						vk::DescriptorType::eUniformBufferDynamic :
+						vk::DescriptorType::eUniformBuffer
+			};
 
 			writeInfos.push_back(vulkanWrite);
 		}
@@ -232,15 +252,17 @@ namespace vkcv {
 
 			bufferInfos.push_back(bufferInfo);
 
-			WriteDescriptorSetInfo vulkanWrite = { 0,
-												   bufferInfos.size(),
-												   0,
-												   write.binding,
-												   0,
-												   1,
-												   write.dynamic ?
-													   vk::DescriptorType::eStorageBufferDynamic :
-													   vk::DescriptorType::eStorageBuffer };
+			WriteDescriptorSetInfo vulkanWrite = {
+					0,
+					bufferInfos.size(),
+					0,
+					write.binding,
+					0,
+					1,
+					write.dynamic ?
+						vk::DescriptorType::eStorageBufferDynamic :
+						vk::DescriptorType::eStorageBuffer
+			};
 
 			writeInfos.push_back(vulkanWrite);
 		}
@@ -258,25 +280,40 @@ namespace vkcv {
 
 			writeInfos.push_back(vulkanWrite);
 		}
-
+		
 		for (const auto &write : writes.getAccelerationWrites()) {
+			accelerationStructureOffsets.push_back(accelerationStructures.size());
+			
+			for (const auto &handle : write.structures) {
+				accelerationStructures.push_back(getCore().getVulkanAccelerationStructure(handle));
+			}
+		}
+
+		for (size_t i = 0; i < writes.getAccelerationWrites().size(); i++) {
+			const auto &write = writes.getAccelerationWrites()[i];
+			
 			const vk::WriteDescriptorSetAccelerationStructureKHR structureWrite(
-				write.structures.size(), write.structures.data());
+					write.structures.size(),
+					&(accelerationStructures[ accelerationStructureOffsets[i] ])
+			);
 
 			writeStructures.push_back(structureWrite);
 
-			WriteDescriptorSetInfo vulkanWrite = { 0,
-												   0,
-												   writeStructures.size(),
-												   write.binding,
-												   0,
-												   1,
-												   vk::DescriptorType::eAccelerationStructureKHR };
+			WriteDescriptorSetInfo vulkanWrite = {
+					0,
+					0,
+					writeStructures.size(),
+					write.binding,
+					0,
+					1,
+					vk::DescriptorType::eAccelerationStructureKHR
+			};
 
 			writeInfos.push_back(vulkanWrite);
 		}
 
 		std::vector<vk::WriteDescriptorSet> vulkanWrites;
+		vulkanWrites.reserve(writeInfos.size());
 
 		for (const auto &write : writeInfos) {
 			vk::WriteDescriptorSet vulkanWrite(
diff --git a/src/vkcv/DescriptorWrites.cpp b/src/vkcv/DescriptorWrites.cpp
index a3b4c5f4fbc4212da078ec0a00a8a93a6c021d02..b4be5958e977e9c61e4d2169ff98748ba0892682 100644
--- a/src/vkcv/DescriptorWrites.cpp
+++ b/src/vkcv/DescriptorWrites.cpp
@@ -77,7 +77,7 @@ namespace vkcv {
 	}
 
 	DescriptorWrites &DescriptorWrites::writeAcceleration(
-		uint32_t binding, const std::vector<vk::AccelerationStructureKHR> &structures) {
+		uint32_t binding, const std::vector<AccelerationStructureHandle> &structures) {
 		AccelerationDescriptorWrite write;
 		write.binding = binding;
 		write.structures = structures;