diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index a9cdb87..dae73e1 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -29,6 +29,7 @@
 import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Point;
 import android.graphics.PointF;
@@ -47,7 +48,9 @@
 import android.view.animation.LayoutAnimationController;
 
 import com.android.launcher.R;
+import com.android.launcher2.FolderIcon.FolderRingAnimator;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 
@@ -74,11 +77,14 @@
     private final int[] mTmpXY = new int[2];
     private final int[] mTmpPoint = new int[2];
     private final PointF mTmpPointF = new PointF();
+    int[] mTempLocation = new int[2];
 
     boolean[][] mOccupied;
 
     private OnTouchListener mInterceptTouchListener;
 
+    private ArrayList<FolderRingAnimator> mFolderOuterRings = new ArrayList<FolderRingAnimator>();
+
     private float mBackgroundAlpha;
     private float mBackgroundAlphaMultiplier = 1.0f;
 
@@ -516,6 +522,51 @@
                         null);
             }
         }
+
+        // The folder outer / inner ring image(s)
+        for (int i = 0; i < mFolderOuterRings.size(); i++) {
+            FolderRingAnimator fra = mFolderOuterRings.get(i);
+
+            // Draw outer ring
+            Drawable d = FolderRingAnimator.sSharedOuterRingDrawable;
+            int width = (int) fra.getOuterRingSize();
+            int height = width;
+            cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
+
+            int centerX = mTempLocation[0] + mCellWidth / 2;
+            int centerY = mTempLocation[1] + FolderRingAnimator.sPreviewSize / 2;
+
+            canvas.save();
+            canvas.translate(centerX - width / 2, centerY - height / 2);
+            d.setBounds(0, 0, width, height);
+            d.draw(canvas);
+            canvas.restore();
+
+            // Draw inner ring
+            d = FolderRingAnimator.sSharedInnerRingDrawable;
+            width = (int) fra.getInnerRingSize();
+            height = width;
+            cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
+
+            centerX = mTempLocation[0] + mCellWidth / 2;
+            centerY = mTempLocation[1] + FolderRingAnimator.sPreviewSize / 2;
+            canvas.save();
+            canvas.translate(centerX - width / 2, centerY - width / 2);
+            d.setBounds(0, 0, width, height);
+            d.draw(canvas);
+            canvas.restore();
+        }
+    }
+
+    public void showFolderAccept(FolderRingAnimator fra) {
+        mFolderOuterRings.add(fra);
+    }
+
+    public void hideFolderAccept(FolderRingAnimator fra) {
+        if (mFolderOuterRings.contains(fra)) {
+            mFolderOuterRings.remove(fra);
+        }
+        invalidate();
     }
 
     @Override
diff --git a/src/com/android/launcher2/CellLayoutChildren.java b/src/com/android/launcher2/CellLayoutChildren.java
index 615740e..555bef7 100644
--- a/src/com/android/launcher2/CellLayoutChildren.java
+++ b/src/com/android/launcher2/CellLayoutChildren.java
@@ -83,7 +83,6 @@
         lp.setup(mCellWidth, mCellHeight, mWidthGap, mHeightGap);
     }
 
-
     public void measureChild(View child) {
         final int cellWidth = mCellWidth;
         final int cellHeight = mCellHeight;
diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index aff8761..010271f 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -56,10 +56,10 @@
     private static final int CONSUMPTION_ANIMATION_DURATION = 100;
 
     // The degree to which the inner ring grows when accepting drop
-    private static final float INNER_RING_GROWTH_FACTOR = 0.1f;
+    private static final float INNER_RING_GROWTH_FACTOR = 0.15f;
 
     // The degree to which the outer ring is scaled in its natural state
-    private static final float OUTER_RING_GROWTH_FACTOR = 0.4f;
+    private static final float OUTER_RING_GROWTH_FACTOR = 0.3f;
 
     // The amount of vertical spread between items in the stack [0...1]
     private static final float PERSPECTIVE_SHIFT_FACTOR = 0.24f;
@@ -112,18 +112,19 @@
         folder.bind(folderInfo);
         icon.mFolder = folder;
         icon.mFolderRingAnimator = new FolderRingAnimator(launcher, icon);
+
         folderInfo.addListener(icon);
 
         return icon;
     }
 
     public static class FolderRingAnimator {
-        public int mFolderLocX;
-        public int mFolderLocY;
+        public int mCellX;
+        public int mCellY;
+        private CellLayout mCellLayout;
         public float mOuterRingSize;
         public float mInnerRingSize;
         public FolderIcon mFolderIcon = null;
-        private Launcher mLauncher;
         public Drawable mOuterRingDrawable = null;
         public Drawable mInnerRingDrawable = null;
         public static Drawable sSharedOuterRingDrawable = null;
@@ -135,7 +136,6 @@
         private ValueAnimator mNeutralAnimator;
 
         public FolderRingAnimator(Launcher launcher, FolderIcon folderIcon) {
-            mLauncher = launcher;
             mFolderIcon = folderIcon;
             Resources res = launcher.getResources();
             mOuterRingDrawable = res.getDrawable(R.drawable.portal_ring_outer_holo);
@@ -153,12 +153,6 @@
             }
         }
 
-        // Location is expressed in window coordinates
-        public void setLocation(int x, int y) {
-            mFolderLocX = x;
-            mFolderLocY = y;
-        }
-
         public void animateToAcceptState() {
             if (mNeutralAnimator != null) {
                 mNeutralAnimator.cancel();
@@ -170,9 +164,8 @@
                     final float percent = (Float) animation.getAnimatedValue();
                     mOuterRingSize = (1 + percent * OUTER_RING_GROWTH_FACTOR) * sPreviewSize;
                     mInnerRingSize = (1 + percent * INNER_RING_GROWTH_FACTOR) * sPreviewSize;
-                    mLauncher.getWorkspace().invalidate();
-                    if (mFolderIcon != null) {
-                        mFolderIcon.invalidate();
+                    if (mCellLayout != null) {
+                        mCellLayout.invalidate();
                     }
                 }
             });
@@ -198,28 +191,39 @@
                     final float percent = (Float) animation.getAnimatedValue();
                     mOuterRingSize = (1 + (1 - percent) * OUTER_RING_GROWTH_FACTOR) * sPreviewSize;
                     mInnerRingSize = (1 + (1 - percent) * INNER_RING_GROWTH_FACTOR) * sPreviewSize;
-                    mLauncher.getWorkspace().invalidate();
-                    if (mFolderIcon != null) {
-                        mFolderIcon.invalidate();
+                    if (mCellLayout != null) {
+                        mCellLayout.invalidate();
                     }
                 }
             });
             mNeutralAnimator.addListener(new AnimatorListenerAdapter() {
                 @Override
                 public void onAnimationEnd(Animator animation) {
+                    if (mCellLayout != null) {
+                        mCellLayout.hideFolderAccept(FolderRingAnimator.this);
+                    }
                     if (mFolderIcon != null) {
                         mFolderIcon.mPreviewBackground.setVisibility(VISIBLE);
                     }
-                    mLauncher.getWorkspace().hideFolderAccept(FolderRingAnimator.this);
                 }
             });
             mNeutralAnimator.start();
         }
 
         // Location is expressed in window coordinates
-        public void getLocation(int[] loc) {
-            loc[0] = mFolderLocX;
-            loc[1] = mFolderLocY;
+        public void getCell(int[] loc) {
+            loc[0] = mCellX;
+            loc[1] = mCellY;
+        }
+
+        // Location is expressed in window coordinates
+        public void setCell(int x, int y) {
+            mCellX = x;
+            mCellY = y;
+        }
+
+        public void setCellLayout(CellLayout layout) {
+            mCellLayout = layout;
         }
 
         public float getOuterRingSize() {
@@ -253,22 +257,14 @@
         mOriginalHeight = lp.height;
     }
 
-    private void determineFolderLocationInWorkspace() {
-        int tvLocation[] = new int[2];
-        int wsLocation[] = new int[2];
-        getLocationInWindow(tvLocation);
-        mLauncher.getWorkspace().getLocationInWindow(wsLocation);
-
-        int x = tvLocation[0] - wsLocation[0] + getMeasuredWidth() / 2;
-        int y = tvLocation[1] - wsLocation[1] + FolderRingAnimator.sPreviewSize / 2;
-        mFolderRingAnimator.setLocation(x, y);
-    }
-
     public void onDragEnter(Object dragInfo) {
         if (!willAcceptItem((ItemInfo) dragInfo)) return;
-        determineFolderLocationInWorkspace();
-        mLauncher.getWorkspace().showFolderAccept(mFolderRingAnimator);
+        CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams();
+        CellLayout layout = (CellLayout) getParent().getParent();
+        mFolderRingAnimator.setCell(lp.cellX, lp.cellY);
+        mFolderRingAnimator.setCellLayout(layout);
         mFolderRingAnimator.animateToAcceptState();
+        layout.showFolderAccept(mFolderRingAnimator);
     }
 
     public void onDragOver(Object dragInfo) {
@@ -341,7 +337,7 @@
         ArrayList<View> items = mFolder.getItemsInReadingOrder(false);
 
         int xShift = (mOriginalWidth - 2 * halfAvailableSpace) / 2;
-        int yShift = previewPadding;
+        int yShift = previewPadding + getPaddingTop();
         canvas.translate(xShift, yShift);
         int nItemsInPreview = Math.min(items.size(), NUM_ITEMS_IN_PREVIEW);
         for (int i = nItemsInPreview - 1; i >= 0; i--) {
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 60b915b..a79c779 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -203,8 +203,6 @@
     private int mLastDragXOffset;
     private int mLastDragYOffset;
 
-    private ArrayList<FolderRingAnimator> mFolderOuterRings = new ArrayList<FolderRingAnimator>();
-
     // Variables relating to the creation of user folders by hovering shortcuts over shortcuts
     private static final int FOLDER_CREATION_TIMEOUT = 250;
     private final Alarm mFolderCreationAlarm = new Alarm();
@@ -1127,17 +1125,6 @@
         }
     }
 
-    public void showFolderAccept(FolderRingAnimator fra) {
-        mFolderOuterRings.add(fra);
-    }
-
-    public void hideFolderAccept(FolderRingAnimator fra) {
-        if (mFolderOuterRings.contains(fra)) {
-            mFolderOuterRings.remove(fra);
-        }
-        invalidate();
-    }
-
     @Override
     protected void onDraw(Canvas canvas) {
         updateWallpaperOffsets();
@@ -1151,62 +1138,6 @@
             mBackground.draw(canvas);
         }
 
-        // The folder outer / inner ring image(s)
-        for (int i = 0; i < mFolderOuterRings.size(); i++) {
-            View currentPage = getChildAt(getCurrentPage());
-            Matrix m = currentPage.getMatrix();
-
-            FolderRingAnimator fra = mFolderOuterRings.get(i);
-
-            // Draw outer ring
-            Drawable d = FolderRingAnimator.sSharedOuterRingDrawable;
-            int width = (int) fra.getOuterRingSize();
-            int height = width;
-            fra.getLocation(mTempLocation);
-
-            // First we map the folder's location from window coordinates to its containing
-            // CellLayout's coordinates. Then we transform the coordinates according to the
-            // CellLayout's transform. Finally, we map this back into the coordinates of the
-            // the window (ie. Workspace).
-            int x = mTempLocation[0] + mScrollX - width / 2 - currentPage.getLeft();
-            int y = mTempLocation[1] + mScrollY - height / 2 - currentPage.getTop();
-            mTempFloatTuple[0] = x;
-            mTempFloatTuple[1] = y;
-            m.mapPoints(mTempFloatTuple);
-            x = (int) (mTempFloatTuple[0]) + currentPage.getLeft();
-            y = (int) (mTempFloatTuple[1]) + currentPage.getTop();
-
-            canvas.save();
-            canvas.translate(x, y);
-            d.setBounds(0, 0, (int) (width * currentPage.getScaleX()),
-                    (int) (height * currentPage.getScaleY()));
-            d.draw(canvas);
-            canvas.restore();
-
-            // Draw inner ring
-            d = FolderRingAnimator.sSharedInnerRingDrawable;
-            width = (int) fra.getInnerRingSize();
-            height = width;
-
-            // First we map the folder's location from window coordinates to its containing
-            // CellLayout's coordinates. Then we transform the coordinates according to the
-            // CellLayout's transform. Finally, we map this back into the coordinates of the
-            // the window (ie. Workspace).
-            x = mTempLocation[0] + mScrollX - width / 2 - currentPage.getLeft();
-            y = mTempLocation[1] + mScrollY - height / 2 - currentPage.getTop();
-            mTempFloatTuple[0] = x;
-            mTempFloatTuple[1] = y;
-            m.mapPoints(mTempFloatTuple);
-            x = (int) (mTempFloatTuple[0]) + currentPage.getLeft();
-            y = (int) (mTempFloatTuple[1]) + currentPage.getTop();
-
-            canvas.save();
-            canvas.translate(x, y);
-            d.setBounds(0, 0, (int) (width * currentPage.getScaleX()),
-                    (int) (height * currentPage.getScaleY()));
-            d.draw(canvas);
-            canvas.restore();
-        }
         super.onDraw(canvas);
     }
 
@@ -2808,12 +2739,11 @@
 
                     if (userFolderPending && dragOverView != mLastDragOverView) {
                         mFolderCreationAlarm.setOnAlarmListener(new
-                                FolderCreationAlarmListener(dragOverView));
+                                FolderCreationAlarmListener(mDragTargetLayout, mTargetCell[0], mTargetCell[1]));
                         mFolderCreationAlarm.setAlarm(FOLDER_CREATION_TIMEOUT);
                     }
 
                     if (dragOverView != mLastDragOverView && isOverFolder) {
-
                         ((FolderIcon) dragOverView).onDragEnter(d.dragInfo);
                         if (mDragTargetLayout != null) {
                             mDragTargetLayout.clearDragOutlines();
@@ -2840,36 +2770,26 @@
     }
 
     class FolderCreationAlarmListener implements OnAlarmListener {
-        View v;
+        CellLayout layout;
+        int cellX;
+        int cellY;
 
-        public FolderCreationAlarmListener(View v) {
-            this.v = v;
+        public FolderCreationAlarmListener(CellLayout layout, int cellX, int cellY) {
+            this.layout = layout;
+            this.cellX = cellX;
+            this.cellY = cellY;
         }
 
         public void onAlarm(Alarm alarm) {
-            int tvLocation[] = new int[2];
-            int wsLocation[] = new int[2];
-            v.getLocationInWindow(tvLocation);
-            getLocationInWindow(wsLocation);
-
-            if (mCellWidth < 0 || mCellHeight < 0 && mDragTargetLayout != null) {
-                mCellWidth = mDragTargetLayout.getCellWidth();
-                mCellHeight = mDragTargetLayout.getCellHeight();
-            }
-
-            int x = tvLocation[0] - wsLocation[0] + v.getMeasuredWidth() / 2;
-            int y = tvLocation[1] - wsLocation[1] + FolderRingAnimator.sPreviewSize / 2;
-
             if (mDragFolderRingAnimator == null) {
                 mDragFolderRingAnimator = new FolderRingAnimator(mLauncher, null);
             }
-            mDragFolderRingAnimator.setLocation(x, y);
+            mDragFolderRingAnimator.setCell(cellX, cellY);
+            mDragFolderRingAnimator.setCellLayout(layout);
             mDragFolderRingAnimator.animateToAcceptState();
-            showFolderAccept(mDragFolderRingAnimator);
+            layout.showFolderAccept(mDragFolderRingAnimator);
+            layout.clearDragOutlines();
             mCreateUserFolderOnDrop = true;
-            if (mDragTargetLayout != null) {
-                mDragTargetLayout.clearDragOutlines();
-            }
         }
     }
 
