diff --git a/projects/wobble_bobble/shaders/grid.frag b/projects/wobble_bobble/shaders/grid.frag
index d204843203422f5d0668e1c0470eafd7f266ac0f..00c405d1dac0e86abc433d281d032bd9ea49ef08 100644
--- a/projects/wobble_bobble/shaders/grid.frag
+++ b/projects/wobble_bobble/shaders/grid.frag
@@ -16,7 +16,10 @@ void main()	{
     float z = sqrt(0.25 - value * value);
 
     if (value < 0.5f) {
-        outColor = (passVelocity.xyz - passVelocity.yzx) * 100.0f; // vec3(passPos.x + 0.5f, passPos.y + 0.5f, z * 2.0f);
+        vec3 surface = vec3(passPos.x + 0.5f, passPos.y + 0.5f, z * 2.0f);
+        vec3 velocity = vec3(0.5f) + 0.5f * normalize(passVelocity.xyz);
+
+        outColor = surface;
     } else {
         discard;
     }
diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp
index 2010bf16e23901089f3a92a80754e925f687a070..752c3effc590a945ecf0b69806d960734404afa2 100644
--- a/projects/wobble_bobble/shaders/update_grid_forces.comp
+++ b/projects/wobble_bobble/shaders/update_grid_forces.comp
@@ -23,7 +23,7 @@ shared Particle shared_particles [SHARED_PARTICLES_BATCH_SIZE];
 
 void main()	{
     const vec3 position = (vec3(gl_GlobalInvocationID) + vec3(0.5f)) / imageSize(gridImage);
-    const float elasticity_module = 12.5f * 1000000.0f; // 10..15 = Wood
+    const float elasticity_module = 1200.5f * 1000000.0f; // 10..15 = Wood
 
     memoryBarrierImage();
 
@@ -68,11 +68,11 @@ void main()	{
                 voxel_particle_grad_weight(position, shared_particles[gl_LocalInvocationIndex].minimal)
             );
 
-            /*force -= (
+            force -= (
                 volume *
                 delta_cauchy *
                 weight_gradient
-            );*/
+            );
         }
     }
 
@@ -90,7 +90,7 @@ void main()	{
         (lowerID.z && negativeVelocity.z) || (greaterID.z && positiveVelocity.z)
     );
 
-    velocity = mix(velocity, -velocity, invert);
+    velocity = mix(velocity, -velocity, invert) - gridSample.xyz;
 
     imageStore(
         gridImage,
diff --git a/projects/wobble_bobble/shaders/update_particle_positions.comp b/projects/wobble_bobble/shaders/update_particle_positions.comp
index 270c2108715b1d6829b9bd51627b3e7ad1448a2b..96dd7300ccf556ffdcb51d2ac3a842be6c6b7d5a 100644
--- a/projects/wobble_bobble/shaders/update_particle_positions.comp
+++ b/projects/wobble_bobble/shaders/update_particle_positions.comp
@@ -19,8 +19,24 @@ void main()	{
 
     if (gl_GlobalInvocationID.x < particles.length()) {
         vec3 position = particles[gl_GlobalInvocationID.x].minimal.position;
-        position = position + particles[gl_GlobalInvocationID.x].minimal.velocity * dt;
+        float size = particles[gl_GlobalInvocationID.x].minimal.size;
+        vec3 velocity = particles[gl_GlobalInvocationID.x].minimal.velocity;
+
+        position = position + velocity * dt;
+
+        for (uint i = 0; i < 3; i++) {
+            if (position[i] - size < 0.0f) {
+                position[i] = -position[i] + 2.0f * size;
+                velocity[i] *= -1.0f;
+            } else
+            if (position[i] + size > 1.0f) {
+                position[i] = 2.0f * (1.0f - size) - position[i];
+                velocity[i] *= -1.0f;
+            }
+        }
+
         particles[gl_GlobalInvocationID.x].minimal.position = position;
+        particles[gl_GlobalInvocationID.x].minimal.velocity = velocity;
     }
 
     memoryBarrierBuffer();
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 14a65bf9e186c831d834e74d954d769b0f08f21e..2c4f9e4fb9953d36d781698b101aa46f46a219b1 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -20,30 +20,27 @@ void main()	{
         ParticleMinimal minimal = particles[gl_GlobalInvocationID.x].minimal;
 
         ivec3 gridResolution = textureSize(sampler3D(gridImage, gridSampler), 0);
-        ivec3 gridWindow = ivec3(minimal.size * 2.0f * gridResolution);
+        ivec3 gridWindow = ivec3(minimal.size * 4.0f * gridResolution);
+
+        vec3 velocity = vec3(minimal.velocity);
 
-        vec3 velocity_pic = vec3(0.0f);
         uint i, j, k;
 
-        //for (i = 0; i < gridResolution.x; i++) {
-        //    for (j = 0; j < gridResolution.y; j++) {
-        //        for (k = 0; k < gridResolution.z; k++) {
-        //          vec3 voxel = vec3(i, j, k) / gridResolution;
         for (i = -gridWindow.x; i <= gridWindow.x; i++) {
             for (j = -gridWindow.y; j <= gridWindow.y; j++) {
                 for (k = -gridWindow.z; k <= gridWindow.z; k++) {
-                    vec3 voxel = minimal.position + vec3(i, j, k) / gridResolution;
+                    vec3 offset = vec3(i, j, k) / gridResolution;
+                    vec3 voxel = minimal.position + offset;
 
-                    if (distance(voxel, minimal.position) < minimal.size * 2.0f) {
+                    if (length(offset) < minimal.size * 2.0f) {
                         vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel);
-
-                        velocity_pic += voxel_particle_weight(voxel, minimal) * gridSample.xyz;
+                        velocity += voxel_particle_weight(voxel, minimal) * gridSample.xyz;
                     }
                 }
             }
         }
 
-        //particles[gl_GlobalInvocationID.x].minimal.velocity = velocity_pic;
+        particles[gl_GlobalInvocationID.x].minimal.velocity = velocity;
     }
 
     memoryBarrierBuffer();
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index f4ce59aae398352d1fa30ae032980d0c5378341d..b7ab85c6c02c1089e472fa933e4e9082f0cd11ba 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -40,7 +40,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.0f, 0.01f, 0.0f);
+		particles[i].velocity = glm::vec3(0.0f, 1.0f, 0.0f);
 		
 		volume += size;
 	}