diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 5ae939e..e51e9b0 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -273,13 +273,13 @@
         }
 
         if (gainFocus) {
-            if (mRollo != null) {
+            if (mRollo != null && mRollo.mHasSurface) {
                 gainFocus();
             } else {
                 mShouldGainFocus = true;
             }
         } else {
-            if (mRollo != null) {
+            if (mRollo != null && mRollo.mHasSurface) {
                 if (mArrowNavigation) {
                     // Clear selection when we lose focus
                     mRollo.clearSelectedIcon();
@@ -370,8 +370,8 @@
                     } else if (currentTopRow > 0) {
                         newSelection = currentSelection - Defines.COLUMNS_PER_PAGE;
                         mRollo.moveTo(newSelection / Defines.COLUMNS_PER_PAGE);
-                    } else {
-                        newSelection = Defines.COLUMNS_PER_PAGE * (Defines.ROWS_PER_PAGE-1);
+                    } else if (currentPageRow != 0) {
+                        newSelection = currentTopRow * Defines.ROWS_PER_PAGE;
                     }
                 }
                 handled = true;
@@ -660,7 +660,11 @@
     public void setApps(ArrayList<ApplicationInfo> list) {
         mAllAppsList = list;
         if (mRollo != null) {
-            mRollo.setApps(list);
+            if (mRollo.mHasSurface) {
+                mRollo.setApps(list);
+            } else {
+                mRollo.mAppsDirty = true;
+            }
         }
         mLocks &= ~LOCK_ICONS_PENDING;
     }
@@ -672,7 +676,7 @@
         }
 
         final int N = list.size();
-        if (mRollo != null) {
+        if (mRollo != null && mRollo.mHasSurface) {
             mRollo.reallocAppsList(mRollo.mState.iconCount + N);
         }
 
@@ -684,13 +688,13 @@
                 index = -(index+1);
             }
             mAllAppsList.add(index, item);
-            if (mRollo != null) {
+            if (mRollo != null && mRollo.mHasSurface) {
                 mRollo.addApp(index, item);
                 mRollo.mState.iconCount++;
             }
         }
 
-        if (mRollo != null) {
+        if (mRollo != null && mRollo.mHasSurface) {
             mRollo.saveAppsList();
         }
     }
@@ -706,10 +710,10 @@
             final ApplicationInfo item = list.get(i);
             int index = findAppByComponent(mAllAppsList, item);
             if (index >= 0) {
+                int ic = mRollo != null ? mRollo.mState.iconCount : 666;
                 mAllAppsList.remove(index);
-                if (mRollo != null) {
+                if (mRollo != null && mRollo.mHasSurface) {
                     mRollo.removeApp(index);
-                    mRollo.mState.iconCount--;
                 }
             } else {
                 Log.w(TAG, "couldn't find a match for item \"" + item + "\"");
@@ -717,7 +721,7 @@
             }
         }
 
-        if (mRollo != null) {
+        if (mRollo != null && mRollo.mHasSurface) {
             mRollo.saveAppsList();
         }
     }
@@ -1151,7 +1155,7 @@
             int[] labelIds = new int[count];
             mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count);
 
-            final int oldCount = mIcons.length;
+            final int oldCount = mRollo.mState.iconCount;
 
             System.arraycopy(mIcons, 0, icons, 0, oldCount);
             System.arraycopy(mIconIds, 0, iconIds, 0, oldCount);
@@ -1176,7 +1180,7 @@
             System.arraycopy(mLabels, index, mLabels, dest, count);
             System.arraycopy(mLabelIds, index, mLabelIds, dest, count);
 
-            if (mHasSurface ) {
+            if (mHasSurface) {
                 uploadAppIcon(index, item);
             } else {
                 mAppsDirty = true;
@@ -1195,7 +1199,9 @@
             System.arraycopy(mLabels, src, mLabels, index, count);
             System.arraycopy(mLabelIds, src, mLabelIds, index, count);
 
+            mRollo.mState.iconCount--;
             final int last = mState.iconCount - 1;
+
             mIcons[last] = null;
             mIconIds[last] = 0;
             mLabels[last] = null;
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index ac94cca..374f0bf 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -693,7 +693,6 @@
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         final boolean workspaceLocked = mLauncher.isWorkspaceLocked();
         final boolean allAppsVisible = mLauncher.isAllAppsVisible();
-        Log.d(TAG, "workspaceLocked=" + workspaceLocked + " allAppsVisible=" + allAppsVisible);
         if (workspaceLocked || allAppsVisible) {
             return false; // We don't want the events.  Let them fall through to the all apps view.
         }
