diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c0d03bc..cdfe585 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -62,9 +62,11 @@
     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
     <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
 
+    <!-- During development, run outside acore
+        android:process="android.process.acore"
+    -->
     <application
         android:name="LauncherApplication"
-        android:process="android.process.acore"
         android:label="@string/application_name"
         android:icon="@drawable/ic_launcher_home">
 
diff --git a/res/layout-port/all_apps.xml b/res/layout-port/all_apps.xml
index c954685..a076df0 100644
--- a/res/layout-port/all_apps.xml
+++ b/res/layout-port/all_apps.xml
@@ -14,20 +14,25 @@
      limitations under the License.
 -->
 
-<com.android.launcher2.AllAppsGridView
+<com.android.launcher2.DragLayer
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher2"
 
-    android:id="@+id/all_apps"
+    android:id="@+id/drag_layer"
     android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
+    android:layout_height="fill_parent">
 
-    android:scrollbarStyle="outsideInset"
-    android:drawSelectorOnTop="false"
-    android:listSelector="@drawable/grid_selector"
+    <com.android.launcher2.AllAppsGridView
+        android:id="@+id/all_apps"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
 
-    android:verticalSpacing="10dip"
-    android:numColumns="4" />
+        android:scrollbarStyle="outsideInset"
+        android:drawSelectorOnTop="false"
+        android:listSelector="@drawable/grid_selector"
+
+        android:verticalSpacing="10dip"
+        android:numColumns="4" />
 
 <!--
     android:nextFocusLeft="@id/content"
@@ -35,3 +40,5 @@
     android:nextFocusUp="@id/all_apps"
     android:nextFocusRight="@id/content"
 -->
+
+</com.android.launcher2.DragLayer>
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index 462fe52..893a430 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -14,18 +14,22 @@
      limitations under the License.
 -->
 
-<com.android.launcher2.DragLayer
+<FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher2"
 
-    android:id="@+id/drag_layer"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent">
 
-    <com.android.launcher2.WallpaperView
-        android:id="@+id/wallpaper"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent" />
+<com.android.launcher2.WallpaperView
+    android:id="@+id/wallpaper"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent" />
+
+<com.android.launcher2.DragLayer
+    android:id="@+id/drag_layer"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
 
     <!-- The workspace contains 3 screens of cells -->
     <com.android.launcher2.Workspace
@@ -72,3 +76,5 @@
         launcher:direction="horizontal" />
 
 </com.android.launcher2.DragLayer>
+
+</FrameLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f971f7c..f286fa1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -21,7 +21,7 @@
     <!-- General -->
     <skip />
     <!-- Application name -->
-    <string name="application_name">Launcher2</string>
+    <string name="application_name">_Launcher2</string>
     <!-- Name for all applications running as this uid. -->
     <string name="uid_name">Android Core Apps</string>
     <!-- Default folder name -->
diff --git a/src/com/android/launcher2/AllAppsGridView.java b/src/com/android/launcher2/AllAppsGridView.java
index cca9ed2..711e213 100644
--- a/src/com/android/launcher2/AllAppsGridView.java
+++ b/src/com/android/launcher2/AllAppsGridView.java
@@ -30,8 +30,9 @@
 public class AllAppsGridView extends GridView implements AdapterView.OnItemClickListener,
         AdapterView.OnItemLongClickListener, DragSource {
 
-    private DragController mDragger;
+    private DragController mDragController;
     private Launcher mLauncher;
+    private boolean mDraw = true;
 
     public AllAppsGridView(Context context) {
         super(context);
@@ -64,20 +65,33 @@
         ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);
         app = new ApplicationInfo(app);
 
-        mDragger.startDrag(view, this, app, DragController.DRAG_ACTION_COPY);
-        mLauncher.closeAllApplications();
-
+        mDragController.startDrag(view, this, app, DragController.DRAG_ACTION_COPY);
+        mLauncher.showWorkspace();
+        mDraw = false;
+        invalidate();
         return true;
     }
 
-    public void setDragger(DragController dragger) {
-        mDragger = dragger;
+    @Override
+    protected void dispatchDraw(Canvas canvas) {
+        if (mDraw) {
+            super.dispatchDraw(canvas);
+        }
+    }
+
+    public void setDragController(DragController dragController) {
+        mDragController = dragController;
     }
 
     public void onDropCompleted(View target, boolean success) {
+        mLauncher.closeAllAppsDialog(false);
     }
 
     void setLauncher(Launcher launcher) {
         mLauncher = launcher;
     }
+
+    void onPrepareDialog() {
+        mDraw = true;
+    }
 }
diff --git a/src/com/android/launcher2/DeleteZone.java b/src/com/android/launcher2/DeleteZone.java
index f726625..8a2545f 100644
--- a/src/com/android/launcher2/DeleteZone.java
+++ b/src/com/android/launcher2/DeleteZone.java
@@ -19,6 +19,9 @@
 import android.widget.ImageView;
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
 import android.graphics.Rect;
 import android.util.AttributeSet;
 import android.view.View;
@@ -46,15 +49,12 @@
     private Animation mHandleOutAnimation;
 
     private int mOrientation;
-    private DragLayer mDragLayer;
+    private DragController mDragController;
 
     private final RectF mRegion = new RectF();
     private TransitionDrawable mTransition;
     private View mHandle;
-
-    public DeleteZone(Context context) {
-        super(context);
-    }
+    private final Paint mTrashPaint = new Paint();
 
     public DeleteZone(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
@@ -63,6 +63,9 @@
     public DeleteZone(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
 
+        final int srcColor = context.getResources().getColor(R.color.delete_color_filter);
+        mTrashPaint.setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.SRC_ATOP));
+
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DeleteZone, defStyle, 0);
         mOrientation = a.getInt(R.styleable.DeleteZone_direction, ORIENTATION_HORIZONTAL);
         a.recycle();
@@ -75,15 +78,17 @@
     }
 
     public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         return true;
     }
     
-    public Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo, Rect recycle) {
+    public Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo, Rect recycle) {
         return null;
     }
 
-    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
         final ItemInfo item = (ItemInfo) dragInfo;
 
         if (item.container == -1) return;
@@ -117,17 +122,19 @@
     }
 
     public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         mTransition.reverseTransition(TRANSITION_DURATION);
+        dragView.setPaint(mTrashPaint);
     }
 
     public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
     }
 
     public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         mTransition.reverseTransition(TRANSITION_DURATION);
+        dragView.setPaint(null);
     }
 
     public void onDragStart(View v, DragSource source, Object info, int dragAction) {
@@ -139,7 +146,7 @@
             getLocationOnScreen(location);
             mRegion.set(location[0], location[1], location[0] + mRight - mLeft,
                     location[1] + mBottom - mTop);
-            mDragLayer.setDeleteRegion(mRegion);
+            mDragController.setDeleteRegion(mRegion);
             mTransition.resetTransition();
             startAnimation(mInAnimation);
             mHandle.startAnimation(mHandleOutAnimation);
@@ -150,7 +157,7 @@
     public void onDragEnd() {
         if (mTrashMode) {
             mTrashMode = false;
-            mDragLayer.setDeleteRegion(null);
+            mDragController.setDeleteRegion(null);
             startAnimation(mOutAnimation);
             mHandle.startAnimation(mHandleInAnimation);
             setVisibility(GONE);
@@ -221,8 +228,8 @@
         mLauncher = launcher;
     }
 
-    void setDragController(DragLayer dragLayer) {
-        mDragLayer = dragLayer;
+    void setDragController(DragController dragController) {
+        mDragController = dragController;
     }
 
     void setHandle(View view) {
diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java
index f8c8077..da2df5c 100644
--- a/src/com/android/launcher2/DragController.java
+++ b/src/com/android/launcher2/DragController.java
@@ -16,14 +16,108 @@
 
 package com.android.launcher2;
 
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.IBinder;
+import android.os.Handler;
+import android.os.Vibrator;
+import android.os.SystemClock;
+import android.util.AttributeSet;
+import android.util.Log;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+
+import java.util.ArrayList;
 
 /**
- * Interface for initiating a drag within a view or across multiple views.
- *
+ * Class for initiating a drag within a view or across multiple views.
  */
-public interface DragController {
-    
+public class DragController {
+    /** Indicates the drag is a move.  */
+    public static int DRAG_ACTION_MOVE = 0;
+
+    /** Indicates the drag is a copy.  */
+    public static int DRAG_ACTION_COPY = 1;
+
+    private static final int SCROLL_DELAY = 600;
+    private static final int SCROLL_ZONE = 20;
+    private static final int VIBRATE_DURATION = 35;
+
+    private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
+
+    private static final int SCROLL_OUTSIDE_ZONE = 0;
+    private static final int SCROLL_WAITING_IN_ZONE = 1;
+
+    private static final int SCROLL_LEFT = 0;
+    private static final int SCROLL_RIGHT = 1;
+
+    private Context mContext;
+    private Handler mHandler;
+    private final Vibrator mVibrator = new Vibrator();
+
+    // temporaries to avoid gc thrash
+    private Rect mRectTemp = new Rect();
+    private final int[] mCoordinatesTemp = new int[2];
+
+    /** Whether or not we're dragging. */
+    private boolean mDragging;
+
+    /** X coordinate of the down event. */
+    private float mMotionDownX;
+
+    /** Y coordinate of the down event. */
+    private float mMotionDownY;
+
+    /** Original view that is being dragged.  */
+    private View mOriginator;
+
+    /** The contents of mOriginator with no scaling.  */
+    private Bitmap mDragBitmap;
+
+    /** X offset from the upper-left corner of the cell to where we touched.  */
+    private float mTouchOffsetX;
+
+    /** Y offset from the upper-left corner of the cell to where we touched.  */
+    private float mTouchOffsetY;
+
+    /** Where the drag originated */
+    private DragSource mDragSource;
+
+    /** The data associated with the object being dragged */
+    private Object mDragInfo;
+
+    /** The view that moves around while you drag.  */
+    private DragView mDragView;
+
+    /** Who can receive drop events */
+    private ArrayList<DropTarget> mDropTargets = new ArrayList<DropTarget>();
+
+    private DragListener mListener;
+
+    /** The window token used as the parent for the DragView. */
+    private IBinder mWindowToken;
+
+    /** The view that will be scrolled when dragging to the left and right edges of the screen. */
+    private View mScrollView;
+
+    private DragScroller mDragScroller;
+    private int mScrollState = SCROLL_OUTSIDE_ZONE;
+    private ScrollRunnable mScrollRunnable = new ScrollRunnable();
+
+    private RectF mDeleteRegion;
+    private DropTarget mLastDropTarget;
+
+    private InputMethodManager mInputMethodManager;
+
     /**
      * Interface to receive notifications when a drag starts or stops
      */
@@ -47,14 +141,15 @@
     }
     
     /**
-     * Indicates the drag is a move.
+     * Used to create a new DragLayer from XML.
+     *
+     * @param context The application's context.
+     * @param attrs The attribtues set containing the Workspace's customization values.
      */
-    public static int DRAG_ACTION_MOVE = 0;
-
-    /**
-     * Indicates the drag is a copy.
-     */
-    public static int DRAG_ACTION_COPY = 1;
+    public DragController(Context context) {
+        mContext = context;
+        mHandler = new Handler();
+    }
 
     /**
      * Starts a drag
@@ -65,15 +160,355 @@
      * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
      *        {@link #DRAG_ACTION_COPY}
      */
-    void startDrag(View v, DragSource source, Object info, int dragAction);
-    
+    public void startDrag(View v, DragSource source, Object dragInfo, int dragAction) {
+        if (PROFILE_DRAWING_DURING_DRAG) {
+            android.os.Debug.startMethodTracing("Launcher");
+        }
+
+        // Hide soft keyboard, if visible
+        if (mInputMethodManager == null) {
+            mInputMethodManager = (InputMethodManager)
+                    mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
+        }
+        mInputMethodManager.hideSoftInputFromWindow(mWindowToken, 0);
+
+        if (mListener != null) {
+            mListener.onDragStart(v, source, dragInfo, dragAction);
+        }
+
+        int[] loc = mCoordinatesTemp;
+        v.getLocationOnScreen(loc);
+        int screenX = loc[0];
+        int screenY = loc[1];
+
+        int registrationX = ((int)mMotionDownX) - screenX;
+        int registrationY = ((int)mMotionDownY) - screenY;
+
+        mTouchOffsetX = mMotionDownX - screenX;
+        mTouchOffsetY = mMotionDownY - screenY;
+
+        mDragging = true;
+        mOriginator = v;
+        mDragSource = source;
+        mDragInfo = dragInfo;
+
+        mVibrator.vibrate(VIBRATE_DURATION);
+
+        mDragBitmap = getViewBitmap(v);
+        DragView dragView = mDragView = new DragView(mContext, mDragBitmap,
+                registrationX, registrationY);
+        dragView.show(mWindowToken, (int)mMotionDownX, (int)mMotionDownY);
+
+        if (dragAction == DRAG_ACTION_MOVE) {
+            v.setVisibility(View.GONE);
+        }
+    }
+
+    /**
+     * Draw the view into a bitmap.
+     */
+    private Bitmap getViewBitmap(View v) {
+        v.clearFocus();
+        v.setPressed(false);
+
+        boolean willNotCache = v.willNotCacheDrawing();
+        v.setWillNotCacheDrawing(false);
+
+        // Reset the drawing cache background color to fully transparent
+        // for the duration of this operation
+        int color = v.getDrawingCacheBackgroundColor();
+        v.setDrawingCacheBackgroundColor(0);
+
+        if (color != 0) {
+            v.destroyDrawingCache();
+        }
+        v.buildDrawingCache();
+        Bitmap cacheBitmap = v.getDrawingCache();
+
+        Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
+
+        // Restore the view
+        v.destroyDrawingCache();
+        v.setWillNotCacheDrawing(willNotCache);
+        v.setDrawingCacheBackgroundColor(color);
+
+        return bitmap;
+    }
+
+    /**
+     * Call this from a drag source view like this:
+     *
+     * <pre>
+     *  @Override
+     *  public boolean dispatchKeyEvent(KeyEvent event) {
+     *      return mDragController.dispatchKeyEvent(this, event)
+     *              || super.dispatchKeyEvent(event);
+     * </pre>
+     */
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        return mDragging;
+    }
+
+    private void endDrag() {
+        if (mDragging) {
+            mDragging = false;
+            if (mOriginator != null) {
+                mOriginator.setVisibility(View.VISIBLE);
+            }
+            if (mListener != null) {
+                mListener.onDragEnd();
+            }
+            if (mDragView != null) {
+                mDragView.remove();
+                mDragView = null;
+            }
+            if (mDragBitmap != null) {
+                mDragBitmap.recycle();
+                mDragBitmap = null;
+            }
+        }
+    }
+
+    /**
+     * Call this from a drag source view.
+     */
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        final int action = ev.getAction();
+
+        final float screenX = ev.getRawX();
+        final float screenY = ev.getRawY();
+
+        switch (action) {
+            case MotionEvent.ACTION_MOVE:
+                break;
+
+            case MotionEvent.ACTION_DOWN:
+                // Remember location of down touch
+                mMotionDownX = screenX;
+                mMotionDownY = screenY;
+                mLastDropTarget = null;
+                break;
+
+            case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_UP:
+                if (mDragging) {
+                    drop(screenX, screenY);
+                }
+                endDrag();
+                break;
+        }
+
+        return mDragging;
+    }
+
+    /**
+     * Call this from a drag source view.
+     */
+    public boolean onTouchEvent(MotionEvent ev) {
+        View scrollView = mScrollView;
+
+        if (!mDragging) {
+            return false;
+        }
+
+        final int action = ev.getAction();
+        final float x = ev.getRawX();
+        final float y = ev.getRawY();
+
+        switch (action) {
+        case MotionEvent.ACTION_DOWN:
+
+            // Remember where the motion event started
+            mMotionDownX = x;
+            mMotionDownY = y;
+
+            if ((x < SCROLL_ZONE) || (x > scrollView.getWidth() - SCROLL_ZONE)) {
+                mScrollState = SCROLL_WAITING_IN_ZONE;
+                mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
+            } else {
+                mScrollState = SCROLL_OUTSIDE_ZONE;
+            }
+
+            break;
+        case MotionEvent.ACTION_MOVE:
+            // Update the drag view.
+            mDragView.move((int)ev.getRawX(), (int)ev.getRawY());
+
+            // Drop on someone?
+            final int[] coordinates = mCoordinatesTemp;
+            DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);
+            if (dropTarget != null) {
+                if (mLastDropTarget == dropTarget) {
+                    dropTarget.onDragOver(mDragSource, coordinates[0], coordinates[1],
+                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
+                } else {
+                    if (mLastDropTarget != null) {
+                        mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
+                            (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
+                    }
+                    dropTarget.onDragEnter(mDragSource, coordinates[0], coordinates[1],
+                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
+                }
+            } else {
+                if (mLastDropTarget != null) {
+                    mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
+                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
+                }
+            }
+            mLastDropTarget = dropTarget;
+
+            // Scroll, maybe, but not if we're in the delete region.
+            boolean inDeleteRegion = false;
+            if (mDeleteRegion != null) {
+                inDeleteRegion = mDeleteRegion.contains(ev.getRawX(), ev.getRawY());
+            }
+            if (!inDeleteRegion && x < SCROLL_ZONE) {
+                if (mScrollState == SCROLL_OUTSIDE_ZONE) {
+                    mScrollState = SCROLL_WAITING_IN_ZONE;
+                    mScrollRunnable.setDirection(SCROLL_LEFT);
+                    mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
+                }
+            } else if (!inDeleteRegion && x > scrollView.getWidth() - SCROLL_ZONE) {
+                if (mScrollState == SCROLL_OUTSIDE_ZONE) {
+                    mScrollState = SCROLL_WAITING_IN_ZONE;
+                    mScrollRunnable.setDirection(SCROLL_RIGHT);
+                    mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
+                }
+            } else {
+                if (mScrollState == SCROLL_WAITING_IN_ZONE) {
+                    mScrollState = SCROLL_OUTSIDE_ZONE;
+                    mScrollRunnable.setDirection(SCROLL_RIGHT);
+                    mHandler.removeCallbacks(mScrollRunnable);
+                }
+            }
+
+            break;
+        case MotionEvent.ACTION_UP:
+            mHandler.removeCallbacks(mScrollRunnable);
+            if (mDragging) {
+                drop(x, y);
+            }
+            endDrag();
+
+            break;
+        case MotionEvent.ACTION_CANCEL:
+            endDrag();
+        }
+
+        return true;
+    }
+
+    private boolean drop(float x, float y) {
+        final int[] coordinates = mCoordinatesTemp;
+        DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);
+
+        if (dropTarget != null) {
+            dropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
+                    (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
+            if (dropTarget.acceptDrop(mDragSource, coordinates[0], coordinates[1],
+                    (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo)) {
+                dropTarget.onDrop(mDragSource, coordinates[0], coordinates[1],
+                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
+                mDragSource.onDropCompleted((View) dropTarget, true);
+                return true;
+            } else {
+                mDragSource.onDropCompleted((View) dropTarget, false);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private DropTarget findDropTarget(int x, int y, int[] dropCoordinates) {
+        final Rect r = mRectTemp;
+
+        final ArrayList<DropTarget> dropTargets = mDropTargets;
+        final int count = dropTargets.size();
+        for (int i=count-1; i>=0; i--) {
+            final DropTarget target = dropTargets.get(i);
+            target.getHitRect(r);
+            target.getLocationOnScreen(dropCoordinates);
+            r.offset(dropCoordinates[0] - target.getLeft(), dropCoordinates[1] - target.getTop());
+            if (r.contains(x, y)) {
+                dropCoordinates[0] = x - dropCoordinates[0];
+                dropCoordinates[1] = y - dropCoordinates[1];
+                return target;
+            }
+        }
+        return null;
+    }
+
+    public void setDragScoller(DragScroller scroller) {
+        mDragScroller = scroller;
+    }
+
+    public void setWindowToken(IBinder token) {
+        mWindowToken = token;
+    }
+
     /**
      * Sets the drag listner which will be notified when a drag starts or ends.
      */
-    void setDragListener(DragListener l);
-    
+    public void setDragListener(DragListener l) {
+        mListener = l;
+    }
+
     /**
      * Remove a previously installed drag listener.
      */
-    void removeDragListener(DragListener l);
+    public void removeDragListener(DragListener l) {
+        mListener = null;
+    }
+
+    /**
+     * Add a DropTarget to the list of potential places to receive drop events.
+     */
+    public void addDropTarget(DropTarget target) {
+        mDropTargets.add(target);
+    }
+
+    /**
+     * Don't send drop events to <em>target</em> any more.
+     */
+    public void removeDropTarget(DropTarget target) {
+        mDropTargets.remove(target);
+    }
+
+    /**
+     * Set which view scrolls for touch events near the edge of the screen.
+     */
+    public void setScrollView(View v) {
+        mScrollView = v;
+    }
+
+    /**
+     * Specifies the delete region.  We won't scroll on touch events over the delete region.
+     *
+     * @param region The rectangle in screen coordinates of the delete region.
+     */
+    void setDeleteRegion(RectF region) {
+        mDeleteRegion = region;
+    }
+
+    private class ScrollRunnable implements Runnable {
+        private int mDirection;
+
+        ScrollRunnable() {
+        }
+
+        public void run() {
+            if (mDragScroller != null) {
+                if (mDirection == SCROLL_LEFT) {
+                    mDragScroller.scrollLeft();
+                } else {
+                    mDragScroller.scrollRight();
+                }
+                mScrollState = SCROLL_OUTSIDE_ZONE;
+            }
+        }
+
+        void setDirection(int direction) {
+            mDirection = direction;
+        }
+    }
 }
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java
index fee8632..2839711 100644
--- a/src/com/android/launcher2/DragLayer.java
+++ b/src/com/android/launcher2/DragLayer.java
@@ -39,114 +39,9 @@
 /**
  * A ViewGroup that coordinated dragging across its dscendants
  */
-public class DragLayer extends FrameLayout implements DragController {
-    private static final int SCROLL_DELAY = 600;
-    private static final int SCROLL_ZONE = 20;
-    private static final int VIBRATE_DURATION = 35;
-    private static final int ANIMATION_SCALE_UP_DURATION = 110;
+public class DragLayer extends FrameLayout {
 
-    private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
-
-    // Number of pixels to add to the dragged item for scaling
-    private static final float DRAG_SCALE = 24.0f;
-
-    private boolean mDragging = false;
-    private boolean mShouldDrop;
-    private float mLastMotionX;
-    private float mLastMotionY;
-
-    /**
-     * The bitmap that is currently being dragged
-     */
-    private Bitmap mDragBitmap = null;
-    private View mOriginator;
-
-    private int mBitmapOffsetX;
-    private int mBitmapOffsetY;
-
-    /**
-     * X offset from where we touched on the cell to its upper-left corner
-     */
-    private float mTouchOffsetX;
-
-    /**
-     * Y offset from where we touched on the cell to its upper-left corner
-     */
-    private float mTouchOffsetY;
-
-    /**
-     * Utility rectangle
-     */
-    private Rect mDragRect = new Rect();
-
-    /**
-     * Where the drag originated
-     */
-    private DragSource mDragSource;
-
-    /**
-     * The data associated with the object being dragged
-     */
-    private Object mDragInfo;
-
-    private final Rect mRect = new Rect();
-    private final int[] mDropCoordinates = new int[2];
-
-    private final Vibrator mVibrator = new Vibrator();
-
-    private DragListener mListener;
-
-    private DragScroller mDragScroller;
-
-    private static final int SCROLL_OUTSIDE_ZONE = 0;
-    private static final int SCROLL_WAITING_IN_ZONE = 1;
-
-    private static final int SCROLL_LEFT = 0;
-    private static final int SCROLL_RIGHT = 1;
-
-    private int mScrollState = SCROLL_OUTSIDE_ZONE;
-
-    private ScrollRunnable mScrollRunnable = new ScrollRunnable();
-    private View mIgnoredDropTarget;
-
-    private RectF mDragRegion;
-    private boolean mEnteredRegion;
-    private DropTarget mLastDropTarget;
-
-    private final Paint mTrashPaint = new Paint();
-    private final Paint mEstimatedPaint = new Paint();
-    private Paint mDragPaint;
-
-    /**
-     * If true, draw a "snag" showing where the object currently being dragged
-     * would end up if dropped from current location.
-     */
-    private static final boolean DRAW_TARGET_SNAG = false;
-
-    private Rect mEstimatedRect = new Rect();
-    private float[] mDragCenter = new float[2];
-    private float[] mEstimatedCenter = new float[2];
-    private boolean mDrawEstimated = false;
-
-    private int mTriggerWidth = -1;
-    private int mTriggerHeight = -1;
-
-    private static final int DISTANCE_DRAW_SNAG = 20;
-
-    private static final int ANIMATION_STATE_STARTING = 1;
-    private static final int ANIMATION_STATE_RUNNING = 2;
-    private static final int ANIMATION_STATE_DONE = 3;
-
-    private static final int ANIMATION_TYPE_SCALE = 1;
-
-    private float mAnimationFrom;
-    private float mAnimationTo;
-    private int mAnimationDuration;
-    private long mAnimationStartTime;
-    private int mAnimationType;
-    private int mAnimationState = ANIMATION_STATE_DONE;
-
-    private InputMethodManager mInputMethodManager;
+    DragController mDragController;
 
     /**
      * Used to create a new DragLayer from XML.
@@ -156,478 +51,24 @@
      */
     public DragLayer(Context context, AttributeSet attrs) {
         super(context, attrs);
-
-        final int srcColor = context.getResources().getColor(R.color.delete_color_filter);
-        mTrashPaint.setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.SRC_ATOP));
-
-        // Make estimated paint area in gray
-        int snagColor = context.getResources().getColor(R.color.snag_callout_color);
-        mEstimatedPaint.setColor(snagColor);
-        mEstimatedPaint.setStrokeWidth(3);
-        mEstimatedPaint.setAntiAlias(true);
-
     }
 
-    public void startDrag(View v, DragSource source, Object dragInfo, int dragAction) {
-        if (PROFILE_DRAWING_DURING_DRAG) {
-            android.os.Debug.startMethodTracing("Launcher");
-        }
-
-        // Hide soft keyboard, if visible
-        if (mInputMethodManager == null) {
-            mInputMethodManager = (InputMethodManager)
-                getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-        }
-        mInputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
-
-        if (mListener != null) {
-            mListener.onDragStart(v, source, dragInfo, dragAction);
-        }
-
-        Rect r = mDragRect;
-        r.set(v.getScrollX(), v.getScrollY(), 0, 0);
-
-        offsetDescendantRectToMyCoords(v, r);
-        mTouchOffsetX = mLastMotionX - r.left;
-        mTouchOffsetY = mLastMotionY - r.top;
-
-        v.clearFocus();
-        v.setPressed(false);
-
-        boolean willNotCache = v.willNotCacheDrawing();
-        v.setWillNotCacheDrawing(false);
-
-        // Reset the drawing cache background color to fully transparent
-        // for the duration of this operation
-        int color = v.getDrawingCacheBackgroundColor();
-        v.setDrawingCacheBackgroundColor(0);
-
-        if (color != 0) {
-            v.destroyDrawingCache();
-        }
-        v.buildDrawingCache();
-        Bitmap viewBitmap = v.getDrawingCache();
-        int width = viewBitmap.getWidth();
-        int height = viewBitmap.getHeight();
-
-        mTriggerWidth = width * 2 / 3;
-        mTriggerHeight = height * 2 / 3;
-
-        Matrix scale = new Matrix();
-        float scaleFactor = v.getWidth();
-        scaleFactor = (scaleFactor + DRAG_SCALE) /scaleFactor;
-        scale.setScale(scaleFactor, scaleFactor);
-
-        mAnimationTo = 1.0f;
-        mAnimationFrom = 1.0f / scaleFactor;
-        mAnimationDuration = ANIMATION_SCALE_UP_DURATION;
-        mAnimationState = ANIMATION_STATE_STARTING;
-        mAnimationType = ANIMATION_TYPE_SCALE;
-
-        mDragBitmap = Bitmap.createBitmap(viewBitmap, 0, 0, width, height, scale, true);
-        v.destroyDrawingCache();
-        v.setWillNotCacheDrawing(willNotCache);
-        v.setDrawingCacheBackgroundColor(color);
-
-        final Bitmap dragBitmap = mDragBitmap;
-        mBitmapOffsetX = (dragBitmap.getWidth() - width) / 2;
-        mBitmapOffsetY = (dragBitmap.getHeight() - height) / 2;
-
-        if (dragAction == DRAG_ACTION_MOVE) {
-            v.setVisibility(GONE);
-        }
-
-        mDragPaint = null;
-        mDragging = true;
-        mShouldDrop = true;
-        mOriginator = v;
-        mDragSource = source;
-        mDragInfo = dragInfo;
-
-        mVibrator.vibrate(VIBRATE_DURATION);
-
-        mEnteredRegion = false;
-
-        invalidate();
+    public void setDragController(DragController controller) {
+        mDragController = controller;
     }
-
+    
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-        return mDragging || super.dispatchKeyEvent(event);
-    }
-
-    @Override
-    protected void dispatchDraw(Canvas canvas) {
-        super.dispatchDraw(canvas);
-
-        if (mDragging && mDragBitmap != null) {
-            if (mAnimationState == ANIMATION_STATE_STARTING) {
-                mAnimationStartTime = SystemClock.uptimeMillis();
-                mAnimationState = ANIMATION_STATE_RUNNING;
-            }
-
-            if (mAnimationState == ANIMATION_STATE_RUNNING) {
-                float normalized = (float) (SystemClock.uptimeMillis() - mAnimationStartTime) /
-                        mAnimationDuration;
-                if (normalized >= 1.0f) {
-                    mAnimationState = ANIMATION_STATE_DONE;
-                }
-                normalized = Math.min(normalized, 1.0f);
-                final float value = mAnimationFrom  + (mAnimationTo - mAnimationFrom) * normalized;
-
-                switch (mAnimationType) {
-                    case ANIMATION_TYPE_SCALE:
-                        final Bitmap dragBitmap = mDragBitmap;
-                        canvas.save();
-                        canvas.translate(mScrollX + mLastMotionX - mTouchOffsetX - mBitmapOffsetX,
-                                mScrollY + mLastMotionY - mTouchOffsetY - mBitmapOffsetY);
-                        canvas.translate((dragBitmap.getWidth() * (1.0f - value)) / 2,
-                                (dragBitmap.getHeight() * (1.0f - value)) / 2);
-                        canvas.scale(value, value);
-                        canvas.drawBitmap(dragBitmap, 0.0f, 0.0f, mDragPaint);
-                        canvas.restore();
-                        break;
-                }
-            } else {
-                // Only draw estimate drop "snag" when requested
-                if (DRAW_TARGET_SNAG && mDrawEstimated) {
-                    canvas.drawLine(mDragCenter[0], mDragCenter[1], mEstimatedCenter[0], mEstimatedCenter[1], mEstimatedPaint);
-                    canvas.drawCircle(mEstimatedCenter[0], mEstimatedCenter[1], 8, mEstimatedPaint);
-                }
-
-                // Draw actual icon being dragged
-                canvas.drawBitmap(mDragBitmap,
-                        mScrollX + mLastMotionX - mTouchOffsetX - mBitmapOffsetX,
-                        mScrollY + mLastMotionY - mTouchOffsetY - mBitmapOffsetY, mDragPaint);
-            }
-        }
-    }
-
-    private void endDrag() {
-        if (mDragging) {
-            mDragging = false;
-            if (mDragBitmap != null) {
-                mDragBitmap.recycle();
-            }
-            if (mOriginator != null) {
-                mOriginator.setVisibility(VISIBLE);
-            }
-            if (mListener != null) {
-                mListener.onDragEnd();
-            }
-        }
+        return mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
     }
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
-        final int action = ev.getAction();
-
-        final float x = ev.getX();
-        final float y = ev.getY();
-
-        switch (action) {
-            case MotionEvent.ACTION_MOVE:
-                break;
-
-            case MotionEvent.ACTION_DOWN:
-                // Remember location of down touch
-                mLastMotionX = x;
-                mLastMotionY = y;
-                mLastDropTarget = null;
-                break;
-
-            case MotionEvent.ACTION_CANCEL:
-            case MotionEvent.ACTION_UP:
-                if (mShouldDrop && drop(x, y)) {
-                    mShouldDrop = false;
-                }
-                endDrag();
-                break;
-        }
-
-        return mDragging;
+        return mDragController.onInterceptTouchEvent(ev);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
-        if (!mDragging) {
-            return false;
-        }
-
-        final int action = ev.getAction();
-        final float x = ev.getX();
-        final float y = ev.getY();
-
-        switch (action) {
-        case MotionEvent.ACTION_DOWN:
-
-            // Remember where the motion event started
-            mLastMotionX = x;
-            mLastMotionY = y;
-
-            if ((x < SCROLL_ZONE) || (x > getWidth() - SCROLL_ZONE)) {
-                mScrollState = SCROLL_WAITING_IN_ZONE;
-                postDelayed(mScrollRunnable, SCROLL_DELAY);
-            } else {
-                mScrollState = SCROLL_OUTSIDE_ZONE;
-            }
-
-            break;
-        case MotionEvent.ACTION_MOVE:
-            final int scrollX = mScrollX;
-            final int scrollY = mScrollY;
-
-            final float touchX = mTouchOffsetX;
-            final float touchY = mTouchOffsetY;
-
-            final int offsetX = mBitmapOffsetX;
-            final int offsetY = mBitmapOffsetY;
-
-            int left = (int) (scrollX + mLastMotionX - touchX - offsetX);
-            int top = (int) (scrollY + mLastMotionY - touchY - offsetY);
-
-            final Bitmap dragBitmap = mDragBitmap;
-            final int width = dragBitmap.getWidth();
-            final int height = dragBitmap.getHeight();
-
-            final Rect rect = mRect;
-            rect.set(left - 1, top - 1, left + width + 1, top + height + 1);
-
-            mLastMotionX = x;
-            mLastMotionY = y;
-
-            left = (int) (scrollX + x - touchX - offsetX);
-            top = (int) (scrollY + y - touchY - offsetY);
-
-            // Invalidate current icon position
-            rect.union(left - 1, top - 1, left + width + 1, top + height + 1);
-
-            mDragCenter[0] = rect.centerX();
-            mDragCenter[1] = rect.centerY();
-
-            // Invalidate any old estimated location
-            if (DRAW_TARGET_SNAG && mDrawEstimated) {
-                rect.union(mEstimatedRect);
-            }
-
-            final int[] coordinates = mDropCoordinates;
-            DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);
-            if (dropTarget != null) {
-                if (mLastDropTarget == dropTarget) {
-                    dropTarget.onDragOver(mDragSource, coordinates[0], coordinates[1],
-                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);
-                } else {
-                    if (mLastDropTarget != null) {
-                        mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
-                            (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);
-                    }
-                    dropTarget.onDragEnter(mDragSource, coordinates[0], coordinates[1],
-                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);
-                }
-            } else {
-                if (mLastDropTarget != null) {
-                    mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
-                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);
-                }
-            }
-
-            // Render estimated drop "snag" only outside of width
-            mDrawEstimated = false;
-            if (DRAW_TARGET_SNAG && dropTarget != null) {
-                Rect foundEstimate = dropTarget.estimateDropLocation(mDragSource,
-                        (int) (scrollX + mLastMotionX), (int) (scrollY + mLastMotionY),
-                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo, mEstimatedRect);
-
-                if (foundEstimate != null) {
-                    mEstimatedCenter[0] = foundEstimate.centerX();
-                    mEstimatedCenter[1] = foundEstimate.centerY();
-
-                    int deltaX = (int) Math.abs(mEstimatedCenter[0] - mDragCenter[0]);
-                    int deltaY = (int) Math.abs(mEstimatedCenter[1] - mDragCenter[1]);
-
-                    if (deltaX > mTriggerWidth || deltaY > mTriggerHeight) {
-                        mDrawEstimated = true;
-                    }
-                }
-            }
-
-            // Include new estimated area in invalidated rectangle
-            if (DRAW_TARGET_SNAG && mDrawEstimated) {
-                rect.union(mEstimatedRect);
-            }
-            invalidate(rect);
-
-            mLastDropTarget = dropTarget;
-
-            boolean inDragRegion = false;
-            if (mDragRegion != null) {
-                final RectF region = mDragRegion;
-                final boolean inRegion = region.contains(ev.getRawX(), ev.getRawY());
-                if (!mEnteredRegion && inRegion) {
-                    mDragPaint = mTrashPaint;
-                    mEnteredRegion = true;
-                    inDragRegion = true;
-                } else if (mEnteredRegion && !inRegion) {
-                    mDragPaint = null;
-                    mEnteredRegion = false;
-                }
-            }
-
-            if (!inDragRegion && x < SCROLL_ZONE) {
-                if (mScrollState == SCROLL_OUTSIDE_ZONE) {
-                    mScrollState = SCROLL_WAITING_IN_ZONE;
-                    mScrollRunnable.setDirection(SCROLL_LEFT);
-                    postDelayed(mScrollRunnable, SCROLL_DELAY);
-                }
-            } else if (!inDragRegion && x > getWidth() - SCROLL_ZONE) {
-                if (mScrollState == SCROLL_OUTSIDE_ZONE) {
-                    mScrollState = SCROLL_WAITING_IN_ZONE;
-                    mScrollRunnable.setDirection(SCROLL_RIGHT);
-                    postDelayed(mScrollRunnable, SCROLL_DELAY);
-                }
-            } else {
-                if (mScrollState == SCROLL_WAITING_IN_ZONE) {
-                    mScrollState = SCROLL_OUTSIDE_ZONE;
-                    mScrollRunnable.setDirection(SCROLL_RIGHT);
-                    removeCallbacks(mScrollRunnable);
-                }
-            }
-
-            break;
-        case MotionEvent.ACTION_UP:
-            removeCallbacks(mScrollRunnable);
-            if (mShouldDrop) {
-                drop(x, y);
-                mShouldDrop = false;
-            }
-            endDrag();
-
-            break;
-        case MotionEvent.ACTION_CANCEL:
-            endDrag();
-        }
-
-        return true;
-    }
-
-    private boolean drop(float x, float y) {
-        invalidate();
-
-        final int[] coordinates = mDropCoordinates;
-        DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);
-
-        if (dropTarget != null) {
-            dropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],
-                    (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);
-            if (dropTarget.acceptDrop(mDragSource, coordinates[0], coordinates[1],
-                    (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo)) {
-                dropTarget.onDrop(mDragSource, coordinates[0], coordinates[1],
-                        (int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);
-                mDragSource.onDropCompleted((View) dropTarget, true);
-                return true;
-            } else {
-                mDragSource.onDropCompleted((View) dropTarget, false);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    DropTarget findDropTarget(int x, int y, int[] dropCoordinates) {
-        return findDropTarget(this, x, y, dropCoordinates);
-    }
-
-    private DropTarget findDropTarget(ViewGroup container, int x, int y, int[] dropCoordinates) {
-        final Rect r = mDragRect;
-        final int count = container.getChildCount();
-        final int scrolledX = x + container.getScrollX();
-        final int scrolledY = y + container.getScrollY();
-        final View ignoredDropTarget = mIgnoredDropTarget;
-
-        for (int i = count - 1; i >= 0; i--) {
-            final View child = container.getChildAt(i);
-            if (child.getVisibility() == VISIBLE && child != ignoredDropTarget) {
-                child.getHitRect(r);
-                if (r.contains(scrolledX, scrolledY)) {
-                    DropTarget target = null;
-                    if (child instanceof ViewGroup) {
-                        x = scrolledX - child.getLeft();
-                        y = scrolledY - child.getTop();
-                        target = findDropTarget((ViewGroup) child, x, y, dropCoordinates);
-                    }
-                    if (target == null) {
-                        if (child instanceof DropTarget) {
-                            // Only consider this child if they will accept
-                            DropTarget childTarget = (DropTarget) child;
-                            if (childTarget.acceptDrop(mDragSource, x, y, 0, 0, mDragInfo)) {
-                                dropCoordinates[0] = x;
-                                dropCoordinates[1] = y;
-                                return (DropTarget) child;
-                            } else {
-                                return null;
-                            }
-                        }
-                    } else {
-                        return target;
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    public void setDragScoller(DragScroller scroller) {
-        mDragScroller = scroller;
-    }
-
-    public void setDragListener(DragListener l) {
-        mListener = l;
-    }
-
-    public void removeDragListener(DragListener l) {
-        mListener = null;
-    }
-
-    /**
-     * Specifies the view that must be ignored when looking for a drop target.
-     *
-     * @param view The view that will not be taken into account while looking
-     *        for a drop target.
-     */
-    void setIgnoredDropTarget(View view) {
-        mIgnoredDropTarget = view;
-    }
-
-    /**
-     * Specifies the delete region.
-     *
-     * @param region The rectangle in screen coordinates of the delete region.
-     */
-    void setDeleteRegion(RectF region) {
-        mDragRegion = region;
-    }
-
-    private class ScrollRunnable implements Runnable {
-        private int mDirection;
-
-        ScrollRunnable() {
-        }
-
-        public void run() {
-            if (mDragScroller != null) {
-                mDrawEstimated = false;
-                if (mDirection == SCROLL_LEFT) {
-                    mDragScroller.scrollLeft();
-                } else {
-                    mDragScroller.scrollRight();
-                }
-                mScrollState = SCROLL_OUTSIDE_ZONE;
-            }
-        }
-
-        void setDirection(int direction) {
-            mDirection = direction;
-        }
+        return mDragController.onTouchEvent(ev);
     }
 }
diff --git a/src/com/android/launcher2/DragSource.java b/src/com/android/launcher2/DragSource.java
index 3c0a09d..7c6ca58 100644
--- a/src/com/android/launcher2/DragSource.java
+++ b/src/com/android/launcher2/DragSource.java
@@ -23,6 +23,6 @@
  *
  */
 public interface DragSource {
-    void setDragger(DragController dragger);
+    void setDragController(DragController dragger);
     void onDropCompleted(View target, boolean success);
 }
diff --git a/src/com/android/launcher2/DragView.java b/src/com/android/launcher2/DragView.java
new file mode 100644
index 0000000..911a6ce
--- /dev/null
+++ b/src/com/android/launcher2/DragView.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.android.launcher2;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Point;
+import android.os.IBinder;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.KeyEvent;
+import android.view.WindowManager;
+import android.view.WindowManagerImpl;
+
+public class DragView extends View implements TweenCallback {
+    // Number of pixels to add to the dragged item for scaling.  Should be even for pixel alignment.
+    private static final int DRAG_SCALE = 24;
+
+    private Bitmap mBitmap;
+    private Paint mPaint;
+    private int mRegistrationX;
+    private int mRegistrationY;
+
+    SymmetricalLinearTween mTween;
+    private float mScale;
+    private float mAnimationScale = 1.0f;
+
+    private WindowManager.LayoutParams mLayoutParams;
+    private WindowManager mWindowManager;
+
+    /**
+     * Construct the drag view.
+     * <p>
+     * The registration point is the point inside our view that the touch events should
+     * be centered upon.
+     *
+     * @param context A context
+     * @param bitmap The view that we're dragging around.  We scale it up when we draw it.
+     * @param registrationX The x coordinate of the registration point.
+     * @param registrationY The y coordinate of the registration point.
+     */
+    public DragView(Context context, Bitmap bitmap, int registrationX, int registrationY) {
+        super(context);
+
+        mWindowManager = WindowManagerImpl.getDefault();
+        
+        mTween = new SymmetricalLinearTween(false, 110 /*ms duration*/, this);
+
+        int width = bitmap.getWidth();
+        int height = bitmap.getHeight();
+
+        Matrix scale = new Matrix();
+        float scaleFactor = width;
+        scaleFactor = mScale = (scaleFactor + DRAG_SCALE) / scaleFactor;
+        scale.setScale(scaleFactor, scaleFactor);
+
+        mBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, scale, true);
+
+        // The point in our scaled bitmap that the touch events are located
+        mRegistrationX = registrationX + (DRAG_SCALE / 2);
+        mRegistrationY = registrationY + (DRAG_SCALE / 2);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int widthSize = resolveSize(mBitmap.getWidth(), widthMeasureSpec);
+        int heightSize = resolveSize(mBitmap.getHeight(), heightMeasureSpec);
+        setMeasuredDimension(widthSize, heightSize);
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (false) {
+            // for debugging
+            Paint p = new Paint();
+            p.setStyle(Paint.Style.FILL);
+            p.setColor(0xaaffffff);
+            canvas.drawRect(0, 0, getWidth(), getHeight(), p);
+        }
+        float scale = mAnimationScale;
+        if (scale < 0.999f) { // allow for some float error
+            float width = mBitmap.getWidth();
+            float offset = (width-(width*scale))/2;
+            canvas.translate(offset, offset);
+            canvas.scale(scale, scale);
+        }
+        canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        mBitmap.recycle();
+    }
+
+    public void onTweenValueChanged(float value, float oldValue) {
+        mAnimationScale = (1.0f+((mScale-1.0f)*value))/mScale;
+        invalidate();
+    }
+
+    public void onTweenStarted() {
+    }
+
+    public void onTweenFinished() {
+    }
+
+    public void setPaint(Paint paint) {
+        mPaint = paint;
+        invalidate();
+    }
+
+    /**
+     * Create a window containing this view and show it.
+     *
+     * @param windowToken obtained from v.getWindowToken() from one of your views
+     * @param touchX the x coordinate the user touched in screen coordinates
+     * @param touchY the y coordinate the user touched in screen coordinates
+     */
+    public void show(IBinder windowToken, int touchX, int touchY) {
+        WindowManager.LayoutParams lp;
+        int pixelFormat;
+
+        pixelFormat = PixelFormat.TRANSLUCENT;
+
+        lp = new WindowManager.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                touchX-mRegistrationX, touchY-mRegistrationY,
+                WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL,
+                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+                    /*| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM*/,
+                pixelFormat);
+//        lp.token = mStatusBarView.getWindowToken();
+        lp.gravity = Gravity.LEFT | Gravity.TOP;
+        lp.token = windowToken;
+        lp.setTitle("DragView");
+        mLayoutParams = lp;
+
+        mWindowManager.addView(this, lp);
+
+        mAnimationScale = 1.0f/mScale;
+        mTween.start(true);
+    }
+    
+    /**
+     * Move the window containing this view.
+     *
+     * @param touchX the x coordinate the user touched in screen coordinates
+     * @param touchY the y coordinate the user touched in screen coordinates
+     */
+    void move(int touchX, int touchY) {
+        WindowManager.LayoutParams lp = mLayoutParams;
+        lp.x = touchX - mRegistrationX;
+        lp.y = touchY - mRegistrationY;
+        mWindowManager.updateViewLayout(this, lp);
+    }
+
+    void remove() {
+        mWindowManager.removeView(this);
+    }
+}
+
diff --git a/src/com/android/launcher2/DropTarget.java b/src/com/android/launcher2/DropTarget.java
index e092e50..72eb330 100644
--- a/src/com/android/launcher2/DropTarget.java
+++ b/src/com/android/launcher2/DropTarget.java
@@ -30,18 +30,25 @@
      * @param source DragSource where the drag started
      * @param x X coordinate of the drop location
      * @param y Y coordinate of the drop location
-     * @param xOffset Horizontal offset with the object being dragged where the original touch happened
-     * @param yOffset Vertical offset with the object being dragged where the original touch happened
+     * @param xOffset Horizontal offset with the object being dragged where the original
+     *          touch happened
+     * @param yOffset Vertical offset with the object being dragged where the original
+     *          touch happened
+     * @param dragView The DragView that's being dragged around on screen.
      * @param dragInfo Data associated with the object being dragged
      * 
      */
-    void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
+    void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo);
     
-    void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
+    void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo);
 
-    void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
+    void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo);
 
-    void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
+    void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo);
 
     /**
      * Check if a drop action can occur at, or near, the requested location.
@@ -55,10 +62,12 @@
      *            original touch happened
      * @param yOffset Vertical offset with the object being dragged where the
      *            original touch happened
+     * @param dragView The DragView that's being dragged around on screen.
      * @param dragInfo Data associated with the object being dragged
      * @return True if the drop will be accepted, false otherwise.
      */
-    boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);
+    boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo);
 
     /**
      * Estimate the surface area where this object would land if dropped at the
@@ -71,11 +80,19 @@
      *            original touch happened
      * @param yOffset Vertical offset with the object being dragged where the
      *            original touch happened
+     * @param dragView The DragView that's being dragged around on screen.
      * @param dragInfo Data associated with the object being dragged
      * @param recycle {@link Rect} object to be possibly recycled.
      * @return Estimated area that would be occupied if object was dropped at
      *         the given location. Should return null if no estimate is found,
      *         or if this target doesn't provide estimations.
      */
-    Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo, Rect recycle);
+    Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo, Rect recycle);
+
+    // These methods are implemented in Views
+    void getHitRect(Rect outRect);
+    void getLocationOnScreen(int[] loc);
+    int getLeft();
+    int getTop();
 }
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index 6281ebf..bc5f9fd 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -35,7 +35,7 @@
         OnItemClickListener, OnClickListener, View.OnLongClickListener {
 
     protected AbsListView mContent;
-    protected DragController mDragger;
+    protected DragController mDragController;
     
     protected Launcher mLauncher;
 
@@ -98,7 +98,7 @@
             app = new ApplicationInfo(app);
         }
 
-        mDragger.startDrag(view, this, app, DragController.DRAG_ACTION_COPY);
+        mDragController.startDrag(view, this, app, DragController.DRAG_ACTION_COPY);
         mLauncher.closeFolder(this);
         mDragItem = app;
 
@@ -109,8 +109,8 @@
         mCloneInfo = cloneInfo;
     }
 
-    public void setDragger(DragController dragger) {
-        mDragger = dragger;
+    public void setDragController(DragController dragController) {
+        mDragController = dragController;
     }
 
     public void onDropCompleted(View target, boolean success) {
diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index 1531538..85fc3a7 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -62,7 +62,7 @@
     }
 
     public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         final ItemInfo item = (ItemInfo) dragInfo;
         final int itemType = item.itemType;
         return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
@@ -70,11 +70,13 @@
                 && item.container != mInfo.id;
     }
 
-    public Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo, Rect recycle) {
+    public Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo, Rect recycle) {
         return null;
     }
 
-    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
         final ApplicationInfo item = (ApplicationInfo) dragInfo;
         // TODO: update open folder that is looking at this data
         mInfo.add(item);
@@ -82,16 +84,16 @@
     }
 
     public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         setCompoundDrawablesWithIntrinsicBounds(null, mOpenIcon, null, null);
     }
 
     public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
     }
 
     public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null);
     }
 }
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 661fbdb..759af28 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -166,6 +166,7 @@
 
     private LayoutInflater mInflater;
 
+    private DragController mDragController;
     private DragLayer mDragLayer;
     private WallpaperView mWallpaperView;
     private Workspace mWorkspace;
@@ -528,10 +529,14 @@
      * Finds all the views we need and configure them properly.
      */
     private void setupViews() {
+        mDragController = new DragController(this);
+        DragController dragController = mDragController;
+
         mDragLayer = (DragLayer) findViewById(R.id.drag_layer);
         final DragLayer dragLayer = mDragLayer;
+        dragLayer.setDragController(dragController);
 
-        mWallpaperView = (WallpaperView) dragLayer.findViewById(R.id.wallpaper);
+        mWallpaperView = (WallpaperView) findViewById(R.id.wallpaper);
         final WallpaperView wallpaper = mWallpaperView;
 
         mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
@@ -546,7 +551,7 @@
         mHandleIcon.setCrossFadeEnabled(true);
 
         workspace.setOnLongClickListener(this);
-        workspace.setDragger(dragLayer);
+        workspace.setDragController(dragController);
         workspace.setLauncher(this);
         workspace.setWallpaper(wallpaper);
 
@@ -554,12 +559,16 @@
         wallpaper.setScreenCount(workspace.getScreenCount());
 
         deleteZone.setLauncher(this);
-        deleteZone.setDragController(dragLayer);
+        deleteZone.setDragController(dragController);
         deleteZone.setHandle(mHandleView);
 
-        // TODO dragLayer.setIgnoredDropTarget(grid);
-        dragLayer.setDragScoller(workspace);
-        dragLayer.setDragListener(deleteZone);
+        dragController.setDragScoller(workspace);
+        dragController.setDragListener(deleteZone);
+        dragController.setScrollView(dragLayer);
+        
+        // The order here is bottom to top.
+        dragController.addDropTarget(workspace);
+        dragController.addDropTarget(deleteZone);
     }
 
     /**
@@ -1347,6 +1356,7 @@
         ViewGroup parent = (ViewGroup) folder.getParent();
         if (parent != null) {
             parent.removeView(folder);
+            mDragController.removeDropTarget((DropTarget)folder);
         }
         folder.onClose();
     }
@@ -1545,10 +1555,6 @@
         }
     }
 
-    DragController getDragController() {
-        return mDragLayer;
-    }
-
     /**
      * Launches the intent referred by the clicked shortcut.
      *
@@ -1646,7 +1652,7 @@
             return;
         }
 
-        openFolder.setDragger(mDragLayer);
+        openFolder.setDragController(mDragController);
         openFolder.setLauncher(this);
 
         openFolder.bind(folderInfo);
@@ -1703,11 +1709,6 @@
         return sModel;
     }
 
-    void closeAllApplications() {
-        // TODO mDrawer.close();
-        mAllAppsDialog.dismiss();
-    }
-
     View getDrawerHandle() {
         return mHandleView;
     }
@@ -1744,6 +1745,7 @@
     protected void onPrepareDialog(int id, Dialog dialog) {
         switch (id) {
             case DIALOG_ALL_APPS:
+                mAllAppsGrid.onPrepareDialog();
                 break;
             case DIALOG_CREATE_SHORTCUT:
                 break;
@@ -1886,8 +1888,11 @@
             setContentView(R.layout.all_apps);
             AllAppsGridView grid = mAllAppsGrid = (AllAppsGridView)findViewById(R.id.all_apps);
 
+            DragLayer dragLayer = (DragLayer)findViewById(R.id.drag_layer);
+            dragLayer.setDragController(mDragController);
+
             grid.setTextFilterEnabled(false);
-            // TODO grid.setDragger(dragLayer);
+            grid.setDragController(mDragController);
             grid.setLauncher(Launcher.this);
         }
 
@@ -1930,7 +1935,11 @@
         mWorkspace.hide();
     }
 
-    private void closeAllAppsDialog(boolean animated) {
+    void showWorkspace() {
+        mWorkspace.show();
+    }
+
+    void closeAllAppsDialog(boolean animated) {
         if (mAllAppsDialog.isOpen) {
             if (animated) {
                 // TODO mDrawer.animateClose();
diff --git a/src/com/android/launcher2/LiveFolderIcon.java b/src/com/android/launcher2/LiveFolderIcon.java
index 4e19041..1876f2e 100644
--- a/src/com/android/launcher2/LiveFolderIcon.java
+++ b/src/com/android/launcher2/LiveFolderIcon.java
@@ -54,23 +54,28 @@
     }
 
     @Override
-    public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
         return false;
     }
 
     @Override
-    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
     }
 
     @Override
-    public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
     }
 
     @Override
-    public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
     }
 
     @Override
-    public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
     }
 }
diff --git a/src/com/android/launcher2/UserFolder.java b/src/com/android/launcher2/UserFolder.java
index a5e9058..1379be6 100644
--- a/src/com/android/launcher2/UserFolder.java
+++ b/src/com/android/launcher2/UserFolder.java
@@ -28,31 +28,36 @@
     }
 
     public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         final ItemInfo item = (ItemInfo) dragInfo;
         final int itemType = item.itemType;
         return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
                 itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) && item.container != mInfo.id;
     }
     
-    public Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo, Rect recycle) {
+    public Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo, Rect recycle) {
         return null;
     }
 
-    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
         final ApplicationInfo item = (ApplicationInfo) dragInfo;
         //noinspection unchecked
         ((ArrayAdapter<ApplicationInfo>) mContent.getAdapter()).add((ApplicationInfo) dragInfo);
         LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0, 0);
     }
 
-    public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
     }
 
-    public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
     }
 
-    public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
     }
 
     @Override
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 43a6f78..bb32e02 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -90,7 +90,7 @@
     private OnLongClickListener mLongClickListener;
 
     private Launcher mLauncher;
-    private DragController mDragger;
+    private DragController mDragController;
     
     /**
      * Cache of vacant cells, used during drag events and invalidated as needed.
@@ -363,6 +363,9 @@
         if (!(child instanceof Folder)) {
             child.setOnLongClickListener(mLongClickListener);
         }
+        if (child instanceof DropTarget) {
+            mDragController.addDropTarget((DropTarget)child);
+        }
     }
 
     void addWidget(View view, Widget widget) {
@@ -436,6 +439,9 @@
             if (!(child instanceof Folder)) {
                 child.setOnLongClickListener(mLongClickListener);
             }
+            if (child instanceof DropTarget) {
+                mDragController.addDropTarget((DropTarget)child);
+            }
         }
     }
 
@@ -512,6 +518,11 @@
         }
     }
 
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        mDragController.setWindowToken(getWindowToken());
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
@@ -854,7 +865,7 @@
         CellLayout current = ((CellLayout) getChildAt(mCurrentScreen));
 
         current.onDragChild(child);
-        mDragger.startDrag(child, this, child.getTag(), DragController.DRAG_ACTION_MOVE);
+        mDragController.startDrag(child, this, child.getTag(), DragController.DRAG_ACTION_MOVE);
         invalidate();
     }
 
@@ -888,7 +899,8 @@
         onDropExternal(result[0], result[1], info, layout, insertAtFirst);
     }
 
-    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo) {
+    public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
+            DragView dragView, Object dragInfo) {
         final CellLayout cellLayout = getCurrentDropLayout();
         if (source != this) {
             onDropExternal(x - xOffset, y - yOffset, dragInfo, cellLayout);
@@ -914,16 +926,16 @@
     }
 
     public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         clearVacantCache();
     }
 
     public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
     }
 
     public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
-            Object dragInfo) {
+            DragView dragView, Object dragInfo) {
         clearVacantCache();
     }
 
@@ -958,6 +970,10 @@
 
         cellLayout.addView(view, insertAtFirst ? 0 : -1);
         view.setOnLongClickListener(mLongClickListener);
+        if (view instanceof DropTarget) {
+            mDragController.addDropTarget((DropTarget)view);
+        }
+
         mTargetCell = estimateDropCell(x, y, 1, 1, view, cellLayout, mTargetCell);
         cellLayout.onDropChild(view, mTargetCell);
         CellLayout.LayoutParams lp = (CellLayout.LayoutParams) view.getLayoutParams();
@@ -981,7 +997,7 @@
      * {@inheritDoc}
      */
     public boolean acceptDrop(DragSource source, int x, int y,
-            int xOffset, int yOffset, Object dragInfo) {
+            int xOffset, int yOffset, DragView dragView, Object dragInfo) {
         final CellLayout layout = getCurrentDropLayout();
         final CellLayout.CellInfo cellInfo = mDragInfo;
         final int spanX = cellInfo == null ? 1 : cellInfo.spanX;
@@ -999,7 +1015,7 @@
      * {@inheritDoc}
      */
     public Rect estimateDropLocation(DragSource source, int x, int y,
-            int xOffset, int yOffset, Object dragInfo, Rect recycle) {
+            int xOffset, int yOffset, DragView dragView, Object dragInfo, Rect recycle) {
         final CellLayout layout = getCurrentDropLayout();
         
         final CellLayout.CellInfo cellInfo = mDragInfo;
@@ -1047,8 +1063,8 @@
         mLauncher = launcher;
     }
 
-    public void setDragger(DragController dragger) {
-        mDragger = dragger;
+    public void setDragController(DragController dragController) {
+        mDragController = dragController;
     }
 
     public void onDropCompleted(View target, boolean success) {
@@ -1056,6 +1072,9 @@
             if (target != this && mDragInfo != null) {
                 final CellLayout cellLayout = (CellLayout) getChildAt(mDragInfo.screen);
                 cellLayout.removeView(mDragInfo.cell);
+                if (mDragInfo.cell instanceof DropTarget) {
+                    mDragController.removeDropTarget((DropTarget)mDragInfo.cell);
+                }
                 final Object tag = mDragInfo.cell.getTag();
                 Launcher.getModel().removeDesktopItem((ItemInfo) tag);
             }
@@ -1247,7 +1266,11 @@
 
             childCount = childrenToRemove.size();
             for (int j = 0; j < childCount; j++) {
-                layout.removeViewInLayout(childrenToRemove.get(j));
+                View child = childrenToRemove.get(j);
+                layout.removeViewInLayout(child);
+                if (child instanceof DropTarget) {
+                    mDragController.removeDropTarget((DropTarget)child);
+                }
             }
 
             if (childCount > 0) {
