diff --git a/res/raw/rollo3.c b/res/raw/rollo3.c
index af186ff..1e7b5f0 100644
--- a/res/raw/rollo3.c
+++ b/res/raw/rollo3.c
@@ -9,6 +9,7 @@
 
 // Attraction to center values from page edge to page center.
 float g_AttractionTable[9];
+float g_FrictionTable[9];
 float g_PhysicsTableSize;
 
 float g_PosPage;
@@ -66,15 +67,24 @@
 }
 
 void init() {
-    g_AttractionTable[0] = 6.5f;
-    g_AttractionTable[1] = 6.5f;
-    g_AttractionTable[2] = 7.0f;
-    g_AttractionTable[3] = 6.0f;
-    g_AttractionTable[4] = -6.0f;
-    g_AttractionTable[5] = -7.0f;
-    g_AttractionTable[6] = -6.5f;
-    g_AttractionTable[7] = -6.5f;
-    g_AttractionTable[8] = -6.5f;  // dup 7 to avoid a clamp later
+    g_AttractionTable[0] = 20.0f;
+    g_AttractionTable[1] = 20.0f;
+    g_AttractionTable[2] = 15.0f;
+    g_AttractionTable[3] = 10.0f;
+    g_AttractionTable[4] = -10.0f;
+    g_AttractionTable[5] = -15.0f;
+    g_AttractionTable[6] = -15.0f;
+    g_AttractionTable[7] = -20.0f;
+    g_AttractionTable[8] = -20.0f;  // dup 7 to avoid a clamp later
+    g_FrictionTable[0] = 10.0f;
+    g_FrictionTable[1] = 10.0f;
+    g_FrictionTable[2] = 11.0f;
+    g_FrictionTable[3] = 15.0f;
+    g_FrictionTable[4] = 15.0f;
+    g_FrictionTable[5] = 11.0f;
+    g_FrictionTable[6] = 10.0f;
+    g_FrictionTable[7] = 10.0f;
+    g_FrictionTable[8] = 10.0f;  // dup 7 to avoid a clamp later
     g_PhysicsTableSize = 7;
 
     g_PosVelocity = 0;
@@ -112,7 +122,7 @@
     g_MoveToTime = g_MoveToTotalTime;
     g_PosVelocity = 0;
     g_MoveToOldPos = g_PosPage;
-	
+
 	// debugF("======= moveTo", state->targetPos);
 }
 
@@ -170,10 +180,12 @@
     float accel = lerpf(g_AttractionTable[tablePosI],
                         g_AttractionTable[tablePosI + 1],
                         tablePosFrac) * g_DT;
-    float friction = 4.f * g_DT;
+    float friction = lerpf(g_FrictionTable[tablePosI],
+                        g_FrictionTable[tablePosI + 1],
+                        tablePosFrac) * g_DT;
 
     if (g_MoveToTime) {
-		
+
 		/*
         float a = 2.f * (state->targetPos - g_MoveToOldPos) /
                   (g_MoveToTotalTime * g_MoveToTotalTime);
@@ -186,10 +198,10 @@
             g_PosPage = g_MoveToOldPos + 0.5f * a * (t * t);
         }
 		 */
-		
+
 		// New position is old posiition + (total distance) * (interpolated time)
 		g_PosPage = g_MoveToOldPos + (state->targetPos - g_MoveToOldPos) * getInterpolation((g_MoveToTotalTime - g_MoveToTime) / g_MoveToTotalTime);
-		
+
         g_MoveToTime -= g_DT;
         if (g_MoveToTime <= 0) {
             g_MoveToTime = 0;
@@ -208,7 +220,7 @@
     }
 
     // If our velocity is low OR acceleration is opposing it, apply it.
-    if (fabsf(g_PosVelocity) < 1.0f || (g_PosVelocity * accel) < 0 || outOfRange) {
+    if (fabsf(g_PosVelocity) < 2.5f || (g_PosVelocity * accel) < 0 || outOfRange) {
         g_PosVelocity += accel;
     }
 
@@ -289,16 +301,11 @@
 {
     setColor(1.0f, 1.0f, 1.0f, 1.0f);
     bindTexture(NAMED_PFTexLinear, 0, state->homeButtonId);
+    float x = (SCREEN_WIDTH_PX - params->homeButtonTextureWidth) / 2;
+    float y = (g_Zoom - 1.f) * params->homeButtonTextureHeight;
 
-    float scale = 2.0f / SCREEN_WIDTH_PX;
-
-    float x = 0.0f;
-
-    float y = -(SCREEN_HEIGHT_PX / (float)SCREEN_WIDTH_PX);
-    y += g_Zoom * (scale * params->homeButtonTextureHeight / 2);
-
-    float z = 0.0f;
-    drawSprite(x, y, z, params->homeButtonTextureWidth, params->homeButtonTextureHeight);
+    y -= 36; // move the house to the edge of the screen as it doesn't fill the texture.
+    drawSpriteScreenspace(x, y, 0, params->homeButtonTextureWidth, params->homeButtonTextureHeight);
 }
 
 void drawFrontGrid(float rowOffset, float p)
@@ -429,7 +436,7 @@
     int newTime = uptimeMillis();
     g_DT = (newTime - g_LastTime) / 1000.f;
     g_LastTime = newTime;
-	
+
     if (!g_DrawLastFrame) {
         // If we stopped rendering we cannot use DT.
         // assume 30fps in this case.
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 9c73a01..d842f2d 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -88,12 +88,12 @@
     private RenderScript mRS;
     private RolloRS mRollo;
     private ArrayList<ApplicationInfo> mAllAppsList;
-    
+
     /**
      * True when we are using arrow keys or trackball to drive navigation
      */
     private boolean mArrowNavigation = false;
-    
+
     private int mPageCount;
     private boolean mStartedScrolling;
     private VelocityTracker mVelocity;
@@ -181,7 +181,7 @@
         long endTime = SystemClock.uptimeMillis();
         Log.d(TAG, "surfaceChanged took " + (endTime-startTime) + "ms");
     }
-    
+
 
     @Override
     protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
@@ -205,7 +205,7 @@
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
-        
+
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
             if (mArrowNavigation) {
                 int whichApp = mRollo.mState.selectedIconIndex;
@@ -215,20 +215,20 @@
                 }
             }
         }
-        
+
         if (mArrowNavigation && mRollo.mState.iconCount > 0) {
             mArrowNavigation = true;
-            
+
             int currentSelection = mRollo.mState.selectedIconIndex;
             int currentTopRow = (int) mRollo.mMessageProc.mPosX;
-            
+
             // The column of the current selection, in the range 0..COLUMNS_PER_PAGE-1
             int currentPageCol = currentSelection % Defines.COLUMNS_PER_PAGE;
-            
+
             // The row of the current selection, in the range 0..ROWS_PER_PAGE-1
             int currentPageRow = (currentSelection - (currentTopRow * Defines.COLUMNS_PER_PAGE))
                     / Defines.ROWS_PER_PAGE;
-            
+
             int newSelection = currentSelection;
 
             switch (keyCode) {
@@ -237,7 +237,7 @@
                     newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
                 } else if (currentTopRow > 0) {
                     mRollo.moveTo(currentTopRow - 1);
-                    newSelection = currentSelection - Defines.COLUMNS_PER_PAGE; 
+                    newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
                 }
                 break;
             case KeyEvent.KEYCODE_DPAD_DOWN:
@@ -256,7 +256,7 @@
                 }
                 break;
             case KeyEvent.KEYCODE_DPAD_RIGHT:
-                if ((currentPageCol < Defines.COLUMNS_PER_PAGE - 1) && 
+                if ((currentPageCol < Defines.COLUMNS_PER_PAGE - 1) &&
                         (currentSelection < mRollo.mState.iconCount - 1)) {
                     newSelection = currentSelection + 1;
                 }
@@ -276,7 +276,7 @@
     public boolean onTouchEvent(MotionEvent ev)
     {
         mArrowNavigation = false;
-        
+
         if (!isVisible()) {
             return true;
         }
@@ -635,8 +635,8 @@
 
         private boolean checkClickOK() {
             //android.util.Log.e("rs", "check click " + Float.toString(mReadback.velocity) + ", " + Float.toString(mReadback.posX));
-            return (Math.abs(mMessageProc.mVelocity) < 0.1f) &&
-                   (Math.abs(mMessageProc.mPosX - Math.round(mMessageProc.mPosX)) < 0.1f);
+            return (Math.abs(mMessageProc.mVelocity) < 0.4f) &&
+                   (Math.abs(mMessageProc.mPosX - Math.round(mMessageProc.mPosX)) < 0.4f);
         }
 
         class Params extends BaseAlloc {
