diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 3813afe..7075b5f 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -82,8 +82,7 @@
  * Default launcher application.
  */
 public final class Launcher extends Activity
-        implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,
-        SwipeController.SwipeListener {
+        implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks {
     static final String LOG_TAG = "Launcher";
     static final String TAG = LOG_TAG;
     static final boolean LOGD = false;
@@ -109,10 +108,6 @@
     private static final int REQUEST_PICK_LIVE_FOLDER = 8;
     private static final int REQUEST_PICK_APPWIDGET = 9;
 
-    private static final int MODE_WORKSPACE = 0;
-    private static final int MODE_ALL_APPS = 1;
-    private static final int MODE_ALL_APPS_ZOOMED = 2;
-
     static final String EXTRA_SHORTCUT_DUPLICATE = "duplicate";
 
     static final String EXTRA_CUSTOM_WIDGET = "custom_widget";
@@ -177,7 +172,6 @@
     private DeleteZone mDeleteZone;
     private HandleView mHandleView;
     private AllAppsView mAllAppsGrid;
-    private int mMode = MODE_WORKSPACE;
 
     private Bundle mSavedState;
 
@@ -423,7 +417,7 @@
     @Override
     protected void onPause() {
         super.onPause();
-        closeAllApps();
+        closeAllApps(false);
     }
 
     @Override
@@ -519,9 +513,8 @@
     private void setupViews() {
         mDragController = new DragController(this);
         DragController dragController = mDragController;
-        mSwipeController = new SwipeController(this, this);
+        mSwipeController = new SwipeController(this);
         SwipeController swipeController = mSwipeController;
-        swipeController.setRange(-1, 0);
 
         DragLayer dragLayer = (DragLayer) findViewById(R.id.drag_layer);
         dragLayer.setDragController(dragController);
@@ -531,6 +524,7 @@
         mAllAppsGrid.setLauncher(this);
         mAllAppsGrid.setDragController(dragController);
         mAllAppsGrid.setWillNotDraw(false); // We don't want a hole punched in our window.
+        swipeController.setAllAppsView(mAllAppsGrid);
 
         mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
         final Workspace workspace = mWorkspace;
@@ -811,7 +805,7 @@
                     mWorkspace.moveToDefaultScreen();
                 }
 
-                closeAllApps();
+                closeAllApps(true);
 
                 final View v = getWindow().peekDecorView();
                 if (v != null && v.getWindowToken() != null) {
@@ -820,7 +814,7 @@
                     imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                 }
             } else {
-                closeAllApps();
+                closeAllApps(false);
             }
         }
     }
@@ -906,7 +900,7 @@
     public void startSearch(String initialQuery, boolean selectInitialQuery,
             Bundle appSearchData, boolean globalSearch) {
 
-        closeAllApps();
+        closeAllApps(true);
 
         // Slide the search widget to the top, if it's on the current screen,
         // otherwise show the search dialog immediately.
@@ -1283,7 +1277,7 @@
                     if (!event.isCanceled()) {
                         mWorkspace.dispatchKeyEvent(event);
                         if (isAllAppsVisible()) {
-                            closeAllApps();
+                            closeAllApps(true);
                         } else {
                             closeFolder();
                         }
@@ -1343,7 +1337,7 @@
         } else if (v == mHandleView) {
             Log.d(TAG, "onClick");
             if (isAllAppsVisible()) {
-                closeAllApps();
+                closeAllApps(true);
             } else {
                 showAllApps();
             }
@@ -1433,7 +1427,6 @@
         }
 
         if (mWorkspace.allowLongPress()) {
-        Log.d(TAG, "there");
             mSwipeController.cancelSwipe();
             if (cellInfo.cell == null) {
                 if (cellInfo.valid) {
@@ -1604,27 +1597,21 @@
     }
 
     boolean isAllAppsVisible() {
-        return mAllAppsGrid.isZooming() || mAllAppsGrid.isVisible();
+        return mAllAppsGrid.isVisible();
     }
 
     void showAllApps() {
-        if (mMode == MODE_ALL_APPS) {
-            return;
-        }
-
-        mSwipeController.setRange(-1, 0);
-        mSwipeController.setImmediate(-1);
-        mWorkspace.hide();
+        mSwipeController.setMode(SwipeController.MODE_ALL_APPS, true);
+        //mWorkspace.hide();
 
         // TODO: fade these two too
         mDeleteZone.setVisibility(View.GONE);
         //mHandleView.setVisibility(View.GONE);
     }
 
-    void closeAllApps() {
+    void closeAllApps(boolean animated) {
         if (mAllAppsGrid.isVisible()) {
-            mSwipeController.setRange(0, 1);
-            mSwipeController.setImmediate(1);
+            mSwipeController.setMode(SwipeController.MODE_WORKSPACE, animated);
             mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus();
 
             // TODO: fade these two too
@@ -1761,91 +1748,6 @@
     }
 
     /**
-     * Implementation of the method from SwipeController.SwipeListener.
-     */
-    public void onStartSwipe() {
-        switch (mMode) {
-        case MODE_WORKSPACE:
-            mWorkspace.enableChildrenCache();
-            break;
-        case MODE_ALL_APPS:
-            break;
-        case MODE_ALL_APPS_ZOOMED:
-            break;
-        }
-    }
-
-    /**
-     * Implementation of the method from SwipeController.SwipeListener.
-     *
-     * @param amount The final value of the swipe (-1, 0 or 1)
-     */
-    public void onFinishSwipe(int amount) {
-        switch (mMode) {
-        case MODE_WORKSPACE:
-            if (amount == -1) {
-                setWorkspaceAndAllAppsScale(-amount);
-                mWorkspace.clearChildrenCache();
-                mMode = MODE_ALL_APPS;
-                mSwipeController.setRange(0, 1);
-            }
-            break;
-        case MODE_ALL_APPS:
-            if (amount == 1) {
-                setWorkspaceAndAllAppsScale(1-amount);
-                mWorkspace.clearChildrenCache();
-                mMode = MODE_WORKSPACE;
-                mSwipeController.setRange(-1, 0);
-            }
-            break;
-        case MODE_ALL_APPS_ZOOMED:
-            break;
-        }
-    }
-
-    /**
-     * Implementation of the method from SwipeController.SwipeListener.
-     */
-    public void onSwipe(float amount) {
-        switch (mMode) {
-        case MODE_WORKSPACE:
-            // We can open the all apps view.
-            //   0 == workspace is showing
-            //  -1 == all apps is showing
-            setWorkspaceAndAllAppsScale(-amount);
-            break;
-        case MODE_ALL_APPS:
-            // We can close it, or (someday) zoom it further
-            //   0 == all apps showing
-            //   1 == workspace is showing
-            setWorkspaceAndAllAppsScale(1-amount);
-            break;
-        }
-    }
-
-    /**
-     * Set the scale factor for the workspace and the all apps grid.
-     *
-     * @param amount A float between 0 and 1, where:
-     *                  0 == workspace is showing and
-     *                  1 == the all apps grid is showing.
-     */
-    private void setWorkspaceAndAllAppsScale(float amount) {
-        //Log.d("setWorkspaceAndAllAppsScale", "setWorkspaceAndAllAppsScale amount=" + amount);
-        if (amount < 0.001f) {
-            amount = 0.0f;
-        }
-        if (amount > 0.999f) {
-            amount = 1.0f;
-            mWorkspace.setVisibility(View.INVISIBLE);
-        } else {
-            mWorkspace.setVisibility(View.VISIBLE);
-        }
-        //mWorkspace.setScale(1-amount);
-        mAllAppsGrid.setScale(amount);
-    }
-
-    /**
      * Implementation of the method from LauncherModel.Callbacks.
      */
     public int getCurrentWorkspaceScreen() {
