diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index ef4637e..505d465 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -909,19 +909,6 @@
     }
 
     /**
-     * Estimate the size that a child with the given dimensions will take in the layout.
-     */
-    void estimateChildSize(int minWidth, int minHeight, int[] result) {
-        // Assuming it's placed at 0, 0, find where the bottom right cell will land
-        rectToCell(minWidth, minHeight, result);
-
-        // Then figure out the rect it will occupy
-        cellToRect(0, 0, result[0], result[1], mRectF);
-        result[0] = (int)mRectF.width();
-        result[1] = (int)mRectF.height();
-    }
-
-    /**
      * Estimate where the top left cell of the dragged item will land if it is dropped.
      *
      * @param originX The X value of the top left corner of the item
@@ -1322,6 +1309,29 @@
     }
 
     /**
+     * Calculate the grid spans needed to fit given item
+     */
+    public void calculateSpans(ItemInfo info) {
+        final int minWidth;
+        final int minHeight;
+
+        if (info instanceof LauncherAppWidgetInfo) {
+            minWidth = ((LauncherAppWidgetInfo) info).minWidth;
+            minHeight = ((LauncherAppWidgetInfo) info).minHeight;
+        } else if (info instanceof PendingAddWidgetInfo) {
+            minWidth = ((PendingAddWidgetInfo) info).minWidth;
+            minHeight = ((PendingAddWidgetInfo) info).minHeight;
+        } else {
+            // It's not a widget, so it must be 1x1
+            info.spanX = info.spanY = 1;
+            return;
+        }
+        int[] spans = rectToCell(minWidth, minHeight, null);
+        info.spanX = spans[0];
+        info.spanY = spans[1];
+    }
+
+    /**
      * Find the first vacant cell, if there is one.
      *
      * @param vacant Holds the x and y coordinate of the vacant cell
diff --git a/src/com/android/launcher2/CustomizePagedView.java b/src/com/android/launcher2/CustomizePagedView.java
index 5672921..4eb852c 100644
--- a/src/com/android/launcher2/CustomizePagedView.java
+++ b/src/com/android/launcher2/CustomizePagedView.java
@@ -21,7 +21,7 @@
 import org.xmlpull.v1.XmlPullParser;
 
 import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
 import android.animation.TimeInterpolator;
@@ -40,7 +40,6 @@
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
 import android.graphics.Canvas;
-import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -378,11 +377,7 @@
         posAnim.setInterpolator(mQuintEaseOutInterpolator);
         posAnim.setDuration(ANIMATION_DURATION);
 
-        posAnim.addListener(new AnimatorListener() {
-            public void onAnimationCancel(Animator animation) {}
-            public void onAnimationRepeat(Animator animation) {}
-            public void onAnimationStart(Animator animation) {}
-
+        posAnim.addListener(new AnimatorListenerAdapter() {
             public void onAnimationEnd(Animator animation) {
                 dragLayer.removeView(dragCopy);
                 mLauncher.addExternalItemToScreen(info, layout);
@@ -443,7 +438,12 @@
             animateClickFeedback(v, new Runnable() {
                 @Override
                 public void run() {
-                    animateItemOntoScreen(dragView, cl, itemInfo);
+                    cl.calculateSpans(itemInfo);
+                    if (cl.findCellForSpan(null, itemInfo.spanX, itemInfo.spanY)) {
+                        animateItemOntoScreen(dragView, cl, itemInfo);
+                    } else {
+                        mLauncher.showOutOfSpaceMessage();
+                    }
                 }
             });
             return;
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 0268378..eaa09ac 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -2217,13 +2217,6 @@
                 localPixelX, localPixelY, spanX, spanY, ignoreView, recycle);
     }
 
-    /**
-     * Estimate the size that a child with the given dimensions will take in the current screen.
-     */
-    void estimateChildSize(int minWidth, int minHeight, int[] result) {
-        ((CellLayout)getChildAt(mCurrentPage)).estimateChildSize(minWidth, minHeight, result);
-    }
-
     void setLauncher(Launcher launcher) {
         mLauncher = launcher;
         mSpringLoadedDragController = new SpringLoadedDragController(mLauncher);
