diff --git a/index.html b/index.html
index 56098c18d1b17b24732dd8dffe96acbf6e8f0832..3b83d9b0909f81f86267bc3a4d7c63b40ea7c295 100644
--- a/index.html
+++ b/index.html
@@ -210,7 +210,7 @@
             vec2 currentVelocity;
             if (u_scale == 1.0) currentVelocity = 1.0/u_scale*texture2D(u_velocity, fragCoord/u_textureSize).xy;
             else {
-                currentVelocity = 1.0/u_scale*bilinearInterp((fragCoord-pxCenter)*u_scale, u_velocity, u_textureSize*u_scale);
+                currentVelocity = 1.0/u_scale*bilinearInterp((fragCoord-pxCenter)*u_scale + 2.0*pxCenter, u_velocity, (u_textureSize-4.0*pxCenter)*u_scale);
             }
 
             //implicitly solve advection
diff --git a/js/main.js b/js/main.js
index a457d1dfca64731ee34df28eb76811fcf127d0fb..7b34f252078f08332cad9393ff75f07d89dc7885 100755
--- a/js/main.js
+++ b/js/main.js
@@ -8,6 +8,7 @@ var scale = 1;
 var lastMouseCoordinates =  [0,0];
 var mouseCoordinates =  [0,0];
 var mouseEnable = false;
+var mouseout = false;
 
 var paused = false;//while window is resizing
 
@@ -31,9 +32,14 @@ function initGL() {
     body = document.getElementsByTagName("body")[0];
 
     canvas.onmousemove = onMouseMove;
-    canvas.onmousedown = onMouseDown;
-    canvas.onmouseup = onMouseUp;
-    // canvas.onmouseout = onMouseUp;
+    window.onmousedown = onMouseDown;
+    window.onmouseup = onMouseUp;
+    canvas.onmouseout = function (){
+        mouseout = true;
+    };
+    canvas.onmouseenter = function (){
+        mouseout = false;
+    };
 
     window.onresize = onResize;
 
@@ -94,17 +100,14 @@ function render(){
         var alpha = dx*dx/(nu*dt);
         GPU.setUniformForProgram("jacobi", "u_alpha", alpha, "1f");
         GPU.setUniformForProgram("jacobi", "u_reciprocalBeta", 1/(4+alpha), "1f");
-        for (var i=0;i<2;i++){
+        for (var i=0;i<3;i++){
             GPU.step("jacobi", ["velocity", "velocity"], "nextVelocity");
-            GPU.step("jacobi", ["nextVelocity", "nextVelocity"], "velocity");
+            GPU.step("boundary", ["nextVelocity"], "velocity");
         }
 
-        GPU.step("boundary", ["velocity"], "nextVelocity");
-        GPU.swapTextures("velocity", "nextVelocity");
-
         //apply force
         GPU.setProgram("force");
-        if (mouseEnable){
+        if (!mouseout && mouseEnable){
             GPU.setUniformForProgram("force", "u_mouseEnable", 1.0, "1f");
             GPU.setUniformForProgram("force", "u_mouseCoord", [mouseCoordinates[0]*scale, mouseCoordinates[1]*scale], "2f");
             GPU.setUniformForProgram("force", "u_mouseDir", [3*(mouseCoordinates[0]-lastMouseCoordinates[0])*scale,
@@ -117,22 +120,20 @@ function render(){
         // GPU.swapTextures("velocity", "nextVelocity");
         GPU.step("boundary", ["nextVelocity"], "velocity");
 
+        GPU.setProgram("boundary");
+        GPU.setUniformForProgram("boundary", "u_scale", 1, "1f");
         // compute pressure
         GPU.step("diverge", ["velocity"], "velocityDivergence");//calc velocity divergence
         GPU.setProgram("jacobi");
         GPU.setUniformForProgram("jacobi", "u_alpha", -dx*dx, "1f");
         GPU.setUniformForProgram("jacobi", "u_reciprocalBeta", 1/4, "1f");
-        for (var i=0;i<20;i++){
-            GPU.step("jacobi", ["velocityDivergence", "pressure"], "nextPressure");//diffuse velocity
-            GPU.step("jacobi", ["velocityDivergence", "nextPressure"], "pressure");//diffuse velocity
+        for (var i=0;i<30;i++){
+            GPU.step("jacobi", ["velocityDivergence", "pressure"], "nextPressure");
+            GPU.step("boundary", ["nextPressure"], "pressure");
         }
 
-        GPU.setProgram("boundary");
-        GPU.setUniformForProgram("boundary", "u_scale", 1, "1f");
-        GPU.step("boundary", ["pressure"], "nextPressure");
-
         // subtract pressure gradient
-        GPU.step("gradientSubtraction", ["velocity", "nextPressure"], "nextVelocity");
+        GPU.step("gradientSubtraction", ["velocity", "pressure"], "nextVelocity");
         // GPU.swapTextures("velocity", "nextVelocity");
         GPU.setProgram("boundary");
         GPU.setUniformForProgram("boundary", "u_scale", -1, "1f");