diff --git a/src/com/android/launcher2/AllAppsTabbed.java b/src/com/android/launcher2/AllAppsTabbed.java
index 3aa70f4..7dbb1a5 100644
--- a/src/com/android/launcher2/AllAppsTabbed.java
+++ b/src/com/android/launcher2/AllAppsTabbed.java
@@ -92,10 +92,6 @@
         });
 
         setCurrentTab(0);
-
-        // It needs to be INVISIBLE so that it will be measured in the layout.
-        // Otherwise the animations is messed up when we show it for the first time.
-        setVisibility(INVISIBLE);
     }
 
     @Override
@@ -113,8 +109,13 @@
         // NOTE: animate parameter is ignored for the TabHost itself
         setVisibility((zoom == 0.0f) ? View.GONE : View.VISIBLE);
         mAllApps2D.zoom(zoom, animate);
-        bringChildToFront((View)mAllApps2D);
-        getParent().bringChildToFront(this);
+    }
+
+    @Override
+    public void setVisibility(int visibility) {
+        super.setVisibility(visibility);
+        float zoom = visibility == View.VISIBLE ? 1.0f : 0.0f;
+        mAllApps2D.zoom(zoom, false);
     }
 
     @Override
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 5a508ab..5184f80 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -76,8 +76,7 @@
 import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
 import android.view.WindowManager;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
+import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
 import android.view.inputmethod.InputMethodManager;
@@ -216,7 +215,6 @@
     private ImageView mNextView;
 
     // Hotseats (quick-launch icons next to AllApps)
-    private static final int NUM_HOTSEATS = 2;
     private String[] mHotseatConfig = null;
     private Intent[] mHotseats = null;
     private Drawable[] mHotseatIcons = null;
@@ -300,7 +298,6 @@
         super.onConfigurationChanged(newConfig);
     }
 
-
     private void checkForLocaleChange() {
         final LocaleConfiguration localeConfiguration = new LocaleConfiguration();
         readConfiguration(this, localeConfiguration);
@@ -753,9 +750,16 @@
         mAllAppsGrid.setLauncher(this);
         mAllAppsGrid.setDragController(dragController);
         ((View) mAllAppsGrid).setWillNotDraw(false); // We don't want a hole punched in our window.
-        // Manage focusability manually since this thing is always visible
+        // Manage focusability manually since this thing is always visible (in non-xlarge)
         ((View) mAllAppsGrid).setFocusable(false);
 
+        if (LauncherApplication.isScreenXLarge()) {
+            // They need to be INVISIBLE initially so that they will be measured in the layout.
+            // Otherwise the animations are messed up when we show them for the first time.
+            ((View) mAllAppsGrid).setVisibility(View.INVISIBLE);
+            mHomeCustomizationDrawer.setVisibility(View.INVISIBLE);
+        }
+
         mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
         final Workspace workspace = mWorkspace;
         workspace.setHapticFeedbackEnabled(false);
@@ -1269,7 +1273,6 @@
     }
 
     private void addItems() {
-        closeAllApps(true);
         if (LauncherApplication.isScreenXLarge()) {
             // Animate the widget chooser up from the bottom of the screen
             if (!isCustomizationDrawerVisible()) {
@@ -1277,6 +1280,7 @@
                 mWorkspace.shrinkToTop();
             }
         } else {
+            closeAllApps(true);
             showAddDialog(mMenuAddInfo);
         }
     }
@@ -2058,52 +2062,130 @@
         }
     }
 
-    void showAllApps(boolean animated) {
-        boolean unshrinkWorkspace = false;
-        hideCustomizationDrawer(unshrinkWorkspace);
+    /**
+     * Zoom the camera out from the workspace to reveal 'toView'.
+     * Assumes that the view to show is anchored at either the very top or very bottom
+     * of the screen.
+     * @param toView The view to show when the animation is complete
+     * @param above If true, toView will appear from the top of the screen
+     */
+    private void cameraZoomOut(final View toView, boolean above) {
+        final Resources res = getResources();
+        final int duration = res.getInteger(R.integer.config_allAppsZoomInTime);
+        final float scale = (float) res.getInteger(R.integer.config_allAppsZoomScaleFactor);
+        final int height = toView.getHeight();
 
+        // toView should appear right at the end of the workspace shrink animation
+        final int startDelay = res.getInteger(R.integer.config_workspaceShrinkTime) - duration;
+
+        Interpolator interp = new DecelerateInterpolator();
+
+        toView.setPivotX(toView.getWidth() / 2.0f);
+        // Set pivotY so that at the starting zoom factor, the view is off-screen by a small margin
+        // Assumes that the view is normally anchored to either the top or bottom of the screen
+        final int margin = 200;
+        if (above) {
+            toView.setPivotY(height + ((toView.getTop() + height) / scale) + margin);
+        } else {
+            toView.setPivotY(0.0f - (toView.getTop() / scale) - margin);
+        }
+
+        Animator scaleXAnim = new PropertyAnimator(duration, toView, "scaleX", scale, 1.0f);
+        scaleXAnim.setInterpolator(interp);
+        scaleXAnim.addListener(new AnimatableListenerAdapter() {
+            public void onAnimationStart(Animatable animation) {
+                // Prepare the position
+                toView.setTranslationX(0.0f);
+                toView.setTranslationY(0.0f);
+                toView.setVisibility(View.VISIBLE);
+            }
+        });
+
+        Animator scaleYAnim = new PropertyAnimator(duration, toView, "scaleY", scale, 1.0f);
+        scaleYAnim.setInterpolator(interp);
+
+        Sequencer s = new Sequencer();
+        s.playTogether(scaleXAnim, scaleYAnim);
+        s.play(scaleXAnim).after(startDelay);
+        s.start();
+    }
+
+    /**
+     * Zoom the camera back into the workspace, hiding 'fromView'.
+     * This is the opposite of cameraZoomOut.
+     * @param fromView The currently-focused view, which will be hidden.
+     */
+    private void cameraZoomIn(final View fromView) {
+        Resources res = getResources();
+        int duration = res.getInteger(R.integer.config_allAppsZoomOutTime);
+        float scaleFactor = (float) res.getInteger(R.integer.config_allAppsZoomScaleFactor);
+
+        Interpolator interp = new AccelerateInterpolator();
+
+        Sequencer s = new Sequencer();
+        Animator scaleXAnim = new PropertyAnimator(duration, fromView, "scaleX", scaleFactor);
+        scaleXAnim.setInterpolator(interp);
+        Animator scaleYAnim = new PropertyAnimator(duration, fromView, "scaleY", scaleFactor);
+        scaleYAnim.setInterpolator(interp);
+        s.playTogether(scaleXAnim, scaleYAnim);
+        s.addListener(new AnimatableListenerAdapter() {
+            public void onAnimationEnd(Animatable animation) {
+                fromView.setVisibility(View.GONE);
+                fromView.setScaleX(1.0f);
+                fromView.setScaleY(1.0f);
+            }
+        });
+        s.start();
+    }
+
+    /**
+     * Pan the camera in the vertical plane between 'fromView' and 'toView'.
+     * This is the transition used on xlarge screens to go between all apps and
+     * the home customization drawer.
+     * @param fromView The view to pan away from.
+     * @param toView The view to pan into the frame.
+     */
+    private void cameraPan(final View fromView, final View toView) {
+        final int duration = getResources().getInteger(R.integer.config_allAppsCameraPanTime);
+        final int workspaceHeight = mWorkspace.getHeight();
+
+        final boolean panDown = fromView.getY() < toView.getY();
+
+        final float fromViewStartY = panDown ? 0.0f : fromView.getY();
+        final float fromViewEndY = panDown ? -fromView.getHeight() * 2 : workspaceHeight * 2;
+        final float toViewStartY = panDown ? workspaceHeight * 2 : -toView.getHeight() * 2;
+        final float toViewEndY = panDown ? workspaceHeight - toView.getHeight() : 0.0f;
+
+        Sequencer s = new Sequencer();
+        s.playTogether(
+                new PropertyAnimator(duration, fromView, "y", fromViewStartY, fromViewEndY),
+                new PropertyAnimator(duration, toView, "y", toViewStartY, toViewEndY));
+        s.addListener(new AnimatableListenerAdapter() {
+            public void onAnimationStart(Animatable animation) {
+                toView.setVisibility(View.VISIBLE);
+                toView.setY(toViewStartY);
+            }
+            public void onAnimationEnd(Animatable animation) {
+                fromView.setVisibility(View.GONE);
+            }
+        });
+        s.start();
+    }
+
+    void showAllApps(boolean animated) {
         if (LauncherApplication.isScreenXLarge()) {
             mWorkspace.shrinkToBottom(animated);
         }
+
         if (LauncherApplication.isScreenXLarge() && animated) {
-            final View allApps = (View)mAllAppsGrid;
-
-            final Resources res = getResources();
-            final int duration = res.getInteger(R.integer.config_allAppsZoomInTime);
-            final float scale = (float) res.getInteger(R.integer.config_allAppsZoomScaleFactor);
-            final int height = allApps.getHeight();
-
-            // All apps should appear right at the end of the workspace shrink animation
-            final int startDelay = res.getInteger(R.integer.config_workspaceShrinkTime) - duration;
-
-            Interpolator interp = new DecelerateInterpolator(2.0f);
-
-            allApps.setPivotX(allApps.getWidth() / 2.0f);
-            allApps.setPivotY(height);
-
-            Animator scaleXAnim = new PropertyAnimator(duration, allApps, "scaleX", scale, 1.0f);
-            scaleXAnim.setInterpolator(interp);
-            scaleXAnim.addListener(new AnimatableListenerAdapter() {
-                public void onAnimationStart(Animatable animation) {
-                    // Not really a zoom -- this just makes the view visible
-                    mAllAppsGrid.zoom(1.0f, false);
-                }
-            });
-
-            Animator scaleYAnim = new PropertyAnimator(duration, allApps, "scaleY", scale, 1.0f);
-            scaleYAnim.setInterpolator(interp);
-
-            // Translate down by 20% of the total height
-            float oldY = (-allApps.getHeight() * 0.2f);
-            Animator yAnim = new PropertyAnimator(duration, allApps, "y", oldY, 0.0f);
-            yAnim.setInterpolator(interp);
-
-            Sequencer s = new Sequencer();
-            s.playTogether(scaleXAnim, scaleYAnim, yAnim);
-            s.play(scaleXAnim).after(startDelay);
-            s.start();
+            if (isCustomizationDrawerVisible()) {
+                cameraPan(mHomeCustomizationDrawer, (View) mAllAppsGrid);
+            } else {
+                cameraZoomOut((View) mAllAppsGrid, true);
+            }
         } else {
             mAllAppsGrid.zoom(1.0f, animated);
+            hideCustomizationDrawer(); // TODO: Should be able to do this un-animated
         }
 
         ((View) mAllAppsGrid).setFocusable(true);
@@ -2156,30 +2238,8 @@
         if (mAllAppsGrid.isVisible()) {
             mWorkspace.setVisibility(View.VISIBLE);
             if (LauncherApplication.isScreenXLarge() && animated) {
-                Resources res = getResources();
-                int duration = res.getInteger(R.integer.config_allAppsZoomOutTime);
-                float scaleFactor = (float) res.getInteger(R.integer.config_allAppsZoomScaleFactor);
-                View allApps = (View) mAllAppsGrid;
-
-                allApps.setPivotX(allApps.getWidth() / 2.0f);
-                allApps.setPivotY(allApps.getHeight());
-
-                // Translate up by 20% of the total height
-                float newY = allApps.getY() - allApps.getHeight() * 0.2f;
-
-                Sequencer seq = new Sequencer();
-                seq.playTogether(
-                        new PropertyAnimator(duration, allApps, "scaleX", scaleFactor),
-                        new PropertyAnimator(duration, allApps, "scaleY", scaleFactor),
-                        new PropertyAnimator(duration, allApps, "y", newY));
-                seq.addListener(new AnimatableListenerAdapter() {
-                    public void onAnimationEnd(Animatable animation) {
-                        mAllAppsGrid.zoom(0.0f, false);
-                    }
-                });
-                // Start the AllApps animation at the same time as the workspace unshrink
-                seq.start();
                 mWorkspace.unshrink();
+                cameraZoomIn((View) mAllAppsGrid);
             } else {
                 mAllAppsGrid.zoom(0.0f, animated);
             }
@@ -2202,13 +2262,12 @@
     }
 
     private void showCustomizationDrawer() {
+        mWorkspace.shrinkToTop();
         if (isAllAppsVisible()) {
-            // TODO: Make a smoother transition here
-            closeAllApps(false);
+            cameraPan((View) mAllAppsGrid, mHomeCustomizationDrawer);
+        } else {
+            cameraZoomOut(mHomeCustomizationDrawer, false);
         }
-        mHomeCustomizationDrawer.setVisibility(View.VISIBLE);
-        mHomeCustomizationDrawer.startAnimation(
-                AnimationUtils.loadAnimation(this, R.anim.home_customization_drawer_slide_up));
     }
 
     void hideCustomizationDrawer() {
@@ -2217,19 +2276,10 @@
 
     void hideCustomizationDrawer(boolean unshrinkWorkspace) {
         if (isCustomizationDrawerVisible()) {
-            Animation slideDownAnimation = AnimationUtils.loadAnimation(
-                    this, R.anim.home_customization_drawer_slide_down);
-            slideDownAnimation.setAnimationListener(new Animation.AnimationListener() {
-                public void onAnimationEnd(Animation animation) {
-                    mHomeCustomizationDrawer.setVisibility(View.GONE);
-                }
-                public void onAnimationRepeat(Animation animation) {}
-                public void onAnimationStart(Animation animation) {}
-            });
-            mHomeCustomizationDrawer.startAnimation(slideDownAnimation);
             if (unshrinkWorkspace) {
                 mWorkspace.unshrink();
             }
+            cameraZoomIn(mHomeCustomizationDrawer);
         }
     }
 
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 2021580..26785c5 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1181,7 +1181,7 @@
                         new PropertyAnimator(duration, cl, "translationX", 0.0f),
                         new PropertyAnimator(duration, cl, "translationY", 0.0f),
                         new PropertyAnimator(duration, cl, "scaleX", 1.0f),
-                        new PropertyAnimator(duration, cl, "scaleY", cl.getScaleY(), 1.0f),
+                        new PropertyAnimator(duration, cl, "scaleY", 1.0f),
                         new PropertyAnimator(duration, cl, "dimmedBitmapAlpha", 0.0f));
             }
             s.addListener(mUnshrinkAnimationListener);
