diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 54130e9..dfbafde 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -22,7 +22,6 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.launcher2">
 
-    <!-- Turned off until there is only one launcher
     <permission
         android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
         android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
@@ -47,7 +46,6 @@
         android:protectionLevel="normal"
         android:label="@string/permlab_write_settings"
         android:description="@string/permdesc_write_settings"/>
-    -->
 
     <uses-permission android:name="android.permission.CALL_PHONE" />
     <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
diff --git a/res/raw/rollo.c b/res/raw/rollo.c
index 2b15d7f..bae786d 100644
--- a/res/raw/rollo.c
+++ b/res/raw/rollo.c
@@ -19,11 +19,31 @@
 int g_LastTime;
 int g_PageCount;
 float g_Zoom;
-float g_ZoomTarget;
 
 // Drawing constants, should be parameters ======
 #define VIEW_ANGLE 1.28700222f
 
+float g_OldPosPage;
+float g_OldPosVelocity;
+float g_OldZoom;
+
+void updateReadback() {
+    if ((g_OldPosPage != g_PosPage) ||
+        (g_OldPosVelocity != g_PosVelocity) ||
+        (g_OldZoom != g_Zoom)) {
+
+        g_OldPosPage = g_PosPage;
+        g_OldPosVelocity = g_PosVelocity;
+        g_OldZoom = g_Zoom;
+
+        int i[3];
+        i[0] = g_PosPage * (1 << 16);
+        i[1] = g_PosVelocity * (1 << 16);
+        i[2] = g_OldZoom * (1 << 16);
+        sendToClient(&i[0], 1, 12, 1);
+    }
+}
+
 void init() {
     g_AttractionTable[0] = 6.5f;
     g_AttractionTable[1] = 6.5f;
@@ -50,7 +70,6 @@
     g_LastTouchDown = 0;
     g_LastPositionX = 0;
     g_Zoom = 0;
-    g_ZoomTarget = 0;
 }
 
 void move() {
@@ -97,16 +116,6 @@
     g_LastTouchDown = 0;
 }
 
-void setZoomTarget() {
-    g_ZoomTarget = state->zoomTarget;
-    //debugF("zoom target", g_ZoomTarget);
-}
-
-void setZoom() {
-    readback->zoom = g_Zoom = g_ZoomTarget = state->zoom;
-    //debugF("zoom", g_ZoomTarget);
-}
-
 int
 count_pages(int iconCount)
 {
@@ -301,8 +310,8 @@
     g_LastTime = newTime;
 
     //debugF("zoom", g_Zoom);
-    if (g_Zoom != g_ZoomTarget) {
-        float dz = (g_ZoomTarget - g_Zoom) * g_DT * 5;
+    if (g_Zoom != state->zoomTarget) {
+        float dz = (state->zoomTarget - g_Zoom) * g_DT * 5;
         if (dz && (fabsf(dz) < 0.03f)) {
             if (dz > 0) {
                 dz = 0.03f;
@@ -310,22 +319,22 @@
                 dz = -0.03f;
             }
         }
-        if (fabsf(g_Zoom - g_ZoomTarget) < fabsf(dz)) {
-            g_Zoom = g_ZoomTarget;
+        if (fabsf(g_Zoom - state->zoomTarget) < fabsf(dz)) {
+            g_Zoom = state->zoomTarget;
         } else {
             g_Zoom += dz;
         }
-        readback->zoom = g_Zoom;
+        updateReadback();
     }
 
     // Set clear value to dim the background based on the zoom position.
-    if (g_Zoom < 0.001f) {
+    if ((g_Zoom < 0.001f) && (state->zoomTarget < 0.001f)) {
         pfClearColor(0.0f, 0.0f, 0.0f, 0.0f);
         // When we're zoomed out and not tracking motion events, reset the pos to 0.
         if (!g_LastTouchDown) {
             g_PosPage = 0;
         }
-        return 1; // 0;
+        return 1;//0;
     } else if (g_Zoom < 0.85f) {
         pfClearColor(0.0f, 0.0f, 0.0f, g_Zoom);
     } else {
@@ -337,8 +346,7 @@
     g_PageCount = count_pages(iconCount);
 
     updatePos(0.1f);
-    readback->posX = g_PosPage;
-    readback->velocity = g_PosVelocity;
+    updateReadback();
 
     //debugF("    draw g_PosPage", g_PosPage);
 
@@ -347,6 +355,9 @@
     // Bug makes 1.0f alpha fail.
     color(1.0f, 1.0f, 1.0f, 0.99f);
 
+    if (iconCount <= 0) {
+        return 1;
+    }
     int lastIcon = iconCount-1;
 
     int page = g_PosPage;
@@ -393,6 +404,6 @@
 
     // Bug workaround where the last frame is not always displayed
     // So we keep rendering until the bug is fixed.
-    return 1; //(g_PosVelocity != 0) || fracf(g_PosPage) || g_Zoom != g_ZoomTarget);
+    return 1;//(g_PosVelocity != 0) || fracf(g_PosPage) || (g_Zoom != state->zoomTarget);
 }
 
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 93a6701..732bce3 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -20,6 +20,8 @@
 import java.util.ArrayList;
 import java.util.concurrent.Semaphore;
 import java.lang.Float;
+import java.util.Collections;
+import java.util.Comparator;
 
 import android.renderscript.RSSurfaceView;
 import android.renderscript.RenderScript;
@@ -45,7 +47,6 @@
 import android.graphics.Paint;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.os.Handler;
 import android.os.Message;
 import android.os.SystemClock;
 import android.util.AttributeSet;
@@ -95,12 +96,10 @@
     private int mMotionDownRawY;
     private int mHomeButtonTop;
     private long mTouchTime;
-    private boolean mZoomSwipeInProgress;
 
     static class Defines {
         public static final int ALLOC_PARAMS = 0;
         public static final int ALLOC_STATE = 1;
-        public static final int ALLOC_READBACK = 2;
         public static final int ALLOC_ICON_IDS = 3;
         public static final int ALLOC_LABEL_IDS = 4;
         public static final int ALLOC_X_BORDERS = 5;
@@ -224,7 +223,6 @@
                 mMotionDownRawX = (int)ev.getRawX();
                 mMotionDownRawY = (int)ev.getRawY();
                 mLastMotionX = x;
-                mRollo.mReadback.read();
 
                 mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
                 mRollo.mState.newTouchDown = 1;
@@ -232,7 +230,7 @@
                 if (!mRollo.checkClickOK()) {
                     mRollo.clearSelectedIcon();
                 } else {
-                    mRollo.selectIcon(x, y, mRollo.mReadback.posX);
+                    mRollo.selectIcon(x, y, mRollo.mMessageProc.mPosX);
                 }
                 mRollo.mState.save();
                 mRollo.mInvokeMove.execute();
@@ -276,17 +274,12 @@
                 mRollo.mState.newTouchDown = 0;
                 mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
 
-                if (!mZoomSwipeInProgress) {
-                    mVelocity.computeCurrentVelocity(1000 /* px/sec */, mMaxFlingVelocity);
-                    mRollo.mState.flingVelocityX
-                            = mVelocity.getXVelocity() / mDefines.SCREEN_WIDTH_PX;
-                    mRollo.clearSelectedIcon();
-                    mRollo.mState.save();
-                    mRollo.mInvokeFling.execute();
-                } else {
-                    mRollo.mState.save();
-                    mRollo.mInvokeMove.execute();
-                }
+                mVelocity.computeCurrentVelocity(1000 /* px/sec */, mMaxFlingVelocity);
+                mRollo.mState.flingVelocityX
+                        = mVelocity.getXVelocity() / mDefines.SCREEN_WIDTH_PX;
+                mRollo.clearSelectedIcon();
+                mRollo.mState.save();
+                mRollo.mInvokeFling.execute();
 
                 mLastMotionX = -10000;
                 if (mVelocity != null) {
@@ -316,7 +309,7 @@
             return true;
         }
         int index = mRollo.mState.selectedIconIndex;
-        Log.d(TAG, "long click! velocity=" + mRollo.mReadback.velocity + " index=" + index);
+
         if (mRollo.checkClickOK() && index >= 0 && index < mAllAppsList.size()) {
             ApplicationInfo app = mAllAppsList.get(index);
 
@@ -348,7 +341,7 @@
      * @param amount [0..1] 0 is hidden, 1 is open
      * @param animate Whether to animate.
      */
-    public void zoom(float amount, boolean animate) {
+    public void zoom(float amount) {
         if (mRollo == null) {
             return;
         }
@@ -357,43 +350,18 @@
         mRollo.clearSelectedIcon();
         if (amount > 0.001f) {
             // set in readback, so we're correct even before the next frame
-            mRollo.mReadback.zoom = mRollo.mState.zoomTarget = amount;
-            if (!animate) {
-                mRollo.mState.zoom = amount;
-                mRollo.mReadback.save();
-            }
+            mRollo.mState.zoomTarget = amount;
         } else {
             mRollo.mState.zoomTarget = 0;
-            if (!animate) {
-                mRollo.mReadback.zoom = mRollo.mState.zoom = 0;
-                mRollo.mReadback.save();
-            }
         }
         mRollo.mState.save();
-        if (!animate) {
-            mRollo.mInvokeSetZoom.execute();
-        } else {
-            mRollo.mInvokeSetZoomTarget.execute();
-        }
-        mReadZoom.removeMessages(1);
-        mReadZoom.sendEmptyMessageDelayed(1, 1000);
     }
 
-    Handler mReadZoom = new Handler() {
-        public void handleMessage(Message msg) {
-            if(mRollo != null && mRollo.mReadback != null) {
-                // FIXME: These checks may indicate other problems.
-                mRollo.mReadback.read();
-            }
-        }
-    };
-
     public boolean isVisible() {
         if (mRollo == null) {
             return false;
         }
-        //mRollo.mReadback.read();
-        return mRollo.mReadback.zoom > 0.001f;
+        return mRollo.mMessageProc.mZoom > 0.001f;
     }
 
     @Override
@@ -415,14 +383,77 @@
             mRollo.setApps(list);
         }
         mPageCount = countPages(list.size());
-        Log.d(TAG, "setApps mRollo=" + mRollo + " list=" + list);
         mLocks &= ~LOCK_ICONS_PENDING;
     }
 
-    private void invokeIcon(int index) {
-        Log.d(TAG, "launch it!!!! index=" + index);
+    public void addApps(ArrayList<ApplicationInfo> list) {
+        final int N = list.size();
+        if (mRollo != null) {
+            mRollo.reallocAppsList(mRollo.mState.iconCount + N);
+        }
+
+        for (int i=0; i<N; i++) {
+            final ApplicationInfo item = list.get(i);
+            int index = Collections.binarySearch(mAllAppsList, item, mAppNameComp);
+            if (index < 0) {
+                index = -(index+1);
+            }
+            mAllAppsList.add(index, item);
+            if (mRollo != null) {
+                mRollo.addApp(index, item);
+                mRollo.mState.iconCount++;
+            }
+        }
+
+        if (mRollo != null) {
+            mRollo.saveAppsList();
+        }
     }
 
+    public void removeApps(ArrayList<ApplicationInfo> list) {
+        final int N = list.size();
+        for (int i=0; i<N; i++) {
+            final ApplicationInfo item = list.get(i);
+            int index = Collections.binarySearch(mAllAppsList, item, mAppIntentComp);
+            if (index >= 0) {
+                mAllAppsList.remove(index);
+                if (mRollo != null) {
+                    mRollo.removeApp(index);
+                    mRollo.mState.iconCount--;
+                }
+            } else {
+                Log.e(TAG, "couldn't find a match for item \"" + item + "\"");
+                // Try to recover.  This should keep us from crashing for now.
+            }
+        }
+
+        if (mRollo != null) {
+            mRollo.saveAppsList();
+        }
+    }
+
+    public void updateApps(String packageName, ArrayList<ApplicationInfo> list) {
+        // Just remove and add, because they may need to be re-sorted.
+        removeApps(list);
+        addApps(list);
+    }
+
+    private Comparator<ApplicationInfo> mAppNameComp = new Comparator<ApplicationInfo>() {
+        public int compare(ApplicationInfo a, ApplicationInfo b) {
+            int result = a.title.toString().compareTo(b.toString());
+            if (result != 0) {
+                return result;
+            }
+            return a.intent.getComponent().compareTo(b.intent.getComponent());
+        }
+    };
+
+    private Comparator<ApplicationInfo> mAppIntentComp = new Comparator<ApplicationInfo>() {
+        public int compare(ApplicationInfo a, ApplicationInfo b) {
+            return a.intent.getComponent().compareTo(b.intent.getComponent());
+        }
+    };
+
     private static int countPages(int iconCount) {
         int iconsPerPage = Defines.COLUMNS_PER_PAGE * Defines.ROWS_PER_PAGE;
         int pages = iconCount / iconsPerPage;
@@ -444,8 +475,6 @@
 
         private Script.Invokable mInvokeMove;
         private Script.Invokable mInvokeFling;
-        private Script.Invokable mInvokeSetZoomTarget;
-        private Script.Invokable mInvokeSetZoom;
         private Script.Invokable mInvokeTouchUp;
 
         private ProgramStore mPSIcons;
@@ -461,11 +490,11 @@
 
         private Allocation[] mIcons;
         private int[] mIconIds;
-        private Allocation mAllocIconID;
+        private Allocation mAllocIconIds;
 
         private Allocation[] mLabels;
         private int[] mLabelIds;
-        private Allocation mAllocLabelID;
+        private Allocation mAllocLabelIds;
         private Allocation mSelectedIcon;
 
         private int[] mTouchYBorders;
@@ -478,7 +507,6 @@
 
         Params mParams;
         State mState;
-        Readback mReadback;
 
         class BaseAlloc {
             Allocation mAlloc;
@@ -489,10 +517,23 @@
             }
         }
 
+        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);
+                //Log.d("rs", "new msg " + mPosX + "  " + mVelocity + "  " + mZoom);
+            }
+            float mZoom;
+            float mPosX;
+            float mVelocity;
+        }
+        AAMessage mMessageProc;
+
         private boolean checkClickOK() {
             //android.util.Log.e("rs", "check click " + Float.toString(mReadback.velocity) + ", " + Float.toString(mReadback.posX));
-            return (Math.abs(mReadback.velocity) < 0.1f) &&
-                   (Math.abs(mReadback.posX - Math.round(mReadback.posX)) < 0.1f);
+            return (Math.abs(mMessageProc.mVelocity) < 0.1f) &&
+                   (Math.abs(mMessageProc.mPosX - Math.round(mMessageProc.mPosX)) < 0.1f);
         }
 
         class Params extends BaseAlloc {
@@ -521,7 +562,6 @@
             public int selectedIconIndex = -1;
             public int selectedIconTexture;
             public float zoomTarget;
-            public float zoom;
 
             State() {
                 mType = Type.createFromClass(mRS, State.class, 1, "StateClass");
@@ -530,24 +570,6 @@
             }
         }
 
-        class Readback extends BaseAlloc {
-            public float posX;
-            public float velocity;
-            public float zoom;
-
-            Readback() {
-                mType = Type.createFromClass(mRS, Readback.class, 1, "ReadbackClass");
-                mAlloc = Allocation.createTyped(mRS, mType);
-                save();
-            }
-
-            void read() {
-                if(mAlloc != null) {
-                    mAlloc.read(this);
-                }
-            }
-        }
-
         public RolloRS() {
         }
 
@@ -670,6 +692,7 @@
         private void initProgramStore() {
             ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
             bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
+            bs.setColorMask(true,true,true,false);
             bs.setDitherEnable(true);
             bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
                             ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
@@ -696,7 +719,6 @@
         private void initData() {
             mParams = new Params();
             mState = new State();
-            mReadback = new Readback();
 
             final Utilities.BubbleText bubble = new Utilities.BubbleText(getContext());
 
@@ -716,13 +738,11 @@
 
             mParams.save();
             mState.save();
-            mReadback.save();
 
             mSelectionBitmap = Bitmap.createBitmap(Defines.ICON_TEXTURE_WIDTH_PX,
                     Defines.ICON_TEXTURE_HEIGHT_PX, Bitmap.Config.ARGB_8888);
             mSelectionCanvas = new Canvas(mSelectionBitmap);
 
-            Log.d(TAG, "initData calling mRollo.setApps");
             setApps(null);
         }
 
@@ -734,71 +754,144 @@
             sb.addDefines(mDefines);
             sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS);
             sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
-            sb.setType(mReadback.mType, "readback", Defines.ALLOC_READBACK);
             mInvokeMove = sb.addInvokable("move");
             mInvokeFling = sb.addInvokable("fling");
-            mInvokeSetZoomTarget = sb.addInvokable("setZoomTarget");
-            mInvokeSetZoom = sb.addInvokable("setZoom");
             mInvokeTouchUp = sb.addInvokable("touchUp");
             mScript = sb.create();
             mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
             mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
             mScript.bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
-            mScript.bindAllocation(mReadback.mAlloc, Defines.ALLOC_READBACK);
-            mScript.bindAllocation(mAllocIconID, Defines.ALLOC_ICON_IDS);
-            mScript.bindAllocation(mAllocLabelID, Defines.ALLOC_LABEL_IDS);
+            mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+            mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
             mScript.bindAllocation(mAllocTouchXBorders, Defines.ALLOC_X_BORDERS);
             mScript.bindAllocation(mAllocTouchYBorders, Defines.ALLOC_Y_BORDERS);
 
+            mMessageProc = new AAMessage();
+            mRS.mMessageCallback = mMessageProc;
             mRS.contextBindRootScript(mScript);
         }
 
         private void setApps(ArrayList<ApplicationInfo> list) {
             final int count = list != null ? list.size() : 0;
             int allocCount = count;
-            if(allocCount < 1) {
+            if (allocCount < 1) {
                 allocCount = 1;
             }
 
             mIcons = new Allocation[count];
             mIconIds = new int[allocCount];
-            mAllocIconID = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
+            mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
 
             mLabels = new Allocation[count];
             mLabelIds = new int[allocCount];
-            mAllocLabelID = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
+            mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), allocCount);
 
             Element ie8888 = Element.RGBA_8888(mRS);
 
             Utilities.BubbleText bubble = new Utilities.BubbleText(getContext());
 
             for (int i=0; i<count; i++) {
-                final ApplicationInfo item = list.get(i);
-
-                mIcons[i] = Allocation.createFromBitmap(mRS, item.iconBitmap,
-                        Element.RGBA_8888(mRS), false);
-                mLabels[i] = Allocation.createFromBitmap(mRS, item.titleBitmap,
-                        Element.RGBA_8888(mRS), false);
-
-                mIcons[i].uploadToTexture(0);
-                mLabels[i].uploadToTexture(0);
-
-                mIconIds[i] = mIcons[i].getID();
-                mLabelIds[i] = mLabels[i].getID();
+                uploadAppIcon(i, list.get(i));
             }
 
-            mAllocIconID.data(mIconIds);
-            mAllocLabelID.data(mLabelIds);
-
             mState.iconCount = count;
 
-            if (mScript != null) { // wtf
-                mScript.bindAllocation(mAllocIconID, Defines.ALLOC_ICON_IDS);
-                mScript.bindAllocation(mAllocLabelID, Defines.ALLOC_LABEL_IDS);
+            saveAppsList();
+        }
+
+        private void uploadAppIcon(int index, ApplicationInfo item) {
+            mIcons[index] = Allocation.createFromBitmap(mRS, item.iconBitmap,
+                    Element.RGBA_8888(mRS), false);
+            mLabels[index] = Allocation.createFromBitmap(mRS, item.titleBitmap,
+                    Element.RGBA_8888(mRS), false);
+
+            mIcons[index].uploadToTexture(0);
+            mLabels[index].uploadToTexture(0);
+
+            mIconIds[index] = mIcons[index].getID();
+            mLabelIds[index] = mLabels[index].getID();
+        }
+
+        /**
+         * Puts the empty spaces at the end.  Updates mState.iconCount.  You must
+         * fill in the values and call saveAppsList().
+         */
+        private void reallocAppsList(int count) {
+            Allocation[] icons = new Allocation[count];
+            int[] iconIds = new int[count];
+            mAllocIconIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count);
+
+            Allocation[] labels = new Allocation[count];
+            int[] labelIds = new int[count];
+            mAllocLabelIds = Allocation.createSized(mRS, Element.USER_I32(mRS), count);
+
+            final int oldCount = mIcons.length;
+
+            System.arraycopy(mIcons, 0, icons, 0, oldCount);
+            System.arraycopy(mIconIds, 0, iconIds, 0, oldCount);
+            System.arraycopy(mLabels, 0, labels, 0, oldCount);
+            System.arraycopy(mLabelIds, 0, labelIds, 0, oldCount);
+
+            mIcons = icons;
+            mIconIds = iconIds;
+            mLabels = labels;
+            mLabelIds = labelIds;
+        }
+
+        /**
+         * Handle the allocations for the new app.  Make sure you call saveAppsList when done.
+         */
+        private void addApp(int index, ApplicationInfo item) {
+            final int count = mState.iconCount - index;
+            final int dest = index + 1;
+
+            System.arraycopy(mIcons, index, mIcons, dest, count);
+            System.arraycopy(mIconIds, index, mIconIds, dest, count);
+            System.arraycopy(mLabels, index, mLabels, dest, count);
+            System.arraycopy(mLabelIds, index, mLabelIds, dest, count);
+
+            uploadAppIcon(index, item);
+        }
+
+        /**
+         * Handle the allocations for the removed app.  Make sure you call saveAppsList when done.
+         */
+        private void removeApp(int index) {
+            final int count = mState.iconCount - index - 1;
+            final int src = index + 1;
+
+            System.arraycopy(mIcons, src, mIcons, index, count);
+            System.arraycopy(mIconIds, src, mIconIds, index, count);
+            System.arraycopy(mLabels, src, mLabels, index, count);
+            System.arraycopy(mLabelIds, src, mLabelIds, index, count);
+
+            final int last = mState.iconCount - 1;
+            mIcons[last] = null;
+            mIconIds[last] = 0;
+            mLabels[last] = null;
+            mLabelIds[last] = 0;
+        }
+
+        /**
+         * Send the apps list structures to RS.
+         */
+        private void saveAppsList() {
+            mRS.contextBindRootScript(null);
+            
+            mAllocIconIds.data(mIconIds);
+            mAllocLabelIds.data(mLabelIds);
+
+            if (mScript != null) { // this happens when we init it
+                mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+                mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
             }
 
             mState.save();
+
+            // Note: mScript may be null if we haven't initialized it yet.
+            // In that case, this is a no-op.
+            mRS.contextBindRootScript(mScript);
         }
 
         void initTouchState() {
@@ -869,7 +962,6 @@
         }
 
         void selectIcon(int index) {
-            Log.d(TAG, "selectIcon index=" + index);
             int iconCount = mAllAppsList.size();
             if (index < 0 || index >= iconCount) {
                 mState.selectedIconIndex = -1;
@@ -896,6 +988,7 @@
         void clearSelectedIcon() {
             mState.selectedIconIndex = -1;
         }
+
     }
 }
 
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 9360113..93ce9d5 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -183,6 +183,7 @@
     private boolean mRestoring;
     private boolean mWaitingForResult;
     private boolean mLocaleChanged;
+    private boolean mExitingBecauseOfLaunch;
 
     private boolean mHomeDown;
     private boolean mBackDown;
@@ -416,7 +417,10 @@
     @Override
     protected void onPause() {
         super.onPause();
-        closeAllApps(false);
+        if (mExitingBecauseOfLaunch) {
+            mExitingBecauseOfLaunch = false;
+            closeAllApps(false);
+        }
     }
 
     @Override
@@ -774,6 +778,9 @@
         if (Intent.ACTION_MAIN.equals(intent.getAction())) {
             getWindow().closeAllPanels();
 
+            // Whatever we were doing is hereby canceled.
+            mWaitingForResult = false;
+
             // Set this flag so that onResume knows to close the search dialog if it's open,
             // because this was a new intent (thus a press of 'home' or some such) rather than
             // for example onResume being called when the user pressed the 'back' button.
@@ -1327,6 +1334,7 @@
             // Open shortcut
             final Intent intent = ((ApplicationInfo) tag).intent;
             startActivitySafely(intent);
+            mExitingBecauseOfLaunch = true;
         } else if (tag instanceof FolderInfo) {
             handleFolderClick((FolderInfo) tag);
         } else if (v == mHandleView) {
@@ -1595,7 +1603,7 @@
     }
 
     void showAllApps() {
-        mAllAppsGrid.zoom(1.0f, true);
+        mAllAppsGrid.zoom(1.0f);
         //mWorkspace.hide();
 
         // TODO: fade these two too
@@ -1605,7 +1613,7 @@
 
     void closeAllApps(boolean animated) {
         if (mAllAppsGrid.isVisible()) {
-            mAllAppsGrid.zoom(0.0f, animated);
+            mAllAppsGrid.zoom(0.0f);
             mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus();
 
             // TODO: fade these two too
@@ -1927,6 +1935,7 @@
      */
     public void bindPackageAdded(ArrayList<ApplicationInfo> apps) {
         removeDialog(DIALOG_CREATE_SHORTCUT);
+        mAllAppsGrid.addApps(apps);
     }
 
     /**
@@ -1947,6 +1956,6 @@
     public void bindPackageRemoved(String packageName, ArrayList<ApplicationInfo> apps) {
         removeDialog(DIALOG_CREATE_SHORTCUT);
         mWorkspace.removeShortcutsForPackage(packageName);
+        mAllAppsGrid.removeApps(apps);
     }
-
 }
