diff --git a/projects/wobble_bobble/shaders/init_particle_volumes.comp b/projects/wobble_bobble/shaders/init_particle_volumes.comp
index 7277e586fc746006f121dd7a439e4ff46ead3971..5f30307f39d0f325b5a60dcfd5c68da8662dc04b 100644
--- a/projects/wobble_bobble/shaders/init_particle_volumes.comp
+++ b/projects/wobble_bobble/shaders/init_particle_volumes.comp
@@ -1,6 +1,20 @@
 #version 450
+#extension GL_GOOGLE_include_directive : enable
 
 layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
 
+#include "particle.inc"
+
+layout(set=0, binding=0, std430) buffer particleBuffer {
+    Particle particles [];
+};
+
 void main()	{
+    memoryBarrierBuffer();
+
+    if (gl_GlobalInvocationID.x < particles.length()) {
+        // nothing
+    }
+
+    memoryBarrierBuffer();
 }
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/update_grid_velocities.comp b/projects/wobble_bobble/shaders/update_grid_velocities.comp
deleted file mode 100644
index 0178b4c5d777bbb1d0105623b923563765d57120..0000000000000000000000000000000000000000
--- a/projects/wobble_bobble/shaders/update_grid_velocities.comp
+++ /dev/null
@@ -1,33 +0,0 @@
-#version 450
-#extension GL_GOOGLE_include_directive : enable
-
-layout(local_size_x = 4, local_size_y = 4, local_size_z = 4) in;
-
-#include "particle.inc"
-
-layout(set=0, binding=0) uniform texture3D gridTextureIn;
-layout(set=0, binding=1) uniform sampler gridSampler;
-layout(set=0, binding=2, rgba32f) writeonly uniform image3D gridImageOut;
-
-layout( push_constant ) uniform constants {
-    float t;
-    float dt;
-};
-
-void main()	{
-    memoryBarrierImage();
-
-    vec3 position = (vec3(gl_GlobalInvocationID) + vec3(0.5f)) / textureSize(sampler3D(gridTextureIn, gridSampler), 0);
-    vec4 gridCurrentSample = texture(sampler3D(gridTextureIn, gridSampler), position);
-
-    vec3 offset = position - gridCurrentSample.xyz * dt;
-    vec4 gridPreviousSample = texture(sampler3D(gridTextureIn, gridSampler), offset);
-
-    imageStore(
-        gridImageOut,
-        ivec3(gl_GlobalInvocationID),
-        gridPreviousSample
-    );
-
-    memoryBarrierImage();
-}
\ No newline at end of file
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index f76a7d53d1f87f197db7ef31dd91be3e3e46a8a8..4fae63957d298cd6f2881a6874300df1249115f9 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -153,17 +153,6 @@ int main(int argc, const char **argv) {
 	
 	grid.switchLayout(vk::ImageLayout::eGeneral);
 	
-	vkcv::Image tmpGrid = core.createImage(
-			vk::Format::eR32G32B32A32Sfloat,
-			64,
-			64,
-			64,
-			false,
-			true
-	);
-	
-	tmpGrid.switchLayout(vk::ImageLayout::eGeneral);
-	
 	/* TODO: clear grid via compute shader?
 	std::vector<glm::vec4> grid_vec (grid.getWidth() * grid.getHeight() * grid.getDepth());
 	
@@ -204,6 +193,12 @@ int main(int argc, const char **argv) {
 			initParticleVolumesSets
 	);
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
+		core.writeDescriptorSet(initParticleVolumesSets[0], writes);
+	}
+	
 	std::vector<vkcv::DescriptorSetHandle> updateGridForcesSets;
 	vkcv::ComputePipelineHandle updateGridForcesPipeline = createComputePipeline(
 			core, compiler,
@@ -218,21 +213,6 @@ int main(int argc, const char **argv) {
 		core.writeDescriptorSet(updateGridForcesSets[0], writes);
 	}
 	
-	std::vector<vkcv::DescriptorSetHandle> updateGridVelocitiesSets;
-	vkcv::ComputePipelineHandle updateGridVelocitiesPipeline = createComputePipeline(
-			core, compiler,
-			"shaders/update_grid_velocities.comp",
-			updateGridVelocitiesSets
-	);
-	
-	{
-		vkcv::DescriptorWrites writes;
-		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle()));
-		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler));
-		writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(2, tmpGrid.getHandle()));
-		core.writeDescriptorSet(updateGridVelocitiesSets[0], writes);
-	}
-	
 	std::vector<vkcv::DescriptorSetHandle> updateParticleDeformationSets;
 	vkcv::ComputePipelineHandle updateParticleDeformationPipeline = createComputePipeline(
 			core, compiler,
@@ -243,7 +223,7 @@ int main(int argc, const char **argv) {
 	{
 		vkcv::DescriptorWrites writes;
 		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
-		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, tmpGrid.getHandle()));
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, grid.getHandle()));
 		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler));
 		core.writeDescriptorSet(updateParticleDeformationSets[0], writes);
 	}
@@ -258,7 +238,7 @@ int main(int argc, const char **argv) {
 	{
 		vkcv::DescriptorWrites writes;
 		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
-		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, tmpGrid.getHandle()));
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, grid.getHandle()));
 		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler));
 		core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes);
 	}
@@ -346,7 +326,7 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, tmpGrid.getHandle()));
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle()));
 		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler));
 		core.writeDescriptorSet(gfxSetGrid, writes);
 	}
@@ -505,9 +485,13 @@ int main(int argc, const char **argv) {
 					cmdStream,
 					initParticleVolumesPipeline,
 					dispatchSizeParticles,
-					{},
+					{ vkcv::DescriptorSetUsage(
+							0, core.getDescriptorSet(initParticleVolumesSets[0]).vulkanHandle
+					) },
 					vkcv::PushConstants(0)
 			);
+			
+			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
 			core.recordEndDebugLabel(cmdStream);
 			initializedParticleVolumes = true;
 		}
@@ -524,25 +508,8 @@ int main(int argc, const char **argv) {
 		);
 		core.recordEndDebugLabel(cmdStream);
 		
-		core.recordBeginDebugLabel(cmdStream, "UPDATE GRID VELOCITIES", { 0.47f, 0.77f, 0.85f, 1.0f });
-		core.prepareImageForSampling(cmdStream, grid.getHandle());
-		core.prepareImageForStorage(cmdStream, tmpGrid.getHandle());
-		
-		core.recordComputeDispatchToCmdStream(
-				cmdStream,
-				updateGridVelocitiesPipeline,
-				dispatchSizeGrid,
-				{ vkcv::DescriptorSetUsage(
-						0, core.getDescriptorSet(updateGridVelocitiesSets[0]).vulkanHandle
-				) },
-				timePushConstants
-		);
-		
-		core.recordImageMemoryBarrier(cmdStream, tmpGrid.getHandle());
-		core.recordEndDebugLabel(cmdStream);
-		
 		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE DEFORMATION", { 0.78f, 0.89f, 0.94f, 1.0f });
-		core.prepareImageForSampling(cmdStream, tmpGrid.getHandle());
+		core.prepareImageForSampling(cmdStream, grid.getHandle());
 		
 		core.recordComputeDispatchToCmdStream(
 				cmdStream,