diff --git a/res/values-large/styles.xml b/res/values-large/styles.xml
index ebb26f5..054d967 100644
--- a/res/values-large/styles.xml
+++ b/res/values-large/styles.xml
@@ -18,7 +18,7 @@
 -->
 
 <resources>
-    <style name="Theme.WallpaperPicker" parent="android:Theme.Holo.Dialog.NoFrame">
+    <style name="Theme.WallpaperPicker" parent="@*android:Theme.Holo.Dialog.NoFrame">
     </style>
 
     <style name="Theme" parent="android:Theme.Holo">
diff --git a/res/xml/default_workspace.xml b/res/xml/default_workspace.xml
index 0519a48..0d4212c 100644
--- a/res/xml/default_workspace.xml
+++ b/res/xml/default_workspace.xml
@@ -28,10 +28,6 @@
         launcher:spanY="1" />
         
     <!--  Middle screen [2] -->
-    <search
-        launcher:screen="2"
-        launcher:x="0"
-        launcher:y="0" />
 
     <!--  Right screen [3] -->
     <appwidget
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index 08907c9..d6be307 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -84,6 +84,7 @@
     private ArrayList<View> mItemsInReadingOrder = new ArrayList<View>();
     private Drawable mIconDrawable;
     boolean mItemsInvalidated = false;
+    ShortcutInfo mCurrentDragInfo;
 
     /**
      * Used to inflate the Workspace from XML.
@@ -147,7 +148,10 @@
             mDragItemPosition[0] = item.cellX;
             mDragItemPosition[1] = item.cellY;
             mIconDrawable = ((TextView) v).getCompoundDrawables()[1];
-            mInfo.remove(item);
+
+            mCurrentDragInfo = item;
+            mItemsInvalidated = true;
+            mInfo.itemsChanged();
 
             mDragItem = item;
         } else {
@@ -388,8 +392,13 @@
         } else {
             item = (ShortcutInfo) d.dragInfo;
         }
+
+        // Dragged from self onto self
+        if (item == mCurrentDragInfo) {
+            mInfo.remove(item);
+        }
+
         mInfo.add(item);
-        LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, item.cellX, item.cellY);
     }
 
     protected boolean findAndSetEmptyCells(ShortcutInfo item) {
@@ -397,8 +406,6 @@
         if (mContent.findCellForSpan(emptyCell, item.spanX, item.spanY)) {
             item.cellX = emptyCell[0];
             item.cellY = emptyCell[1];
-            LauncherModel.addOrMoveItemInDatabase(
-                    mLauncher, item, mInfo.id, 0, item.cellX, item.cellY);
             return true;
         } else {
             return false;
@@ -449,6 +456,21 @@
     }
 
     public void onDropCompleted(View target, DragObject d, boolean success) {
+        if (!success) {
+            if (d.dragView != null) {
+                if (target instanceof CellLayout) {
+                    // TODO: we should animate the item back to the folder in this case
+                }
+            }
+            mCurrentDragInfo = null;
+            mItemsInvalidated = true;
+            mInfo.itemsChanged();
+        } else {
+            if (target != this) {
+                mInfo.remove(mCurrentDragInfo);
+                mCurrentDragInfo = null;
+            }
+        }
     }
 
     public boolean isDropEnabled() {
@@ -580,6 +602,8 @@
             findAndSetEmptyCells(item);
         }
         createAndAddShortcut(item);
+        LauncherModel.addOrMoveItemInDatabase(
+                mLauncher, item, mInfo.id, 0, item.cellX, item.cellY);
     }
 
     public int getItemCount() {
@@ -608,14 +632,24 @@
         }
     }
 
+    public void onItemsChanged() {
+    }
+
     public ArrayList<View> getItemsInReadingOrder() {
+        return getItemsInReadingOrder(true);
+    }
+
+    public ArrayList<View> getItemsInReadingOrder(boolean includeCurrentDragItem) {
         if (mItemsInvalidated) {
             mItemsInReadingOrder.clear();
             for (int j = 0; j < mContent.getCountY(); j++) {
                 for (int i = 0; i < mContent.getCountX(); i++) {
                     View v = mContent.getChildAt(i, j);
                     if (v != null) {
-                        mItemsInReadingOrder.add(v);
+                        ShortcutInfo info = (ShortcutInfo) v.getTag();
+                        if (info != mCurrentDragInfo || includeCurrentDragItem) {
+                            mItemsInReadingOrder.add(v);
+                        }
                     }
                 }
             }
diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index 449068c..18b242b 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -316,7 +316,7 @@
         int baselineWidth = (int) (d.getIntrinsicWidth() * baselineIconScale);
         float maxPerpectiveShift = baselineHeight * PERSPECTIVE_SHIFT_FACTOR;
 
-        ArrayList<View> items = mFolder.getItemsInReadingOrder();
+        ArrayList<View> items = mFolder.getItemsInReadingOrder(false);
         int firstItemIndex = Math.max(0, items.size() - NUM_ITEMS_IN_PREVIEW);
 
         int xShift = (int) (mOriginalWidth - baselineWidth) / 2;
@@ -352,6 +352,11 @@
         canvas.restore();
     }
 
+    public void onItemsChanged() {
+        invalidate();
+        requestLayout();
+    }
+
     public void onAdd(ShortcutInfo item) {
         invalidate();
         requestLayout();
diff --git a/src/com/android/launcher2/FolderInfo.java b/src/com/android/launcher2/FolderInfo.java
index 12ed27c..805a51f 100644
--- a/src/com/android/launcher2/FolderInfo.java
+++ b/src/com/android/launcher2/FolderInfo.java
@@ -86,8 +86,15 @@
         }
     }
 
+    void itemsChanged() {
+        for (int i = 0; i < listeners.size(); i++) {
+            listeners.get(i).onItemsChanged();
+        }
+    }
+
     interface FolderListener {
         public void onAdd(ShortcutInfo item);
         public void onRemove(ShortcutInfo item);
+        public void onItemsChanged();
     }
 }
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index fee6b5b..216c74e 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -2345,23 +2345,11 @@
         lp.oldY = viewY - (layout.getTop() + layout.getTopPadding() - mScrollY);
     }
 
-    /*
-     * We should be careful that this method cannot result in any synchronous requestLayout()
-     * calls, as it is called from onLayout().
-     */
-    public void animateViewIntoPosition(final View view) {
-        final CellLayout parent = (CellLayout) view.getParent().getParent();
-        final CellLayout.LayoutParams lp = (CellLayout.LayoutParams) view.getLayoutParams();
-
-        // Convert the animation params to be relative to the Workspace, not the CellLayout
-        final int fromX = lp.oldX + parent.getLeft() + parent.getLeftPadding();
-        final int fromY = lp.oldY + parent.getTop() + parent.getTopPadding();
-
-        final int dx = lp.x - lp.oldX;
-        final int dy = lp.y - lp.oldY;
+    public void animateViewIntoPosition(final View view, final int fromX, final int fromY, 
+            final int dX, final int dY, final Runnable animationEndRunnable) {
 
         // Calculate the duration of the animation based on the object's distance
-        final float dist = (float) Math.sqrt(dx*dx + dy*dy);
+        final float dist = (float) Math.sqrt(dX*dX + dY*dY);
         final Resources res = getResources();
         final float maxDist = (float) res.getInteger(R.integer.config_dropAnimMaxDist);
         int duration = res.getInteger(R.integer.config_dropAnimMaxDuration);
@@ -2383,10 +2371,7 @@
             }
 
             public void onAnimationEnd(Animator animation) {
-                if (mDropView != null) {
-                    mDropView.setVisibility(View.VISIBLE);
-                    mDropView = null;
-                }
+                animationEndRunnable.run();
             }
         });
 
@@ -2400,8 +2385,8 @@
                 invalidate(mDropViewPos[0], mDropViewPos[1],
                         mDropViewPos[0] + view.getWidth(), mDropViewPos[1] + view.getHeight());
 
-                mDropViewPos[0] = fromX + (int) (percent * dx + 0.5f);
-                mDropViewPos[1] = fromY + (int) (percent * dy + 0.5f);
+                mDropViewPos[0] = fromX + (int) (percent * dX + 0.5f);
+                mDropViewPos[1] = fromY + (int) (percent * dY + 0.5f);
                 invalidate(mDropViewPos[0], mDropViewPos[1],
                         mDropViewPos[0] + view.getWidth(), mDropViewPos[1] + view.getHeight());
             }
@@ -2410,6 +2395,32 @@
         mDropAnim.start();
     }
 
+    /*
+     * We should be careful that this method cannot result in any synchronous requestLayout()
+     * calls, as it is called from onLayout().
+     */
+    public void animateViewIntoPosition(final View view) {
+        final CellLayout parent = (CellLayout) view.getParent().getParent();
+        final CellLayout.LayoutParams lp = (CellLayout.LayoutParams) view.getLayoutParams();
+
+        // Convert the animation params to be relative to the Workspace, not the CellLayout
+        final int fromX = lp.oldX + parent.getLeft() + parent.getLeftPadding();
+        final int fromY = lp.oldY + parent.getTop() + parent.getTopPadding();
+
+        final int dx = lp.x - lp.oldX;
+        final int dy = lp.y - lp.oldY;
+
+        Runnable animationEndRunnable = new Runnable() {
+            public void run() {
+                if (mDropView != null) {
+                    mDropView.setVisibility(View.VISIBLE);
+                    mDropView = null;
+                }
+            }
+        };
+        animateViewIntoPosition(view, fromX, fromY, dx, dy, animationEndRunnable);
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -2525,6 +2536,7 @@
                 scrollToNewPageWithoutMovingPages(dragTargetIndex);
             }
         }
+        CellLayout dropTargetLayout = mDragTargetLayout;
 
         if (d.dragSource != this) {
             final int[] touchXY = new int[] { (int) mDragViewVisualCenter[0],
@@ -2536,22 +2548,9 @@
                 ((ItemInfo) d.dragInfo).dropPos = touchXY;
                 return;
             }
-            onDropExternal(touchXY, d.dragInfo, mDragTargetLayout, false, d.dragView);
+            onDropExternal(touchXY, d.dragInfo, dropTargetLayout, false, d.dragView);
         } else if (mDragInfo != null) {
             final View cell = mDragInfo.cell;
-            CellLayout dropTargetLayout = mDragTargetLayout;
-            boolean dropInscrollArea = false;
-
-            // Handle the case where the user drops when in the scroll area.
-            // This is treated as a drop on the adjacent page.
-            if (dropTargetLayout == null && mInScrollArea) {
-                dropInscrollArea = true;
-                if (mPendingScrollDirection == DragController.SCROLL_LEFT) {
-                    dropTargetLayout = (CellLayout) getChildAt(mCurrentPage - 1);
-                } else if (mPendingScrollDirection == DragController.SCROLL_RIGHT) {
-                    dropTargetLayout = (CellLayout) getChildAt(mCurrentPage + 1);
-                }
-            }
 
             if (dropTargetLayout != null) {
                 // Move internally
@@ -2565,8 +2564,9 @@
                 mTargetCell = findNearestArea((int) mDragViewVisualCenter[0], (int)
                         mDragViewVisualCenter[1], spanX, spanY, dropTargetLayout, mTargetCell);
                 // If the item being dropped is a shortcut and the nearest drop
-                // cell also contains
-                // a shortcut, then create a folder with the two shortcuts.
+                // cell also contains a shortcut, then create a folder with the two shortcuts.
+                boolean dropInscrollArea = mCurrentPage != screen;
+
                 if (!dropInscrollArea && createUserFolderIfNecessary(cell, dropTargetLayout,
                         mTargetCell, false)) {
                     return;
@@ -2583,7 +2583,7 @@
                         (int) mDragViewVisualCenter[1], mDragInfo.spanX, mDragInfo.spanY, cell,
                         dropTargetLayout, mTargetCell);
 
-                if (screen != mCurrentPage) {
+                if (dropInscrollArea && mShrinkState != ShrinkState.SPRING_LOADED) {
                     snapToPage(screen);
                 }
 
@@ -2595,6 +2595,7 @@
                                 mDragInfo.spanY);
                     }
 
+
                     // update the item's position after drop
                     final ItemInfo info = (ItemInfo) cell.getTag();
                     CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams();
@@ -2649,7 +2650,7 @@
         }
     }
 
-    private void getViewLocationRelativeToSelf(View v, int[] location) {
+    public void getViewLocationRelativeToSelf(View v, int[] location) {
         getLocationOnScreen(location);
         int x = location[0];
         int y = location[1];
@@ -3108,7 +3109,6 @@
                     if (dragOverView != mLastDragOverView) {
                         cancelFolderCreation();
                         if (mLastDragOverView != null && mLastDragOverView instanceof FolderIcon) {
-
                             ((FolderIcon) mLastDragOverView).onDragExit(d.dragInfo);
                         }
                     }
@@ -3240,6 +3240,9 @@
     private void onDropExternal(int[] touchXY, Object dragInfo,
             CellLayout cellLayout, boolean insertAtFirst, DragView dragView) {
         int screen = indexOfChild(cellLayout);
+        if (screen != mCurrentPage && mShrinkState != ShrinkState.SPRING_LOADED) {
+            snapToPage(screen);
+        }
         if (dragInfo instanceof PendingAddItemInfo) {
             PendingAddItemInfo info = (PendingAddItemInfo) dragInfo;
             // When dragging and dropping from customization tray, we deal with creating
@@ -3442,7 +3445,7 @@
 
                 if (mDragTargetLayout != null) {
                     mDragTargetLayout.onDragExit();
-                    mDragTargetLayout = null;
+                    mDragTargetLayout = layout;
                 }
                 // In portrait, need to redraw the edge glow when entering the scroll area
                 if (getHeight() > getWidth()) {
