diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index ec3622c..7be2a1b 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -177,7 +177,6 @@
     private DeleteZone mDeleteZone;
     private HandleView mHandleView;
     private AllAppsView mAllAppsGrid;
-    private boolean mAllAppsVisible; // if it's visible at all
     private int mMode = MODE_WORKSPACE;
 
     private Bundle mSavedState;
@@ -424,7 +423,7 @@
     @Override
     protected void onPause() {
         super.onPause();
-        closeAllAppsDialog(false);
+        closeAllApps(false);
     }
 
     @Override
@@ -812,7 +811,7 @@
                     mWorkspace.moveToDefaultScreen();
                 }
 
-                closeAllAppsDialog(true);
+                closeAllApps(true);
 
                 final View v = getWindow().peekDecorView();
                 if (v != null && v.getWindowToken() != null) {
@@ -821,7 +820,7 @@
                     imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                 }
             } else {
-                closeAllAppsDialog(false);
+                closeAllApps(false);
             }
         }
     }
@@ -853,7 +852,8 @@
 
         // When the drawer is opened and we are saving the state because of a
         // configuration change
-        if (mAllAppsVisible && isConfigurationChange) {
+        // TODO should not do this if the drawer is currently closing.
+        if (isAllAppsVisible() && isConfigurationChange) {
             outState.putBoolean(RUNTIME_STATE_ALL_APPS_FOLDER, true);
         }
 
@@ -906,7 +906,7 @@
     public void startSearch(String initialQuery, boolean selectInitialQuery,
             Bundle appSearchData, boolean globalSearch) {
 
-        closeAllAppsDialog(false);
+        closeAllApps(false);
 
         // Slide the search widget to the top, if it's on the current screen,
         // otherwise show the search dialog immediately.
@@ -1282,8 +1282,8 @@
                 case KeyEvent.KEYCODE_BACK:
                     if (!event.isCanceled()) {
                         mWorkspace.dispatchKeyEvent(event);
-                        if (mAllAppsVisible) {
-                            closeAllAppsDialog(true);
+                        if (isAllAppsVisible()) {
+                            closeAllApps(true);
                         } else {
                             closeFolder();
                         }
@@ -1341,10 +1341,11 @@
         } else if (tag instanceof FolderInfo) {
             handleFolderClick((FolderInfo) tag);
         } else if (v == mHandleView) {
-            if (mAllAppsVisible) {
-                // TODO how can we be here?
+            Log.d(TAG, "onClick");
+            if (isAllAppsVisible()) {
+                closeAllApps(true);
             } else {
-                showAllAppsDialog();
+                showAllApps(true);
             }
         }
     }
@@ -1453,10 +1454,6 @@
         return mHandleView;
     }
 
-    boolean isDrawerDown() { // TODO rename to isAllAppsVisible()
-        return /* TODO !mDrawer.isMoving() && */ !mAllAppsVisible;
-    }
-
     Workspace getWorkspace() {
         return mWorkspace;
     }
@@ -1605,26 +1602,44 @@
         }
     }
 
-    void showAllAppsDialog() {
-        mAllAppsVisible = true;
-        mAllAppsGrid.show();
+    boolean isAllAppsVisible() {
+        return mAllAppsGrid.isZooming() || mAllAppsGrid.isVisible();
+    }
+
+    void showAllApps(boolean animated) {
+        if (mMode == MODE_ALL_APPS) {
+            return;
+        }
+
+        mSwipeController.setRange(-1, 0);
+        if (animated) {
+            mSwipeController.animate(-1);
+        } else {
+            mSwipeController.setImmediate(-1);
+        }
+
         mWorkspace.hide();
         
         // TODO: fade these two too
         mDeleteZone.setVisibility(View.GONE);
-        mHandleView.setVisibility(View.GONE);
+        //mHandleView.setVisibility(View.GONE);
     }
 
-    void closeAllAppsDialog(boolean animated) {
-        if (mAllAppsVisible) {
-            mAllAppsGrid.hide();
-            mAllAppsVisible = false;
+    void closeAllApps(boolean animated) {
+        if (mAllAppsGrid.isVisible()) {
+            mSwipeController.setRange(0, 1);
+            if (animated) {
+                mSwipeController.animate(1);
+            } else {
+                mSwipeController.setImmediate(1);
+            }
             mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus();
-            mWorkspace.show();
 
             // TODO: fade these two too
+            /*
             mDeleteZone.setVisibility(View.VISIBLE);
             mHandleView.setVisibility(View.VISIBLE);
+            */
         }
     }
 
@@ -1777,6 +1792,7 @@
         switch (mMode) {
         case MODE_WORKSPACE:
             if (amount == -1) {
+                setWorkspaceAndAllAppsScale(-amount);
                 mWorkspace.clearChildrenCache();
                 mMode = MODE_ALL_APPS;
                 mSwipeController.setRange(0, 1);
@@ -1784,6 +1800,7 @@
             break;
         case MODE_ALL_APPS:
             if (amount == 1) {
+                setWorkspaceAndAllAppsScale(1-amount);
                 mWorkspace.clearChildrenCache();
                 mMode = MODE_WORKSPACE;
                 mSwipeController.setRange(-1, 0);
@@ -1983,7 +2000,7 @@
 
             final boolean allApps = mSavedState.getBoolean(RUNTIME_STATE_ALL_APPS_FOLDER, false);
             if (allApps) {
-                showAllAppsDialog();
+                showAllApps(false);
             }
 
             mSavedState = null;
