diff --git a/projects/fire_works/shaders/generation.comp b/projects/fire_works/shaders/generation.comp
index a5368eebdc713bbd70d2329656ea0da7be0905d4..445c8f492d221cabaca855ff533817ca609af86c 100644
--- a/projects/fire_works/shaders/generation.comp
+++ b/projects/fire_works/shaders/generation.comp
@@ -11,6 +11,10 @@ layout(set=0, binding=0, std430) buffer particleBuffer {
     particle_t particles [];
 };
 
+layout(set=0, binding=1, std430) readonly buffer particleBufferCopy {
+    particle_t particlesCopy [];
+};
+
 layout(set=1, binding=0, std430) readonly buffer randomBuffer {
     float randomData [];
 };
@@ -113,10 +117,10 @@ void main() {
     if (events[event_id].parent < events.length()) {
         const uint spawnId = startIndex[events[event_id].parent];
 
-        if (spawnId < particles.length()) {
-            particles[id].position = particles[spawnId].position;
-            velocity += particles[spawnId].velocity;
-            size = particles[spawnId].size;
+        if (spawnId < particlesCopy.length()) {
+            particles[id].position = particlesCopy[spawnId].position;
+            velocity += particlesCopy[spawnId].velocity;
+            size = particlesCopy[spawnId].size;
         }
     }
 
@@ -155,6 +159,4 @@ void main() {
         trails[tid].color = mix(color, vec3(1.0f), 0.75f);
         trails[tid].lifetime = lifetime + (dt * trailLen) * 0.5f;
     }
-
-    events[event_id].pad0 = id;
 }
diff --git a/projects/fire_works/src/main.cpp b/projects/fire_works/src/main.cpp
index f70adaa038a60b3f884fdc7b9e75fadf712a04ca..435bfc62512044356225b00a1b2487e4fced9775 100644
--- a/projects/fire_works/src/main.cpp
+++ b/projects/fire_works/src/main.cpp
@@ -130,8 +130,18 @@ int main(int argc, const char **argv) {
 		false,
 		false
 	};
+	vkcv::DescriptorBinding binding1 { 
+		1,     
+		vkcv::DescriptorType::STORAGE_BUFFER,
+									   
+		1,     
+		vkcv::ShaderStage::COMPUTE,
+		false, 
+		false 
+	};
 	
 	descriptorBindings0.insert(std::make_pair(0, binding0));
+	descriptorBindings0.insert(std::make_pair(1, binding1));
 	
 	vkcv::DescriptorSetLayoutHandle descriptorSetLayout = core.createDescriptorSetLayout(descriptorBindings0);
 	vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorSetLayout);
@@ -151,14 +161,6 @@ int main(int argc, const char **argv) {
 	vkcv::DescriptorSetHandle generationDescriptorSet = core.createDescriptorSet(generationDescriptorLayout);
 	
 	vkcv::DescriptorBindings descriptorBindings1;
-	vkcv::DescriptorBinding binding1 {
-		1,
-		vkcv::DescriptorType::STORAGE_BUFFER,
-		1,
-		vkcv::ShaderStage::COMPUTE,
-		false,
-		false
-	};
 	
 	descriptorBindings1.insert(std::make_pair(0, binding0));
 	descriptorBindings1.insert(std::make_pair(1, binding1));
@@ -269,9 +271,16 @@ int main(int argc, const char **argv) {
 	
 	particleBuffer.fill(particles);
 	
+	vkcv::Buffer<particle_t> particleBufferCopy =
+		core.createBuffer<particle_t>(vkcv::BufferType::STORAGE, particles.size());
+
+	particleBufferCopy.fill(particles);
+
+
 	{
 		vkcv::DescriptorWrites writes;
 		writes.writeStorageBuffer(0, particleBuffer.getHandle());
+		writes.writeStorageBuffer(1, particleBufferCopy.getHandle());
 		core.writeDescriptorSet(descriptorSet, writes);
 	}
 	
@@ -948,6 +957,7 @@ int main(int argc, const char **argv) {
 		if (resetTime) {
 			start = std::chrono::system_clock::now();	
 			initializeParticles(particles);
+			particleBuffer.fill(particles);
 			eventBuffer.fill(events);
 			smokeBuffer.fill(smokes);
 			trailBuffer.fill(trails);
@@ -956,7 +966,7 @@ int main(int argc, const char **argv) {
 			memset(smokeIndices, 0, smokeIndexBuffer.getSize());
 		}
 
-		particleBuffer.fill(particles);
+		particleBufferCopy.fill(particles);
 	}
 	
 	smokeIndexBuffer.unmap();