diff --git a/projects/wobble_bobble/shaders/particle.inc b/projects/wobble_bobble/shaders/particle.inc
index 68704b366d56717595858509a80c698d1db5d550..1b7a902dc46417261380f7ee48edda7a0a45f5da 100644
--- a/projects/wobble_bobble/shaders/particle.inc
+++ b/projects/wobble_bobble/shaders/particle.inc
@@ -1,6 +1,8 @@
 #ifndef PARTICLE_INC
 #define PARTICLE_INC
 
+#define EPSILON 0.0001f
+
 struct ParticleMinimal {
     vec3 position;
     float size;
diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
index 7e999944ccaa2c8066efd326ac1af09c86dd8276..8914381fdc37b1c49ec31b472d7aabe987452fd4 100644
--- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
+++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
@@ -71,13 +71,9 @@ void main()	{
         memoryBarrierShared();
     }
 
-    gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w * 0.0f, 0.0f);
-    gridValue.xyz /= gridValue.w;
-
-    if (any(isnan(gridValue.xyz)) || any(isinf(gridValue.xyz))) {
-        gridValue.xyz = vec3(0.0f);
-    }
+    gridValue.xyz += vec3(0.0f, -9.81f * dts * gridValue.w, 0.0f);
 
+    /*
     bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0));
     bvec3 negativeVelocity = lessThan(gridValue.xyz, vec3(0.0f));
 
@@ -91,6 +87,7 @@ void main()	{
     );
 
     gridValue.xyz = mix(gridValue.xyz, -gridValue.xyz, collision);
+    */
 
     barrier();
     memoryBarrierShared();
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 1dcf904501984e8f7afdc33f7d40155b492bc220..75255bb0011e35b98097c818abe418be2f482880 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -54,7 +54,11 @@ void main()	{
                     vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel);
 
                     float weight = voxel_particle_weight(voxel, particle.minimal);
-                    vec3 velocity = gridSample.xyz * weight;
+                    vec3 velocity = gridSample.xyz * weight / gridSample.w;
+
+                    if (any(isnan(velocity)) || any(isinf(velocity))) {
+                        velocity = vec3(0.0f);
+                    }
 
                     affine_D += outerProduct(weight * offset, offset);
                     affine_B += outerProduct(velocity, offset);
@@ -72,7 +76,7 @@ void main()	{
 
         mat3 F = mat3(particle.deformation);
 
-        if (abs(determinant(affine_D)) > 0.0f) {
+        if (abs(determinant(affine_D)) >= EPSILON) {
             mat3 D_inv = inverse(affine_D);
             float J = determinant(F);
 
@@ -88,22 +92,22 @@ void main()	{
 
             affine_C = affine_B * D_inv;
             mls_Q += affine_C * mass;
-        }
 
-        F = (mat3(1.0f) + dts * affine_C) * F;
+            F = (mat3(1.0f) + dts * affine_C) * F;
+        }
 
         position = position + velocity_pic * dts;
 
         for (uint i = 0; i < 3; i++) {
             if (position[i] - size < 0.0f) {
-                position[i] = size;
+                position[i] = -position[i] + 2.0f * size;
 
                 if (velocity_pic[i] < 0.0f) {
                     velocity_pic[i] *= -1.0f;
                 }
             } else
             if (position[i] + size > 1.0f) {
-                position[i] = 1.0f - size;
+                position[i] = 2.0f * (1.0f - size) - position[i];
 
                 if (velocity_pic[i] > 0.0f) {
                     velocity_pic[i] *= -1.0f;
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index 557f4dbd6c53cb28f11f8b2597fc99886031f1d0..9e79e2befd96aea35c133bbb38f0ba96a24bef4e 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -511,11 +511,11 @@ int main(int argc, const char **argv) {
 	while (vkcv::Window::hasOpenWindow()) {
 		vkcv::Window::pollEvents();
 		
-		if(window.getHeight() == 0 || window.getWidth() == 0)
+		if (window.getHeight() == 0 || window.getWidth() == 0)
 			continue;
 		
 		uint32_t swapchainWidth, swapchainHeight;
-		if (!core.beginFrame(swapchainWidth, swapchainHeight,windowHandle)) {
+		if (!core.beginFrame(swapchainWidth, swapchainHeight, windowHandle)) {
 			continue;
 		}
 		
@@ -544,70 +544,72 @@ int main(int argc, const char **argv) {
 		physics.dt = static_cast<float>(0.000001 * static_cast<double>(deltatime.count()));
 		physics.speedfactor = speed_factor;
 		
-		vkcv::PushConstants physicsPushConstants (sizeof(physics));
+		vkcv::PushConstants physicsPushConstants(sizeof(physics));
 		physicsPushConstants.appendDrawcall(physics);
 		
 		cameraManager.update(physics.dt);
-
+		
 		glm::mat4 mvp = cameraManager.getActiveCamera().getMVP();
-		vkcv::PushConstants cameraPushConstants (sizeof(glm::mat4));
+		vkcv::PushConstants cameraPushConstants(sizeof(glm::mat4));
 		cameraPushConstants.appendDrawcall(mvp);
-
-		auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
-		
-		const uint32_t dispatchSizeGrid [3] = { grid.getWidth() / 4, grid.getHeight() / 4, grid.getDepth() / 4 };
-		const uint32_t dispatchSizeParticles [3] = { static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1 };
-		
-		core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", { 0.78f, 0.89f, 0.94f, 1.0f });
-		core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
-		core.prepareImageForSampling(cmdStream, grid.getHandle());
-		
-		core.recordComputeDispatchToCmdStream(
-				cmdStream,
-				initParticleWeightsPipeline,
-				dispatchSizeParticles,
-				{ vkcv::DescriptorSetUsage(
-						0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
-				) },
-				vkcv::PushConstants(0)
-		);
-		
-		core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
-		core.recordEndDebugLabel(cmdStream);
-		
-		core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", { 0.47f, 0.77f, 0.85f, 1.0f });
-		core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
-		core.prepareImageForStorage(cmdStream, grid.getHandle());
 		
-		core.recordComputeDispatchToCmdStream(
-				cmdStream,
-				transformParticlesToGridPipeline,
-				dispatchSizeGrid,
-				{ vkcv::DescriptorSetUsage(
-						0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle
-				) },
-				physicsPushConstants
-		);
-		
-		core.recordImageMemoryBarrier(cmdStream, grid.getHandle());
-		core.recordEndDebugLabel(cmdStream);
+		auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
 		
-		core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", { 0.78f, 0.89f, 0.94f, 1.0f });
-		core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
-		core.prepareImageForSampling(cmdStream, grid.getHandle());
+		const uint32_t dispatchSizeGrid[3] = {grid.getWidth() / 4, grid.getHeight() / 4, grid.getDepth() / 4};
+		const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1};
 		
-		core.recordComputeDispatchToCmdStream(
-				cmdStream,
-				updateParticleVelocitiesPipeline,
-				dispatchSizeParticles,
-				{ vkcv::DescriptorSetUsage(
-						0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
-				) },
-				physicsPushConstants
-		);
-		
-		core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
-		core.recordEndDebugLabel(cmdStream);
+		for (int step = 0; step < 1; step++) {
+			core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", {0.78f, 0.89f, 0.94f, 1.0f});
+			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.prepareImageForSampling(cmdStream, grid.getHandle());
+			
+			core.recordComputeDispatchToCmdStream(
+					cmdStream,
+					initParticleWeightsPipeline,
+					dispatchSizeParticles,
+					{vkcv::DescriptorSetUsage(
+							0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
+					)},
+					vkcv::PushConstants(0)
+			);
+			
+			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordEndDebugLabel(cmdStream);
+			
+			core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", {0.47f, 0.77f, 0.85f, 1.0f});
+			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.prepareImageForStorage(cmdStream, grid.getHandle());
+			
+			core.recordComputeDispatchToCmdStream(
+					cmdStream,
+					transformParticlesToGridPipeline,
+					dispatchSizeGrid,
+					{vkcv::DescriptorSetUsage(
+							0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle
+					)},
+					physicsPushConstants
+			);
+			
+			core.recordImageMemoryBarrier(cmdStream, grid.getHandle());
+			core.recordEndDebugLabel(cmdStream);
+			
+			core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", {0.78f, 0.89f, 0.94f, 1.0f});
+			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.prepareImageForSampling(cmdStream, grid.getHandle());
+			
+			core.recordComputeDispatchToCmdStream(
+					cmdStream,
+					updateParticleVelocitiesPipeline,
+					dispatchSizeParticles,
+					{vkcv::DescriptorSetUsage(
+							0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
+					)},
+					physicsPushConstants
+			);
+			
+			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordEndDebugLabel(cmdStream);
+		}
 		
 		std::vector<vkcv::ImageHandle> renderTargets {
 				vkcv::ImageHandle::createSwapchainImageHandle(),