diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java
index 7418fd8..5b17b10 100644
--- a/src/com/android/launcher2/AllApps3D.java
+++ b/src/com/android/launcher2/AllApps3D.java
@@ -112,6 +112,8 @@
     private int mMotionDownRawY;
     private int mDownIconIndex = -1;
     private int mCurrentIconIndex = -1;
+    private int[] mTouchYBorders;
+    private int[] mTouchXBorders;
 
     private boolean mShouldGainFocus;
 
@@ -261,10 +263,11 @@
             }
         } else if (sRollo.mInitialize) {
             sRollo.initGl();
-            sRollo.initTouchState(w, h);
             sRollo.mInitialize = false;
         }
 
+        initTouchState(w, h);
+
         sRollo.dirtyCheck();
         sRollo.resize(w, h);
 
@@ -511,6 +514,74 @@
         return handled;
     }
 
+    void initTouchState(int width, int height) {
+        boolean isPortrait = width < height;
+
+        int[] viewPos = new int[2];
+        getLocationOnScreen(viewPos);
+
+        mTouchXBorders = new int[mColumnsPerPage + 1];
+        mTouchYBorders = new int[mRowsPerPage + 1];
+
+        // TODO: Put this in a config file/define
+        int cellHeight = 145;//iconsSize / Defines.ROWS_PER_PAGE_PORTRAIT;
+        if (!isPortrait) cellHeight -= 12;
+        int centerY = (int) (height * (isPortrait ? 0.5f : 0.47f));
+        if (!isPortrait) centerY += cellHeight / 2;
+        int half = (int) Math.floor((mRowsPerPage + 1) / 2);
+        int end = mTouchYBorders.length - (half + 1);
+
+        for (int i = -half; i <= end; i++) {
+            mTouchYBorders[i + half] = centerY + (i * cellHeight) - viewPos[1];
+        }
+
+        int x = 0;
+        // TODO: Put this in a config file/define
+        int columnWidth = 120;
+        for (int i = 0; i < mColumnsPerPage + 1; i++) {
+            mTouchXBorders[i] = x - viewPos[0];
+            x += columnWidth;
+        }
+    }
+
+    int chooseTappedIcon(int x, int y) {
+        float pos = sRollo != null ? sRollo.mScrollPos : 0;
+
+        int oldY = y;
+
+        // Adjust for scroll position if not zero.
+        y += (pos - ((int)pos)) * (mTouchYBorders[1] - mTouchYBorders[0]);
+
+        int col = -1;
+        int row = -1;
+        final int columnsCount = mColumnsPerPage;
+        for (int i=0; i< columnsCount; i++) {
+            if (x >= mTouchXBorders[i] && x < mTouchXBorders[i+1]) {
+                col = i;
+                break;
+            }
+        }
+        final int rowsCount = mRowsPerPage;
+        for (int i=0; i< rowsCount; i++) {
+            if (y >= mTouchYBorders[i] && y < mTouchYBorders[i+1]) {
+                row = i;
+                break;
+            }
+        }
+
+        if (row < 0 || col < 0) {
+            return -1;
+        }
+
+        int index = (((int) pos) * columnsCount) + (row * columnsCount) + col;
+
+        if (index >= mAllAppsList.size()) {
+            return -1;
+        } else {
+            return index;
+        }
+    }
+
     @Override
     public boolean onTouchEvent(MotionEvent ev)
     {
@@ -533,8 +604,8 @@
         int action = ev.getAction();
         switch (action) {
         case MotionEvent.ACTION_DOWN:
-            if ((isPortrait && y > sRollo.mTouchYBorders[sRollo.mTouchYBorders.length-1]) ||
-                    (!isPortrait && x > sRollo.mTouchXBorders[sRollo.mTouchXBorders.length-1])) {
+            if ((isPortrait && y > mTouchYBorders[mTouchYBorders.length-1]) ||
+                    (!isPortrait && x > mTouchXBorders[mTouchXBorders.length-1])) {
                 mTouchTracking = TRACKING_HOME;
                 sRollo.setHomeSelected(SELECTED_PRESSED);
                 sRollo.mState.save();
@@ -569,8 +640,8 @@
         case MotionEvent.ACTION_OUTSIDE:
             if (mTouchTracking == TRACKING_HOME) {
                 sRollo.setHomeSelected((isPortrait &&
-                        y > sRollo.mTouchYBorders[sRollo.mTouchYBorders.length-1]) || (!isPortrait
-                        && x > sRollo.mTouchXBorders[sRollo.mTouchXBorders.length-1])
+                        y > mTouchYBorders[mTouchYBorders.length-1]) || (!isPortrait
+                        && x > mTouchXBorders[mTouchXBorders.length-1])
                         ? SELECTED_PRESSED : SELECTED_NONE);
                 sRollo.mState.save();
             } else if (mTouchTracking == TRACKING_FLING) {
@@ -581,7 +652,7 @@
                 if (!mStartedScrolling && slop < mSlop) {
                     // don't update anything so when we do start scrolling
                     // below, we get the right delta.
-                    mCurrentIconIndex = sRollo.chooseTappedIcon(x, y);
+                    mCurrentIconIndex = chooseTappedIcon(x, y);
                     if (mDownIconIndex != mCurrentIconIndex) {
                         // If a different icon is selected, don't allow it to be picked up.
                         // This handles off-axis dragging.
@@ -608,8 +679,8 @@
         case MotionEvent.ACTION_CANCEL:
             if (mTouchTracking == TRACKING_HOME) {
                 if (action == MotionEvent.ACTION_UP) {
-                    if ((isPortrait && y > sRollo.mTouchYBorders[sRollo.mTouchYBorders.length-1]) ||
-                        (!isPortrait && x > sRollo.mTouchXBorders[sRollo.mTouchXBorders.length-1])) {
+                    if ((isPortrait && y > mTouchYBorders[mTouchYBorders.length-1]) ||
+                        (!isPortrait && x > mTouchXBorders[mTouchXBorders.length-1])) {
                         reallyPlaySoundEffect(SoundEffectConstants.CLICK);
                         mLauncher.closeAllApps(true);
                     }
@@ -921,9 +992,6 @@
         private Allocation mAllocLabelIds;
         private Allocation mSelectedIcon;
 
-        private int[] mTouchYBorders;
-        private int[] mTouchXBorders;
-
         private Bitmap mSelectionBitmap;
         private Canvas mSelectionCanvas;
         
@@ -1005,7 +1073,6 @@
             initProgramStore();
             initGl();
             initData();
-            initTouchState(width, height);
             initRs();
         }
 
@@ -1162,8 +1229,6 @@
         }
 
         private void initGl() {
-            mTouchXBorders = new int[mAllApps.mColumnsPerPage + 1];
-            mTouchYBorders = new int[mAllApps.mRowsPerPage + 1];
         }
 
         private void initData() {
@@ -1383,30 +1448,6 @@
             }
         }
 
-        void initTouchState(int width, int height) {
-            boolean isPortrait = width < height;
-
-            // TODO: Put this in a config file/define
-            int cellHeight = 145;//iconsSize / Defines.ROWS_PER_PAGE_PORTRAIT;
-            if (!isPortrait) cellHeight -= 12;
-            int centerY = (int) (mAllApps.getHeight() * (isPortrait ? 0.5f : 0.47f));
-            if (!isPortrait) centerY += cellHeight / 2;
-            int half = (int) Math.floor((mAllApps.mRowsPerPage + 1) / 2);
-            int end = mTouchYBorders.length - (half + 1);
-
-            for (int i = -half; i <= end; i++) {
-                mTouchYBorders[i + half] = centerY + i * cellHeight;
-            }
-
-            int x = 0;
-            // TODO: Put this in a config file/define
-            int columnWidth = 120;
-            for (int i = 0; i < mAllApps.mColumnsPerPage + 1; i++) {
-                mTouchXBorders[i] = x;
-                x += columnWidth;
-            }
-        }
-
         void fling() {
             mInvokeFling.execute();
         }
@@ -1421,51 +1462,19 @@
             mInvokeMoveTo.execute();
         }
 
-        int chooseTappedIcon(int x, int y) {
-            float pos = mScrollPos;
-
-            // Adjust for scroll position if not zero.
-            y += (pos - ((int)pos)) * (mTouchYBorders[1] - mTouchYBorders[0]);
-
-            int col = -1;
-            int row = -1;
-            final int columnsCount = mAllApps.mColumnsPerPage;
-            for (int i=0; i< columnsCount; i++) {
-                if (x >= mTouchXBorders[i] && x < mTouchXBorders[i+1]) {
-                    col = i;
-                    break;
-                }
-            }
-            final int rowsCount = mAllApps.mRowsPerPage;
-            for (int i=0; i< rowsCount; i++) {
-                if (y >= mTouchYBorders[i] && y < mTouchYBorders[i+1]) {
-                    row = i;
-                    break;
-                }
-            }
-
-            if (row < 0 || col < 0) {
-                return -1;
-            }
-
-            int index = (((int) pos) * columnsCount) + (row * columnsCount) + col;
-
-            if (index >= mState.iconCount) {
-                return -1;
-            } else {
-                return index;
-            }
-        }
-
         /**
          * You need to call save() on mState on your own after calling this.
          *
          * @return the index of the icon that was selected.
          */
         int selectIcon(int x, int y, int pressed) {
-            final int index = chooseTappedIcon(x, y);
-            selectIcon(index, pressed);
-            return index;
+            if (mAllApps != null) {
+                final int index = mAllApps.chooseTappedIcon(x, y);
+                selectIcon(index, pressed);
+                return index;
+            } else {
+                return -1;
+            }
         }
 
         /**
@@ -1554,8 +1563,6 @@
                 Log.d(TAG, "sRollo.mLabelIds.length=" + mLabelIds.length);
             }
             Log.d(TAG, "sRollo.mLabelIds=" +  Arrays.toString(mLabelIds));
-            Log.d(TAG, "sRollo.mTouchXBorders=" +  Arrays.toString(mTouchXBorders));
-            Log.d(TAG, "sRollo.mTouchYBorders=" +  Arrays.toString(mTouchYBorders));
             Log.d(TAG, "sRollo.mState.newPositionX=" + mState.newPositionX);
             Log.d(TAG, "sRollo.mState.newTouchDown=" + mState.newTouchDown);
             Log.d(TAG, "sRollo.mState.flingVelocity=" + mState.flingVelocity);
@@ -1580,6 +1587,8 @@
         Log.d(TAG, "sRS=" + sRS);
         Log.d(TAG, "sRollo=" + sRollo);
         ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList", mAllAppsList);
+        Log.d(TAG, "mTouchXBorders=" +  Arrays.toString(mTouchXBorders));
+        Log.d(TAG, "mTouchYBorders=" +  Arrays.toString(mTouchYBorders));
         Log.d(TAG, "mArrowNavigation=" + mArrowNavigation);
         Log.d(TAG, "mStartedScrolling=" + mStartedScrolling);
         Log.d(TAG, "mLastSelection=" + mLastSelection);
