diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 3592045..c32de33 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -311,8 +311,6 @@
 
     // Holds the page that we need to animate to, and the icon views that we need to animate up
     // when we scroll to that page on resume.
-    private long mNewShortcutAnimateScreenId = -1;
-    private ArrayList<View> mNewShortcutAnimateViews = new ArrayList<View>();
     private ImageView mFolderIconImageView;
     private Bitmap mFolderIconBitmap;
     private Canvas mFolderIconCanvas;
@@ -764,7 +762,7 @@
         setWorkspaceBackground(mState == State.WORKSPACE);
 
         // Process any items that were added while Launcher was away
-        InstallShortcutReceiver.flushInstallQueue(this);
+        InstallShortcutReceiver.disableAndFlushInstallQueue(this);
 
         mPaused = false;
         sPausedFromUserAction = false;
@@ -829,6 +827,9 @@
         // when Launcher resumes and we are still in AllApps.
         updateWallpaperVisibility(true);
 
+        // Ensure that items added to Launcher are queued until Launcher returns
+        InstallShortcutReceiver.enableInstallQueue();
+
         super.onPause();
         mPaused = true;
         mDragController.cancelDrag();
@@ -3487,8 +3488,6 @@
         mBindOnResumeCallbacks.clear();
 
         final Workspace workspace = mWorkspace;
-        mNewShortcutAnimateScreenId = -1;
-        mNewShortcutAnimateViews.clear();
         mWorkspace.clearDropTargets();
         int count = workspace.getChildCount();
         for (int i = 0; i < count; i++) {
@@ -3556,12 +3555,11 @@
         }
 
         // Get the list of added shortcuts and intersect them with the set of shortcuts here
-        Set<String> newApps = new HashSet<String>();
-        newApps = mSharedPrefs.getStringSet(InstallShortcutReceiver.NEW_APPS_LIST_KEY, newApps);
-
         final AnimatorSet anim = LauncherAnimUtils.createAnimatorSet();
         final Collection<Animator> bounceAnims = new ArrayList<Animator>();
+        final boolean animateIcons = forceAnimateIcons && canRunNewAppsAnimation();
         Workspace workspace = mWorkspace;
+        long newShortcutsScreenId = -1;
         for (int i = start; i < end; i++) {
             final ItemInfo item = shortcuts.get(i);
 
@@ -3575,7 +3573,6 @@
                 case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
                 case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
                     ShortcutInfo info = (ShortcutInfo) item;
-                    String uri = info.intent.toUri(0).toString();
                     View shortcut = createShortcut(info);
 
                     /*
@@ -3590,27 +3587,13 @@
 
                     workspace.addInScreenFromBind(shortcut, item.container, item.screenId, item.cellX,
                             item.cellY, 1, 1);
-                    boolean animateIconUp = false;
-                    synchronized (newApps) {
-                        if (newApps.contains(uri)) {
-                            animateIconUp = newApps.remove(uri);
-                        }
-                    }
-                    if (forceAnimateIcons) {
+                    if (animateIcons) {
                         // Animate all the applications up now
                         shortcut.setAlpha(0f);
                         shortcut.setScaleX(0f);
                         shortcut.setScaleY(0f);
                         bounceAnims.add(createNewAppBounceAnimation(shortcut, i));
-                    } else if (animateIconUp) {
-                        // Prepare the view to be animated up
-                        shortcut.setAlpha(0f);
-                        shortcut.setScaleX(0f);
-                        shortcut.setScaleY(0f);
-                        mNewShortcutAnimateScreenId = item.screenId;
-                        if (!mNewShortcutAnimateViews.contains(shortcut)) {
-                            mNewShortcutAnimateViews.add(shortcut);
-                        }
+                        newShortcutsScreenId = item.screenId;
                     }
                     break;
                 case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
@@ -3623,7 +3606,16 @@
             }
         }
 
-        if (forceAnimateIcons) {
+        if (animateIcons) {
+            // Animate to the correct page
+            if (newShortcutsScreenId > -1) {
+                long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage());
+                int newScreenIndex = mWorkspace.getPageIndexForScreenId(newShortcutsScreenId);
+                if (newShortcutsScreenId != currentScreenId) {
+                    mWorkspace.snapToPage(newScreenIndex);
+                }
+            }
+
             // We post the animation slightly delayed to prevent slowdowns when we are loading
             // right after we return to launcher.
             mWorkspace.postDelayed(new Runnable() {
@@ -3731,32 +3723,6 @@
         // package changes in bindSearchablesChanged()
         updateAppMarketIcon();
 
-        // Animate up any icons as necessary
-        if (mVisible || mWorkspaceLoading) {
-            Runnable newAppsRunnable = new Runnable() {
-                @Override
-                public void run() {
-                    runNewAppsAnimation(false);
-                }
-            };
-
-            boolean willSnapPage = mNewShortcutAnimateScreenId > -1 &&
-                    mNewShortcutAnimateScreenId != mWorkspace.getCurrentPage();
-            if (canRunNewAppsAnimation()) {
-                // If the user has not interacted recently, then either snap to the new page to show
-                // the new-apps animation or just run them if they are to appear on the current page
-                if (willSnapPage) {
-                    mWorkspace.snapToScreenId(mNewShortcutAnimateScreenId, newAppsRunnable);
-                } else {
-                    runNewAppsAnimation(false);
-                }
-            } else {
-                // If the user has interacted recently, then just add the items in place if they
-                // are on another page (or just normally if they are added to the current page)
-                runNewAppsAnimation(willSnapPage);
-            }
-        }
-
         mWorkspaceLoading = false;
         if (upgradePath) {
             mWorkspace.saveWorkspaceToDb();
@@ -3788,64 +3754,6 @@
         return bounceAnim;
     }
 
-    /**
-     * Runs a new animation that scales up icons that were added while Launcher was in the
-     * background.
-     *
-     * @param immediate whether to run the animation or show the results immediately
-     */
-    private void runNewAppsAnimation(boolean immediate) {
-        AnimatorSet anim = LauncherAnimUtils.createAnimatorSet();
-        Collection<Animator> bounceAnims = new ArrayList<Animator>();
-
-        // Order these new views spatially so that they animate in order
-        Collections.sort(mNewShortcutAnimateViews, new Comparator<View>() {
-            @Override
-            public int compare(View a, View b) {
-                CellLayout.LayoutParams alp = (CellLayout.LayoutParams) a.getLayoutParams();
-                CellLayout.LayoutParams blp = (CellLayout.LayoutParams) b.getLayoutParams();
-                int cellCountX = LauncherModel.getCellCountX();
-                return (alp.cellY * cellCountX + alp.cellX) - (blp.cellY * cellCountX + blp.cellX);
-            }
-        });
-
-        // Animate each of the views in place (or show them immediately if requested)
-        if (immediate) {
-            for (View v : mNewShortcutAnimateViews) {
-                v.setAlpha(1f);
-                v.setScaleX(1f);
-                v.setScaleY(1f);
-            }
-        } else {
-            for (int i = 0; i < mNewShortcutAnimateViews.size(); ++i) {
-                View v = mNewShortcutAnimateViews.get(i);
-                bounceAnims.add(createNewAppBounceAnimation(v, i));
-            }
-            anim.playTogether(bounceAnims);
-            anim.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    if (mWorkspace != null) {
-                        mWorkspace.postDelayed(mBuildLayersRunnable, 500);
-                    }
-                }
-            });
-            anim.start();
-        }
-
-        // Clean up
-        mNewShortcutAnimateScreenId = -1;
-        mNewShortcutAnimateViews.clear();
-        new Thread("clearNewAppsThread") {
-            public void run() {
-                mSharedPrefs.edit()
-                            .putInt(InstallShortcutReceiver.NEW_APPS_PAGE_KEY, -1)
-                            .putStringSet(InstallShortcutReceiver.NEW_APPS_LIST_KEY, null)
-                            .commit();
-            }
-        }.start();
-    }
-
     @Override
     public void bindSearchablesChanged() {
         boolean searchVisible = updateGlobalSearchIcon();
