diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index feba679..ace53ef 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -74,7 +74,8 @@
             android:launchMode="singleTask"
             android:clearTaskOnLaunch="true"
             android:stateNotNeeded="true"
-            android:theme="@style/Theme">
+            android:theme="@style/Theme"
+            android:windowSoftInputMode="adjustPan">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.HOME" />
diff --git a/res/drawable-hdpi/portal_container_holo.9.png b/res/drawable-hdpi/portal_container_holo.9.png
index a2fbcb6..e2a1bd5 100644
--- a/res/drawable-hdpi/portal_container_holo.9.png
+++ b/res/drawable-hdpi/portal_container_holo.9.png
Binary files differ
diff --git a/res/drawable-hdpi/portal_ring_inner_holo.png b/res/drawable-hdpi/portal_ring_inner_holo.png
index e671d1b..cd40594 100644
--- a/res/drawable-hdpi/portal_ring_inner_holo.png
+++ b/res/drawable-hdpi/portal_ring_inner_holo.png
Binary files differ
diff --git a/res/drawable-hdpi/portal_ring_outer_holo.png b/res/drawable-hdpi/portal_ring_outer_holo.png
index 7aad607..1a66a44 100644
--- a/res/drawable-hdpi/portal_ring_outer_holo.png
+++ b/res/drawable-hdpi/portal_ring_outer_holo.png
Binary files differ
diff --git a/res/drawable-large-mdpi/portal_container_holo.9.png b/res/drawable-large-mdpi/portal_container_holo.9.png
new file mode 100644
index 0000000..7eef5d7
--- /dev/null
+++ b/res/drawable-large-mdpi/portal_container_holo.9.png
Binary files differ
diff --git a/res/drawable-large-mdpi/portal_ring_inner_holo.png b/res/drawable-large-mdpi/portal_ring_inner_holo.png
new file mode 100644
index 0000000..c22224f
--- /dev/null
+++ b/res/drawable-large-mdpi/portal_ring_inner_holo.png
Binary files differ
diff --git a/res/drawable-large-mdpi/portal_ring_outer_holo.png b/res/drawable-large-mdpi/portal_ring_outer_holo.png
new file mode 100644
index 0000000..b94c948
--- /dev/null
+++ b/res/drawable-large-mdpi/portal_ring_outer_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/portal_container_holo.9.png b/res/drawable-mdpi/portal_container_holo.9.png
index d2f9b58..7eef5d7 100644
--- a/res/drawable-mdpi/portal_container_holo.9.png
+++ b/res/drawable-mdpi/portal_container_holo.9.png
Binary files differ
diff --git a/res/drawable-mdpi/portal_ring_inner_holo.png b/res/drawable-mdpi/portal_ring_inner_holo.png
index dc0c041..9addb30 100644
--- a/res/drawable-mdpi/portal_ring_inner_holo.png
+++ b/res/drawable-mdpi/portal_ring_inner_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/portal_ring_outer_holo.png b/res/drawable-mdpi/portal_ring_outer_holo.png
index 5a7e740..6103869 100644
--- a/res/drawable-mdpi/portal_ring_outer_holo.png
+++ b/res/drawable-mdpi/portal_ring_outer_holo.png
Binary files differ
diff --git a/res/layout/qsb_bar.xml b/res/layout/qsb_bar.xml
index 68ee8b6..cb97b01 100644
--- a/res/layout/qsb_bar.xml
+++ b/res/layout/qsb_bar.xml
@@ -63,8 +63,6 @@
     <LinearLayout
         style="@style/SearchDropTargetBar"
         android:id="@+id/drag_target_bar"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
         android:alpha="0">
 
         <com.android.launcher2.DeleteDropTarget
diff --git a/res/layout/user_folder.xml b/res/layout/user_folder.xml
index 299095d..548a39e 100644
--- a/res/layout/user_folder.xml
+++ b/res/layout/user_folder.xml
@@ -49,7 +49,7 @@
         android:paddingTop="@dimen/folder_content_name_gap"
         android:paddingBottom="@dimen/folder_padding"
         android:background="#00000000"
-        android:hint="@string/default_folder_name"
+        android:hint="@string/folder_hint_text"
         android:textSize="16sp"
         android:textColor="#FFF"
         android:gravity="center_horizontal"
diff --git a/res/values-land/styles.xml b/res/values-land/styles.xml
index 4daaecc..659947b 100644
--- a/res/values-land/styles.xml
+++ b/res/values-land/styles.xml
@@ -21,6 +21,8 @@
 <!-- Search Bar -->
     <style name="SearchDropTargetBar">
         <item name="android:orientation">vertical</item>
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
     </style>
     <style name="SearchButton">
         <item name="android:layout_gravity">center_horizontal</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d0e4749..2d41791 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -244,5 +244,5 @@
     <string name="dream_name">Rocket Launcher</string>
 
     <!-- Default folder title -->
-    <string name="default_folder_name">Unnamed Folder</string>
+    <string name="folder_hint_text">Unnamed Folder</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index b662ccc..45e85e1 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -80,6 +80,8 @@
 
     <style name="SearchDropTargetBar">
         <item name="android:orientation">horizontal</item>
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">match_parent</item>
     </style>
     <style name="SearchButton">
         <item name="android:layout_gravity">center_vertical</item>
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index e793363..5696b50 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -67,6 +67,11 @@
  * The data needed to perform either of the custom AsyncTasks.
  */
 class AsyncTaskPageData {
+    enum Type {
+        LoadWidgetPreviewData,
+        LoadHolographicIconsData
+    }
+
     AsyncTaskPageData(int p, ArrayList<Object> l, ArrayList<Bitmap> si, AsyncTaskCallback bgR,
             AsyncTaskCallback postR) {
         page = p;
@@ -103,10 +108,11 @@
  * A generic template for an async task used in AppsCustomize.
  */
 class AppsCustomizeAsyncTask extends AsyncTask<AsyncTaskPageData, Void, AsyncTaskPageData> {
-    AppsCustomizeAsyncTask(int p, AppsCustomizePagedView.ContentType t) {
+    AppsCustomizeAsyncTask(int p, AppsCustomizePagedView.ContentType t, AsyncTaskPageData.Type ty) {
         page = p;
         pageContentType = t;
         threadPriority = Process.THREAD_PRIORITY_DEFAULT;
+        dataType = ty;
     }
     @Override
     protected AsyncTaskPageData doInBackground(AsyncTaskPageData... params) {
@@ -129,6 +135,7 @@
     }
 
     // The page that this async task is associated with
+    AsyncTaskPageData.Type dataType;
     int page;
     AppsCustomizePagedView.ContentType pageContentType;
     int threadPriority;
@@ -314,6 +321,7 @@
 
     public void onPackagesUpdated() {
         // Get the list of widgets and shortcuts
+        boolean wasEmpty = mWidgets.isEmpty() && mShortcuts.isEmpty();
         mWidgets.clear();
         mShortcuts.clear();
         List<AppWidgetProviderInfo> widgets =
@@ -327,9 +335,13 @@
         mWidgets.addAll(widgets);
         mShortcuts.addAll(shortcuts);
 
-        // The next layout pass will trigger data-ready if both widgets and apps are set, so request
-        // a layout to do this test and invalidate the page data when ready.
-        if (testDataReady()) requestLayout();
+        if (wasEmpty) {
+            // The next layout pass will trigger data-ready if both widgets and apps are set, so request
+            // a layout to do this test and invalidate the page data when ready.
+            if (testDataReady()) requestLayout();
+        } else {
+            invalidatePageData();
+        }
     }
 
     @Override
@@ -548,6 +560,7 @@
         int startIndex = page * numCells;
         int endIndex = Math.min(startIndex + numCells, mApps.size());
         PagedViewCellLayout layout = (PagedViewCellLayout) getChildAt(page);
+
         layout.removeAllViewsOnPage();
         ArrayList<Object> items = new ArrayList<Object>();
         ArrayList<Bitmap> images = new ArrayList<Bitmap>();
@@ -604,7 +617,8 @@
         while (iter.hasNext()) {
             AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
             int taskPage = task.page;
-            if (taskPage < getAssociatedLowerPageBound(mCurrentPage) ||
+            if ((taskPage == page) ||
+                    taskPage < getAssociatedLowerPageBound(mCurrentPage) ||
                     taskPage > getAssociatedUpperPageBound(mCurrentPage)) {
                 task.cancel(false);
                 iter.remove();
@@ -650,6 +664,7 @@
                 @Override
                 public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
                     mRunningTasks.remove(task);
+                    if (task.isCancelled()) return;
                     if (task.page > getPageCount()) return;
                     if (task.pageContentType != mContentType) return;
                     onSyncWidgetPageItems(data);
@@ -657,7 +672,8 @@
         });
 
         // Ensure that the task is appropriately prioritized and runs in parallel
-        AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page, mContentType);
+        AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page, mContentType,
+                AsyncTaskPageData.Type.LoadWidgetPreviewData);
         t.setThreadPriority(getThreadPriorityForPage(page));
         t.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pageData);
         mRunningTasks.add(t);
@@ -667,6 +683,18 @@
      */
     private void prepareGenerateHoloOutlinesTask(int page, ArrayList<Object> items,
             ArrayList<Bitmap> images) {
+        // Prune old tasks for this page
+        Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
+        while (iter.hasNext()) {
+            AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
+            int taskPage = task.page;
+            if ((taskPage == page) &&
+                    (task.dataType == AsyncTaskPageData.Type.LoadHolographicIconsData)) {
+                task.cancel(false);
+                iter.remove();
+            }
+        }
+
         AsyncTaskPageData pageData = new AsyncTaskPageData(page, items, images,
             new AsyncTaskCallback() {
                 @Override
@@ -700,6 +728,7 @@
                 @Override
                 public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
                     mRunningTasks.remove(task);
+                    if (task.isCancelled()) return;
                     if (task.page > getPageCount()) return;
                     if (task.pageContentType != mContentType) return;
                     onHolographicPageItemsLoaded(data);
@@ -708,7 +737,8 @@
 
         // Ensure that the outline task always runs in the background, serially
         AppsCustomizeAsyncTask t =
-            new AppsCustomizeAsyncTask(page, mContentType);
+            new AppsCustomizeAsyncTask(page, mContentType,
+                    AsyncTaskPageData.Type.LoadHolographicIconsData);
         t.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
         t.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, pageData);
         mRunningTasks.add(t);
@@ -939,12 +969,14 @@
         if (layout instanceof PagedViewCellLayout) {
             PagedViewCellLayout cl = (PagedViewCellLayout) layout;
             int count = cl.getPageChildCount();
+            if (count != data.generatedImages.size()) return;
             for (int i = 0; i < count; ++i) {
                 PagedViewIcon icon = (PagedViewIcon) cl.getChildOnPageAt(i);
                 icon.setHolographicOutline(data.generatedImages.get(i));
             }
         } else {
             int count = layout.getChildCount();
+            if (count != data.generatedImages.size()) return;
             for (int i = 0; i < count; ++i) {
                 View v = layout.getChildAt(i);
                 ((PagedViewWidget) v).setHolographicOutline(data.generatedImages.get(i));
@@ -955,6 +987,15 @@
     @Override
     public void syncPages() {
         removeAllViews();
+
+        // Remove all background asyc tasks if we are loading content anew
+        Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
+        while (iter.hasNext()) {
+            AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
+            task.cancel(false);
+            iter.remove();
+        }
+
         switch (mContentType) {
         case Applications:
             syncAppsPages();
@@ -1037,8 +1078,8 @@
         mApps = list;
         Collections.sort(mApps, LauncherModel.APP_NAME_COMPARATOR);
 
-        // The next layout pass will trigger data-ready if both widgets and apps are set, so request
-        // a layout to do this test and invalidate the page data when ready.
+        // The next layout pass will trigger data-ready if both widgets and apps are set, so 
+        // request a layout to do this test and invalidate the page data when ready.
         if (testDataReady()) requestLayout();
     }
     private void addAppsWithoutInvalidate(ArrayList<ApplicationInfo> list) {
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index 8182b82..68e9edb 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -573,10 +573,6 @@
         }
     }
 
-    public boolean getAcceptsDrops() {
-        return mAcceptsDrops;
-    }
-
     @Override
     public void removeAllViews() {
         clearOccupiedCells();
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index 0454430..80428fa 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -99,12 +99,14 @@
     private Alarm mOnExitAlarm = new Alarm();
     private TextView mFolderName;
     private int mFolderNameHeight;
-    private static String sDefaultFolderName;
     private Rect mHitRect = new Rect();
 
     private boolean mIsEditingName = false;
     private InputMethodManager mInputMethodManager;
 
+    private static String sDefaultFolderName;
+    private static String sHintText;
+
     /**
      * Used to inflate the Workspace from XML.
      *
@@ -128,6 +130,9 @@
         if (sDefaultFolderName == null) {
             sDefaultFolderName = res.getString(R.string.folder_name);
         }
+        if (sHintText == null) {
+            sHintText = res.getString(R.string.folder_hint_text);
+        }
     }
 
     @Override
@@ -229,6 +234,7 @@
     }
 
     public void startEditingFolderName() {
+        mFolderName.setHint("");
         mFolderName.setCursorVisible(true);
         mIsEditingName = true;
     }
@@ -239,6 +245,7 @@
     }
 
     public void doneEditingFolderName(boolean commit) {
+        mFolderName.setHint(sHintText);
         mInfo.setTitle(mFolderName.getText());
         LauncherModel.updateItemInDatabase(mLauncher, mInfo);
         mFolderName.setCursorVisible(false);
@@ -321,11 +328,23 @@
     void bind(FolderInfo info) {
         mInfo = info;
         ArrayList<ShortcutInfo> children = info.contents;
+        ArrayList<ShortcutInfo> overflow = new ArrayList<ShortcutInfo>();
         setupContentForNumItems(children.size());
         for (int i = 0; i < children.size(); i++) {
             ShortcutInfo child = (ShortcutInfo) children.get(i);
-            createAndAddShortcut(child);
+            if (!createAndAddShortcut(child)) {
+                overflow.add(child);
+            }
         }
+
+        // If our folder has too many items we prune them from the list. This is an issue 
+        // when upgrading from the old Folders implementation which could contain an unlimited
+        // number of items.
+        for (ShortcutInfo item: overflow) {
+            mInfo.remove(item);
+            LauncherModel.deleteItemFromDatabase(mLauncher, item);
+        }
+
         mItemsInvalidated = true;
         mInfo.addListener(this);
 
@@ -492,7 +511,7 @@
         }
     }
 
-    protected void createAndAddShortcut(ShortcutInfo item) {
+    protected boolean createAndAddShortcut(ShortcutInfo item) {
         final TextView textView =
             (TextView) mInflater.inflate(R.layout.application_boxed, this, false);
         textView.setCompoundDrawablesWithIntrinsicBounds(null,
@@ -503,10 +522,21 @@
         textView.setOnClickListener(this);
         textView.setOnLongClickListener(this);
 
+        // We need to check here to verify that the given item's location isn't already occupied
+        // by another item. If it is, we need to find the next available slot and assign
+        // it that position. This is an issue when upgrading from the old Folders implementation
+        // which could contain an unlimited number of items.
+        if (mContent.getChildAt(item.cellX, item.cellY) != null) {
+            if (!findAndSetEmptyCells(item)) {
+                return false;
+            }
+        }
+
         CellLayout.LayoutParams lp =
             new CellLayout.LayoutParams(item.cellX, item.cellY, item.spanX, item.spanY);
         boolean insert = false;
         mContent.addViewToCellLayout(textView, insert ? 0 : -1, (int)item.id, lp, true);
+        return true;
     }
 
     public void onDragEnter(DragObject d) {
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 7fa96fb..a4e162f 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1417,9 +1417,6 @@
         }
         // Stop any scrolling, move to the current page right away
         setCurrentPage((mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage);
-        if (!mIsDragInProcess) {
-            updateWhichPagesAcceptDrops(shrinkState);
-        }
 
         // Hide the scrollbar
         hideScrollingIndicator(true);
@@ -1701,46 +1698,6 @@
     private final ZoomOutInterpolator mZoomOutInterpolator = new ZoomOutInterpolator();
     private final ZoomInInterpolator mZoomInInterpolator = new ZoomInInterpolator();
 
-    private void updateWhichPagesAcceptDrops(ShrinkState state) {
-        updateWhichPagesAcceptDropsHelper(state, false, 1, 1);
-    }
-
-    private void updateWhichPagesAcceptDropsDuringDrag(ShrinkState state, int spanX, int spanY) {
-        updateWhichPagesAcceptDropsHelper(state, true, spanX, spanY);
-    }
-
-    private void updateWhichPagesAcceptDropsHelper(
-            ShrinkState state, boolean isDragHappening, int spanX, int spanY) {
-        final int screenCount = getChildCount();
-        for (int i = 0; i < screenCount; i++) {
-            CellLayout cl = (CellLayout) getChildAt(i);
-            cl.setIsDragOccuring(isDragHappening);
-            if (state == null) {
-                // If we are not in a shrunken state, mark all cell layouts as droppable (if they
-                // have the space)
-                cl.setAcceptsDrops(cl.findCellForSpan(null, spanX, spanY));
-            } else {
-                switch (state) {
-                    case BOTTOM_HIDDEN:
-                    case BOTTOM_VISIBLE:
-                    case SPRING_LOADED:
-                        cl.setIsDefaultDropTarget(false);
-                        if (!isDragHappening) {
-                            // even if a drag isn't happening, we don't want to show a screen as
-                            // accepting drops if it doesn't have at least one free cell
-                            spanX = 1;
-                            spanY = 1;
-                        }
-                        // the page accepts drops if we can find at least one empty spot
-                        cl.setAcceptsDrops(cl.findCellForSpan(null, spanX, spanY));
-                        break;
-                    default:
-                         throw new RuntimeException("Unhandled ShrinkState " + state);
-                }
-            }
-        }
-    }
-
     /*
     *
     * We call these methods (onDragStartedWithItemSpans/onDragStartedWithSize) whenever we
@@ -1776,8 +1733,6 @@
 
         // The outline is used to visualize where the item will land if dropped
         mDragOutline = createDragOutline(b, canvas, bitmapPadding, size[0], size[1]);
-
-        updateWhichPagesAcceptDropsDuringDrag(mShrinkState, spanX, spanY);
     }
 
     // we call this method whenever a drag and drop in Launcher finishes, even if Workspace was
@@ -1789,7 +1744,6 @@
             doDragExit(null);
         }
         mIsDragInProcess = false;
-        updateWhichPagesAcceptDrops(mShrinkState);
     }
 
     // We call this when we trigger an unshrink by clicking on the CellLayout cl
@@ -2308,18 +2262,31 @@
      * {@inheritDoc}
      */
     public boolean acceptDrop(DragObject d) {
-
         // If it's an external drop (e.g. from All Apps), check if it should be accepted
         if (d.dragSource != this) {
             // Don't accept the drop if we're not over a screen at time of drop
-            if (mDragTargetLayout == null || !mDragTargetLayout.getAcceptsDrops()) {
+            if (mDragTargetLayout == null) {
                 return false;
             }
 
+            mDragViewVisualCenter = getDragViewVisualCenter(d.x, d.y, d.xOffset, d.yOffset,
+                    d.dragView, mDragViewVisualCenter);
+
             final CellLayout.CellInfo dragCellInfo = mDragInfo;
             final int spanX = dragCellInfo == null ? 1 : dragCellInfo.spanX;
             final int spanY = dragCellInfo == null ? 1 : dragCellInfo.spanY;
 
+            mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
+                    (int) mDragViewVisualCenter[1], spanX, spanY, mDragTargetLayout, mTargetCell);
+
+            if (willCreateUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout, mTargetCell, true)) {
+                return true;
+            }
+            if (willAddToExistingUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout,
+                    mTargetCell)) {
+                return true;
+            }
+
             final View ignoreView = dragCellInfo == null ? null : dragCellInfo.cell;
 
             // Don't accept the drop if there's no room for the item
@@ -2331,13 +2298,18 @@
         return true;
     }
 
-    boolean willCreateUserFolder(ItemInfo info, View v, int[] targetCell) {
+    boolean willCreateUserFolder(ItemInfo info, CellLayout target, int[] targetCell,
+            boolean considerTimeout) {
+        View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
+
         boolean hasntMoved = mDragInfo != null
                 && (mDragInfo.cellX == targetCell[0] && mDragInfo.cellY == targetCell[1]);
 
-        if (v == null || hasntMoved) return false;
+        if (dropOverView == null || hasntMoved || (considerTimeout && !mCreateUserFolderOnDrop)) {
+            return false;
+        }
 
-        boolean aboveShortcut = (v.getTag() instanceof ShortcutInfo);
+        boolean aboveShortcut = (dropOverView.getTag() instanceof ShortcutInfo);
         boolean willBecomeShortcut =
                 (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
                 info.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT);
@@ -2345,6 +2317,17 @@
         return (aboveShortcut && willBecomeShortcut);
     }
 
+    boolean willAddToExistingUserFolder(Object dragInfo, CellLayout target, int[] targetCell) {
+        View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
+        if (dropOverView instanceof FolderIcon) {
+            FolderIcon fi = (FolderIcon) dropOverView;
+            if (fi.acceptDrop(dragInfo)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     boolean createUserFolderIfNecessary(View newView, CellLayout target,
             int[] targetCell, boolean external) {
         View v = target.getChildAt(targetCell[0], targetCell[1]);
@@ -2381,9 +2364,9 @@
         return false;
     }
 
-    boolean addToExistingFolderIfNecessary(View newView, CellLayout target, int[] tagetCell,
+    boolean addToExistingFolderIfNecessary(View newView, CellLayout target, int[] targetCell,
             Object dragInfo, boolean external) {
-        View dropOverView = target.getChildAt(tagetCell[0], tagetCell[1]);
+        View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
         if (dropOverView instanceof FolderIcon) {
             FolderIcon fi = (FolderIcon) dropOverView;
             if (fi.acceptDrop(dragInfo)) {
@@ -2402,7 +2385,6 @@
     }
 
     public void onDrop(DragObject d) {
-
         mDragViewVisualCenter = getDragViewVisualCenter(d.x, d.y, d.xOffset, d.yOffset, d.dragView,
                 mDragViewVisualCenter);
 
@@ -2902,8 +2884,7 @@
                     // full screen (which is traditionally set to not accept drops) if they want
                     // to get to pages beyond the screen that is full.
                     boolean isInSpringLoadedMode = (mShrinkState == ShrinkState.SPRING_LOADED);
-                    boolean allowDragOver = (mDragTargetLayout != null) &&
-                            (mDragTargetLayout.getAcceptsDrops() || isInSpringLoadedMode);
+                    boolean allowDragOver = (mDragTargetLayout != null);
                     if (allowDragOver) {
                         if (isInSpringLoadedMode) {
                             mSpringLoadedDragController.setAlarm(mDragTargetLayout);
@@ -2948,8 +2929,8 @@
                     final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0],
                             mTargetCell[1]);
 
-                    boolean userFolderPending = willCreateUserFolder(info, dragOverView,
-                            mTargetCell);
+                    boolean userFolderPending = willCreateUserFolder(info, mDragTargetLayout,
+                            mTargetCell, false);
                     boolean isOverFolder = dragOverView instanceof FolderIcon;
                     if (dragOverView != mLastDragOverView) {
                         cancelFolderCreation();
