diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index b53fee2..86914b0 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -82,7 +82,8 @@
  * Default launcher application.
  */
 public final class Launcher extends Activity
-        implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks {
+        implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,
+        SwipeController.SwipeListener {
     static final String LOG_TAG = "Launcher";
     static final String TAG = LOG_TAG;
     static final boolean LOGD = false;
@@ -108,6 +109,10 @@
     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";
@@ -158,6 +163,7 @@
     private LayoutInflater mInflater;
 
     private DragController mDragController;
+    private SwipeController mSwipeController;
     private Workspace mWorkspace;
 
     private AppWidgetManager mAppWidgetManager;
@@ -171,7 +177,8 @@
     private DeleteZone mDeleteZone;
     private HandleView mHandleView;
     private AllAppsView mAllAppsGrid;
-    private boolean mAllAppsVisible;
+    private boolean mAllAppsVisible; // if it's visible at all
+    private int mMode = MODE_WORKSPACE;
 
     private Bundle mSavedState;
 
@@ -515,13 +522,18 @@
     private void setupViews() {
         mDragController = new DragController(this);
         DragController dragController = mDragController;
+        mSwipeController = new SwipeController(this, this);
+        SwipeController swipeController = mSwipeController;
+        swipeController.setRange(-1, 0);
 
         DragLayer dragLayer = (DragLayer) findViewById(R.id.drag_layer);
         dragLayer.setDragController(dragController);
+        dragLayer.setSwipeController(swipeController);
 
         mAllAppsGrid = (AllAppsView)dragLayer.findViewById(R.id.all_apps_view);
         mAllAppsGrid.setLauncher(this);
         mAllAppsGrid.setDragController(dragController);
+        mAllAppsGrid.setWillNotDraw(false); // We don't want a hole punched in our window.
 
         mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
         final Workspace workspace = mWorkspace;
@@ -1422,6 +1434,7 @@
         }
 
         if (mWorkspace.allowLongPress()) {
+            mSwipeController.cancelSwipe();
             if (cellInfo.cell == null) {
                 if (cellInfo.valid) {
                     // User long pressed on empty space
@@ -1607,7 +1620,7 @@
     void closeAllAppsDialog(boolean animated) {
         if (mAllAppsVisible) {
             Log.d(LOG_TAG, "closing all apps");
-            mAllAppsGrid.hide(animated);
+            mAllAppsGrid.hide();
             mAllAppsVisible = false;
             mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus();
             mWorkspace.show();
@@ -1744,6 +1757,89 @@
     }
 
     /**
+     * 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) {
+                mWorkspace.clearChildrenCache();
+                mMode = MODE_ALL_APPS;
+                mSwipeController.setRange(0, 1);
+            }
+            break;
+        case MODE_ALL_APPS:
+            if (amount == 1) {
+                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() {
