diff --git a/projects/wobble_bobble/shaders/init_particle_volumes.comp b/projects/wobble_bobble/shaders/init_particle_volumes.comp
new file mode 100644
index 0000000000000000000000000000000000000000..7277e586fc746006f121dd7a439e4ff46ead3971
--- /dev/null
+++ b/projects/wobble_bobble/shaders/init_particle_volumes.comp
@@ -0,0 +1,6 @@
+#version 450
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+void main()	{
+}
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
new file mode 100644
index 0000000000000000000000000000000000000000..7277e586fc746006f121dd7a439e4ff46ead3971
--- /dev/null
+++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
@@ -0,0 +1,6 @@
+#version 450
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+void main()	{
+}
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp
new file mode 100644
index 0000000000000000000000000000000000000000..7277e586fc746006f121dd7a439e4ff46ead3971
--- /dev/null
+++ b/projects/wobble_bobble/shaders/update_grid_forces.comp
@@ -0,0 +1,6 @@
+#version 450
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+void main()	{
+}
\ 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
new file mode 100644
index 0000000000000000000000000000000000000000..7277e586fc746006f121dd7a439e4ff46ead3971
--- /dev/null
+++ b/projects/wobble_bobble/shaders/update_grid_velocities.comp
@@ -0,0 +1,6 @@
+#version 450
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+void main()	{
+}
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/update_particle_deformation.comp b/projects/wobble_bobble/shaders/update_particle_deformation.comp
new file mode 100644
index 0000000000000000000000000000000000000000..7277e586fc746006f121dd7a439e4ff46ead3971
--- /dev/null
+++ b/projects/wobble_bobble/shaders/update_particle_deformation.comp
@@ -0,0 +1,6 @@
+#version 450
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+void main()	{
+}
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/update_particle_positions.comp b/projects/wobble_bobble/shaders/update_particle_positions.comp
new file mode 100644
index 0000000000000000000000000000000000000000..7277e586fc746006f121dd7a439e4ff46ead3971
--- /dev/null
+++ b/projects/wobble_bobble/shaders/update_particle_positions.comp
@@ -0,0 +1,6 @@
+#version 450
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+void main()	{
+}
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
new file mode 100644
index 0000000000000000000000000000000000000000..7277e586fc746006f121dd7a439e4ff46ead3971
--- /dev/null
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -0,0 +1,6 @@
+#version 450
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+void main()	{
+}
\ No newline at end of file
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index 2e79ec6650c532a1fd6d04a8654b62114550bd6d..bd08341f35ae3207230190eff0ae823ddaaa2826 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -44,6 +44,27 @@ void distributeParticles(Particle *particles, size_t count, const glm::vec3& cen
 	}
 }
 
+vkcv::ComputePipelineHandle createComputePipeline(vkcv::Core& core, vkcv::shader::GLSLCompiler& compiler,
+												  const std::string& path,
+												  const std::vector<vk::DescriptorSetLayout>& descriptorSetLayouts) {
+	vkcv::ShaderProgram shaderProgram;
+	
+	compiler.compile(
+			vkcv::ShaderStage::COMPUTE,
+			path,
+			[&shaderProgram](vkcv::ShaderStage stage, const std::filesystem::path& path) {
+				shaderProgram.addShader(stage, path);
+			}
+	);
+	
+	vkcv::ComputePipelineConfig config {
+			shaderProgram,
+			descriptorSetLayouts
+	};
+	
+	return core.createComputePipeline(config);
+}
+
 int main(int argc, const char **argv) {
 	const char* applicationName = "Wobble Bobble";
 	
@@ -110,6 +131,49 @@ int main(int argc, const char **argv) {
 	 */
 	
 	vkcv::shader::GLSLCompiler compiler;
+	
+	vkcv::ComputePipelineHandle transformParticlesToGridPipeline = createComputePipeline(
+			core, compiler,
+			"shaders/transform_particles_to_grid.comp",
+			{}
+	);
+	
+	vkcv::ComputePipelineHandle initParticleVolumesPipeline = createComputePipeline(
+			core, compiler,
+			"shaders/init_particle_volumes.comp",
+			{}
+	);
+	
+	vkcv::ComputePipelineHandle updateGridForcesPipeline = createComputePipeline(
+			core, compiler,
+			"shaders/update_grid_forces.comp",
+			{}
+	);
+	
+	vkcv::ComputePipelineHandle updateGridVelocitiesPipeline = createComputePipeline(
+			core, compiler,
+			"shaders/update_grid_velocities.comp",
+			{}
+	);
+	
+	vkcv::ComputePipelineHandle updateParticleDeformationPipeline = createComputePipeline(
+			core, compiler,
+			"shaders/update_particle_deformation.comp",
+			{}
+	);
+	
+	vkcv::ComputePipelineHandle updateParticleVelocitiesPipeline = createComputePipeline(
+			core, compiler,
+			"shaders/update_particle_velocities.comp",
+			{}
+	);
+	
+	vkcv::ComputePipelineHandle updateParticlePositionsPipeline = createComputePipeline(
+			core, compiler,
+			"shaders/update_particle_positions.comp",
+			{}
+	);
+	
 	vkcv::ShaderProgram gfxProgram;
 	
 	compiler.compile(
@@ -199,11 +263,74 @@ int main(int argc, const char **argv) {
 		
 		auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
 		
+		const uint32_t dispatchSize [3] = { 1, 0, 0 };
+		
+		core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 1.0f, 0.0f, 0.0f, 1.0f });
+		core.recordComputeDispatchToCmdStream(
+				cmdStream,
+				transformParticlesToGridPipeline,
+				dispatchSize,
+				{},
+				pushConstants
+		);
+		core.recordEndDebugLabel(cmdStream);
+		
+		core.recordBeginDebugLabel(cmdStream, "UPDATE GRID FORCES", { 1.0f, 0.0f, 0.0f, 1.0f });
+		core.recordComputeDispatchToCmdStream(
+				cmdStream,
+				updateGridForcesPipeline,
+				dispatchSize,
+				{},
+				pushConstants
+		);
+		core.recordEndDebugLabel(cmdStream);
+		
+		core.recordBeginDebugLabel(cmdStream, "UPDATE GRID VELOCITIES", { 1.0f, 0.0f, 0.0f, 1.0f });
+		core.recordComputeDispatchToCmdStream(
+				cmdStream,
+				updateGridVelocitiesPipeline,
+				dispatchSize,
+				{},
+				pushConstants
+		);
+		core.recordEndDebugLabel(cmdStream);
+		
+		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE DEFORMATION", { 0.0f, 1.0f, 0.0f, 1.0f });
+		core.recordComputeDispatchToCmdStream(
+				cmdStream,
+				updateParticleDeformationPipeline,
+				dispatchSize,
+				{},
+				pushConstants
+		);
+		core.recordEndDebugLabel(cmdStream);
+		
+		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", { 0.0f, 1.0f, 0.0f, 1.0f });
+		core.recordComputeDispatchToCmdStream(
+				cmdStream,
+				updateParticleVelocitiesPipeline,
+				dispatchSize,
+				{},
+				pushConstants
+		);
+		core.recordEndDebugLabel(cmdStream);
+		
+		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE POSITIONS", { 0.0f, 1.0f, 0.0f, 1.0f });
+		core.recordComputeDispatchToCmdStream(
+				cmdStream,
+				updateParticlePositionsPipeline,
+				dispatchSize,
+				{},
+				pushConstants
+		);
+		core.recordEndDebugLabel(cmdStream);
+		
 		std::vector<vkcv::ImageHandle> renderTargets {
 				vkcv::ImageHandle::createSwapchainImageHandle(),
 				depthBuffer
 		};
 		
+		core.recordBeginDebugLabel(cmdStream, "RENDER PARTICLES", { 0.0f, 0.0f, 1.0f, 1.0f });
 		core.recordDrawcallsToCmdStream(
 				cmdStream,
 				gfxPass,
@@ -213,6 +340,7 @@ int main(int argc, const char **argv) {
 				renderTargets,
 				windowHandle
 		);
+		core.recordEndDebugLabel(cmdStream);
 		
 		core.prepareSwapchainImageForPresent(cmdStream);
 		core.submitCommandStream(cmdStream);