diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 7277e586fc746006f121dd7a439e4ff46ead3971..5b16b41557178d39cf17eb7c91b9748e9503ba5b 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -1,6 +1,29 @@
 #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 [];
+};
+
+layout(set=0, binding=1) uniform texture3D gridImage;
+layout(set=0, binding=2) uniform sampler gridSampler;
+
 void main()	{
+    if (gl_GlobalInvocationID.x < particles.length()) {
+        vec3 position = particles[gl_GlobalInvocationID.x].minimal.position;
+        float mass = particles[gl_GlobalInvocationID.x].minimal.mass;
+
+        vec3 offset = position;
+
+        vec4 gridSample = texture(sampler3D(gridImage, gridSampler), offset);
+
+        vec3 gridVelocity = gridSample.xyz;
+        float gridMass = gridSample.w;
+
+        particles[gl_GlobalInvocationID.x].minimal.velocity = gridVelocity * mass / gridMass;
+    }
 }
\ No newline at end of file
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index 9148b3c80dbc116176f7039af9c4dc9ce3f23303..ea6856072ffcdbd97da623a132a18c360cfa8543 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -35,7 +35,7 @@ void distributeParticles(Particle *particles, size_t count, const glm::vec3& cen
 		
 		particles[i].position = center + offset;
 		particles[i].size = size;
-		particles[i].velocity = glm::vec3(0.1f);
+		particles[i].velocity = glm::vec3(0.0f);
 		
 		volume += size;
 	}
@@ -154,7 +154,12 @@ int main(int argc, const char **argv) {
 	grid.fill(grid_vec.data()); // FIXME: gets limited by staging buffer size...
 	 */
 	
-	grid.switchLayout(vk::ImageLayout::eGeneral);
+	vkcv::SamplerHandle gridSampler = core.createSampler(
+			vkcv::SamplerFilterType::LINEAR,
+			vkcv::SamplerFilterType::LINEAR,
+			vkcv::SamplerMipmapMode::NEAREST,
+			vkcv::SamplerAddressMode::REPEAT
+	);
 	
 	vkcv::shader::GLSLCompiler compiler;
 	
@@ -207,6 +212,14 @@ int main(int argc, const char **argv) {
 			updateParticleVelocitiesSets
 	);
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, grid.getHandle()));
+		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler));
+		core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes);
+	}
+	
 	std::vector<vkcv::DescriptorSetHandle> updateParticlePositionsSets;
 	vkcv::ComputePipelineHandle updateParticlePositionsPipeline = createComputePipeline(
 			core, compiler,
@@ -357,6 +370,8 @@ int main(int argc, const char **argv) {
 		const uint32_t dispatchSize [3] = { 1, 1, 1 };
 		
 		core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 0.47f, 0.77f, 0.85f, 1.0f });
+		core.prepareImageForStorage(cmdStream, grid.getHandle());
+		
 		core.recordComputeDispatchToCmdStream(
 				cmdStream,
 				transformParticlesToGridPipeline,
@@ -414,13 +429,19 @@ int main(int argc, const char **argv) {
 		core.recordEndDebugLabel(cmdStream);
 		
 		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", { 0.78f, 0.89f, 0.94f, 1.0f });
+		core.prepareImageForSampling(cmdStream, grid.getHandle());
+		
 		core.recordComputeDispatchToCmdStream(
 				cmdStream,
 				updateParticleVelocitiesPipeline,
 				dispatchSizeUpdateParticles,
-				{},
+				{ vkcv::DescriptorSetUsage(
+						0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
+				) },
 				vkcv::PushConstants(0)
 		);
+		
+		core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
 		core.recordEndDebugLabel(cmdStream);
 		
 		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE POSITIONS", { 0.78f, 0.89f, 0.94f, 1.0f });