diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 7f6e8ff..73ee4b9 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -116,6 +116,7 @@
     private boolean mZoomDirty = false;
     private float mNextZoom;
     private boolean mNextAnimate;
+    AAMessage mMessageProc;
 
     static class Defines {
         public static final int ALLOC_PARAMS = 0;
@@ -207,6 +208,8 @@
             mRollo.dirtyCheck();
         }
 
+        mRS.mMessageCallback = mMessageProc = new AAMessage();
+
         Resources res = getContext().getResources();
         int barHeight = (int)res.getDimension(R.dimen.button_bar_height);
 
@@ -228,7 +231,7 @@
                 if (mRollo.mState.iconCount > 0) {
                     if (mLastSelection == SELECTION_ICONS) {
                         int selection = mLastSelectedIcon;
-                        final int firstIcon = Math.round(mRollo.mMessageProc.mPosX) *
+                        final int firstIcon = Math.round(mMessageProc.mPosX) *
                             Defines.COLUMNS_PER_PAGE;
                         if (selection < 0 || // No selection
                                 selection < firstIcon || // off the top of the screen
@@ -283,7 +286,7 @@
         if (!mArrowNavigation && mRollo.mState.iconCount > 0) {
             // Select the first icon when we gain keyboard focus
             mArrowNavigation = true;
-            mRollo.selectIcon(Math.round(mRollo.mMessageProc.mPosX) * Defines.COLUMNS_PER_PAGE,
+            mRollo.selectIcon(Math.round(mMessageProc.mPosX) * Defines.COLUMNS_PER_PAGE,
                     SELECTED_FOCUSED);
             mRollo.mState.save();
         }
@@ -319,7 +322,7 @@
             mArrowNavigation = true;
 
             int currentSelection = mRollo.mState.selectedIconIndex;
-            int currentTopRow = Math.round(mRollo.mMessageProc.mPosX);
+            int currentTopRow = Math.round(mMessageProc.mPosX);
 
             // The column of the current selection, in the range 0..COLUMNS_PER_PAGE-1
             final int currentPageCol = currentSelection % Defines.COLUMNS_PER_PAGE;
@@ -448,7 +451,7 @@
                     mRollo.clearSelectedIcon();
                 } else {
                     mDownIconIndex = mCurrentIconIndex
-                            = mRollo.selectIcon(x, y, mRollo.mMessageProc.mPosX, SELECTED_PRESSED);
+                            = mRollo.selectIcon(x, y, mMessageProc.mPosX, SELECTED_PRESSED);
                     if (mDownIconIndex < 0) {
                         // if nothing was selected, no long press.
                         cancelLongPress();
@@ -476,7 +479,7 @@
                 if (!mStartedScrolling && slop < mSlop) {
                     // don't update anything so when we do start scrolling
                     // below, we get the right delta.
-                    mCurrentIconIndex = mRollo.chooseTappedIcon(x, y, mRollo.mMessageProc.mPosX);
+                    mCurrentIconIndex = mRollo.chooseTappedIcon(x, y, mMessageProc.mPosX);
                     if (mDownIconIndex != mCurrentIconIndex) {
                         // If a different icon is selected, don't allow it to be picked up.
                         // This handles off-axis dragging.
@@ -634,10 +637,10 @@
         if (mZoomDirty) {
             return mNextZoom > 0.001f;
         } else {
-            if (mRollo == null) {
+            if (mMessageProc == null) {
                 return false;
             } else {
-                return mRollo.mMessageProc.mZoom > 0.001f;
+                return mMessageProc.mZoom > 0.001f;
             }
         }
     }
@@ -646,10 +649,10 @@
         if (mZoomDirty) {
             return mNextZoom > 0.999f;
         } else {
-            if (mRollo == null) {
+            if (mMessageProc == null) {
                 return false;
             } else {
-                return mRollo.mMessageProc.mZoom > 0.999f;
+                return mMessageProc.mZoom > 0.999f;
             }
         }
     }
@@ -755,6 +758,18 @@
         return pages;
     }
 
+    class AAMessage extends RenderScript.RSMessage {
+        public void run() {
+            mPosX = ((float)mData[0]) / (1 << 16);
+            mVelocity = ((float)mData[1]) / (1 << 16);
+            mZoom = ((float)mData[2]) / (1 << 16);
+            mZoomDirty = false;
+        }
+        float mZoom;
+        float mPosX;
+        float mVelocity;
+    }
+
     public class RolloRS {
 
         // Allocations ======
@@ -813,18 +828,6 @@
             }
         }
 
-        class AAMessage extends RenderScript.RSMessage {
-            public void run() {
-                mPosX = ((float)mData[0]) / (1 << 16);
-                mVelocity = ((float)mData[1]) / (1 << 16);
-                mZoom = ((float)mData[2]) / (1 << 16);
-            }
-            float mZoom;
-            float mPosX;
-            float mVelocity;
-        }
-        AAMessage mMessageProc;
-
         private boolean checkClickOK() {
             return (Math.abs(mMessageProc.mVelocity) < 0.4f) &&
                    (Math.abs(mMessageProc.mPosX - Math.round(mMessageProc.mPosX)) < 0.4f);
@@ -1047,8 +1050,6 @@
             mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
             mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
 
-            mMessageProc = new AAMessage();
-            mRS.mMessageCallback = mMessageProc;
             mRS.contextBindRootScript(mScript);
         }
 
@@ -1067,7 +1068,6 @@
                 }
                 if (mZoomDirty) {
                     setZoom(mNextZoom, mNextAnimate);
-                    mZoomDirty = false;
                 }
             }
         }
