diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index 31c5ea0..f49297e 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -18,13 +18,12 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
@@ -45,22 +44,24 @@
 
     private static final int NUM_ITEMS_IN_PREVIEW = 4;
     private static final float ICON_ANGLE = 15f;
-    private static final int CONSUMPTION_ANIMATION_DURATION = 60;
+    private static final int CONSUMPTION_ANIMATION_DURATION = 100;
     private static final float INNER_RING_GROWTH_FACTOR = 0.1f;
     private static final float OUTER_RING_BASELINE_SCALE = 0.7f;
     private static final float OUTER_RING_GROWTH_FACTOR = 0.3f;
+    private static final float INNER_RING_BASELINE_SCALE = 1.0f;
 
     public static Drawable sFolderOuterRingDrawable = null;
+    public static Drawable sFolderInnerRingDrawable = null;
 
     private int mOriginalWidth = -1;
     private int mOriginalHeight = -1;
     private int mOriginalX = -1;
     private int mOriginalY = -1;
-    private boolean mIsAnimating = false;
 
     private int mFolderLocX;
     private int mFolderLocY;
     private float mOuterRingScale;
+    private float mInnerRingScale;
 
     public FolderIcon(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -103,6 +104,10 @@
                     launcher.getResources().getDrawable(R.drawable.portal_ring_outer_holo);
         }
 
+        if (sFolderInnerRingDrawable == null) {
+            sFolderInnerRingDrawable =
+                    launcher.getResources().getDrawable(R.drawable.portal_ring_inner_holo);
+        }
         return icon;
     }
 
@@ -148,81 +153,52 @@
     private void animateToAcceptState() {
         CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams();
 
-        lp.isLockedToGrid = false;
-        saveState(lp);
-
-        int newWidth = (int) ((1 + INNER_RING_GROWTH_FACTOR) * lp.width);
-        int newHeight = (int) ((1 + INNER_RING_GROWTH_FACTOR) * lp.width);
-        int newX = lp.x - (int) ((INNER_RING_GROWTH_FACTOR / 2) * lp.width);
-        int newY = lp.y - (int) ((INNER_RING_GROWTH_FACTOR / 2) * lp.height);
-        PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", newWidth);
-        PropertyValuesHolder height = PropertyValuesHolder.ofInt("height",newHeight);
-        PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", newX);
-        PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", newY);
-        ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y);
-        oa.setDuration(CONSUMPTION_ANIMATION_DURATION);
-        oa.addUpdateListener(new AnimatorUpdateListener() {
-            public void onAnimationUpdate(ValueAnimator animation) {
-                requestLayout();
-                invalidate();
-            }
-        });
-        oa.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mIsAnimating = true;
-            }
-        });
-        ValueAnimator outerRingScale = ValueAnimator.ofFloat(0f, 1f);
-        outerRingScale.setDuration(CONSUMPTION_ANIMATION_DURATION);
-        outerRingScale.addUpdateListener(new AnimatorUpdateListener() {
+        ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+        va.setDuration(CONSUMPTION_ANIMATION_DURATION);
+        va.addUpdateListener(new AnimatorUpdateListener() {
             public void onAnimationUpdate(ValueAnimator animation) {
                 final float percent = (Float) animation.getAnimatedValue();
                 mOuterRingScale = OUTER_RING_BASELINE_SCALE + percent * OUTER_RING_GROWTH_FACTOR;
+                mInnerRingScale = INNER_RING_BASELINE_SCALE + percent * INNER_RING_GROWTH_FACTOR;
                 mLauncher.getWorkspace().invalidate();
-            }
-        });
-
-        outerRingScale.start();
-        oa.start();
-    }
-
-    private void animateToNaturalState() {
-        final CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams();
-        lp.isLockedToGrid = false;
-
-        PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", mOriginalWidth);
-        PropertyValuesHolder height = PropertyValuesHolder.ofInt("height", mOriginalHeight);
-        PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", mOriginalX);
-        PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", mOriginalY);
-        ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y);
-        oa.addUpdateListener(new AnimatorUpdateListener() {
-            public void onAnimationUpdate(ValueAnimator animation) {
-                requestLayout();
                 invalidate();
             }
         });
-        oa.addListener(new AnimatorListenerAdapter() {
+        va.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
-                lp.isLockedToGrid = true;
-                mIsAnimating = false;
+                // Instead of setting the background drawable to null, we set the color to
+                // transparent. Setting the background drawable to null results in onDraw
+                // not getting called.
+                setBackgroundColor(Color.TRANSPARENT);
+                requestLayout();
             }
         });
+        va.start();
+    }
 
-        ValueAnimator outerRingScale = ValueAnimator.ofFloat(0f, 1f);
-        outerRingScale.setDuration(CONSUMPTION_ANIMATION_DURATION);
-        outerRingScale.addUpdateListener(new AnimatorUpdateListener() {
+    private void animateToNaturalState() {
+        ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+        va.setDuration(CONSUMPTION_ANIMATION_DURATION);
+        va.addUpdateListener(new AnimatorUpdateListener() {
             public void onAnimationUpdate(ValueAnimator animation) {
                 final float percent = (Float) animation.getAnimatedValue();
                 mOuterRingScale = OUTER_RING_BASELINE_SCALE + OUTER_RING_GROWTH_FACTOR
                         - percent * OUTER_RING_GROWTH_FACTOR;
+                mInnerRingScale = INNER_RING_BASELINE_SCALE + INNER_RING_GROWTH_FACTOR
+                        - percent * INNER_RING_GROWTH_FACTOR;
                 mLauncher.getWorkspace().invalidate();
+                invalidate();
             }
         });
-
-        oa.setDuration(CONSUMPTION_ANIMATION_DURATION);
-        oa.start();
+        va.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                setBackgroundDrawable(sFolderInnerRingDrawable);
+                mLauncher.getWorkspace().hideFolderAccept(FolderIcon.this);
+            }
+        });
+        va.start();
     }
 
     private void determineFolderLocationInWorkspace() {
@@ -249,7 +225,6 @@
     public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset,
             DragView dragView, Object dragInfo) {
         if (!willAcceptItem((ItemInfo) dragInfo)) return;
-        mLauncher.getWorkspace().hideFolderAccept(this);
         animateToNaturalState();
     }
 
@@ -268,6 +243,10 @@
         return mOuterRingScale;
     }
 
+    public float getInnerRingScale() {
+        return mInnerRingScale;
+    }
+
     @Override
     protected void onDraw(Canvas canvas) {
         if (mFolder == null) return;
@@ -277,7 +256,6 @@
         TextView v = (TextView) mFolder.getItemAt(0);
         Drawable d = v.getCompoundDrawables()[1];
 
-        CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams();
         if (mOriginalWidth < 0 || mOriginalHeight < 0) {
             mOriginalWidth = getMeasuredWidth();
             mOriginalHeight = getMeasuredHeight();
@@ -285,30 +263,21 @@
 
         int xShift = (mOriginalWidth - d.getIntrinsicWidth()) / 2;
         int yShift = (mOriginalHeight - d.getIntrinsicHeight()) / 2;
-
-        if (mIsAnimating) {
-            xShift -= lp.x - mOriginalX;
-            yShift -= lp.y - mOriginalY;
-        }
-
         canvas.translate(xShift, yShift);
-        canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2);
-        canvas.rotate(ICON_ANGLE);
-        canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2);
 
         for (int i = Math.max(0, mFolder.getItemCount() - NUM_ITEMS_IN_PREVIEW);
                 i < mFolder.getItemCount(); i++) {
             v = (TextView) mFolder.getItemAt(i);
             d = v.getCompoundDrawables()[1];
 
+            canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2);
+            canvas.rotate(i == 0 ? ICON_ANGLE : -ICON_ANGLE);
+            canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2);
+
             if (d != null) {
                 d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
                 d.draw(canvas);
             }
-
-            canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2);
-            canvas.rotate(-ICON_ANGLE);
-            canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2);
         }
 
         canvas.restore();
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index fed991c..bc15b32 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1234,15 +1234,26 @@
             }
         }
 
-        // The folder outer ring image(s)
+        // The folder outer / inner ring image(s)
         for (int i = 0; i < mFolderOuterRings.size(); i++) {
+
+            // Draw outer ring
             FolderIcon fi = mFolderOuterRings.get(i);
-            final Drawable d = FolderIcon.sFolderOuterRingDrawable;
-            final int width = (int) (d.getIntrinsicWidth() * fi.getOuterRingScale());
-            final int height = (int) (d.getIntrinsicHeight() * fi.getOuterRingScale());
+            Drawable d = FolderIcon.sFolderOuterRingDrawable;
+            int width = (int) (d.getIntrinsicWidth() * fi.getOuterRingScale());
+            int height = (int) (d.getIntrinsicHeight() * fi.getOuterRingScale());
             fi.getFolderLocation(mTempLocation);
-            final int x = mTempLocation[0] + mScrollX - width / 2;
-            final int y = mTempLocation[1] + mScrollY - height / 2;
+            int x = mTempLocation[0] + mScrollX - width / 2;
+            int y = mTempLocation[1] + mScrollY - height / 2;
+            d.setBounds(x, y, x + width, y + height);
+            d.draw(canvas);
+
+            // Draw inner ring
+            d = FolderIcon.sFolderInnerRingDrawable;
+            width = (int) (fi.getMeasuredWidth() * fi.getInnerRingScale());
+            height = (int) (fi.getMeasuredHeight() * fi.getInnerRingScale());
+            x = mTempLocation[0] + mScrollX - width / 2;
+            y = mTempLocation[1] + mScrollY - height / 2;
             d.setBounds(x, y, x + width, y + height);
             d.draw(canvas);
         }
