diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index df98c89..d3e0963 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -492,8 +492,7 @@
         int h = preview.getIntrinsicHeight();
         if (createItemInfo instanceof PendingAddWidgetInfo) {
             PendingAddWidgetInfo createWidgetInfo = (PendingAddWidgetInfo) createItemInfo;
-            int[] spanXY = CellLayout.rectToCell(getResources(),
-                    createWidgetInfo.minWidth, createWidgetInfo.minHeight, null);
+            int[] spanXY = mLauncher.getSpanForWidget(createWidgetInfo, null);
             createItemInfo.spanX = spanXY[0];
             createItemInfo.spanY = spanXY[1];
 
@@ -986,8 +985,7 @@
             Object rawInfo = items.get(i);
             if (rawInfo instanceof AppWidgetProviderInfo) {
                 AppWidgetProviderInfo info = (AppWidgetProviderInfo) rawInfo;
-                int[] cellSpans = CellLayout.rectToCell(getResources(),
-                        info.minWidth, info.minHeight, null);
+                int[] cellSpans = mLauncher.getSpanForWidget(info, null);
                 images.add(getWidgetPreview(info, cellSpans[0],cellSpans[1],
                         cellWidth, cellHeight));
             } else if (rawInfo instanceof ResolveInfo) {
@@ -1017,8 +1015,7 @@
                 // Fill in the widget information
                 AppWidgetProviderInfo info = (AppWidgetProviderInfo) rawInfo;
                 createItemInfo = new PendingAddWidgetInfo(info, null, null, "13");
-                int[] cellSpans = CellLayout.rectToCell(getResources(),
-                        info.minWidth, info.minHeight, null);
+                int[] cellSpans = mLauncher.getSpanForWidget(info, null);
                 FastBitmapDrawable preview = new FastBitmapDrawable(data.generatedImages.get(i));
                 widget.applyFromAppWidgetProviderInfo(info, preview, -1, cellSpans, 
                         mHolographicOutlineHelper);
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index d0b33a8..637d956 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -852,14 +852,13 @@
         int bottom = 0;
     }
 
-    Padding getPaddingForWidget(AppWidgetProviderInfo widgetInfo) {
+    Padding getPaddingForWidget(ComponentName component) {
         PackageManager packageManager = getPackageManager();
         Padding p = new Padding();
         android.content.pm.ApplicationInfo appInfo;
 
         try {
-            appInfo = packageManager.getApplicationInfo(
-                    widgetInfo.provider.getPackageName(), 0);
+            appInfo = packageManager.getApplicationInfo(component.getPackageName(), 0);
         } catch (Exception e) {
             // if we can't find the package, return 0 padding
             return p;
@@ -878,6 +877,27 @@
         return p;
     }
 
+    int[] getSpanForWidget(ComponentName component, int minWidth, int minHeight, int[] spanXY) {
+        if (spanXY == null) {
+            spanXY = new int[2];
+        }
+
+        Padding padding = getPaddingForWidget(component);
+        // We want to account for the extra amount of padding that we are adding to the widget
+        // to ensure that it gets the full amount of space that it has requested
+        int requiredWidth = minWidth + padding.left + padding.right;
+        int requiredHeight = minHeight + padding.top + padding.bottom;
+        return CellLayout.rectToCell(getResources(), requiredWidth, requiredHeight, null);
+    }
+
+    int[] getSpanForWidget(AppWidgetProviderInfo info, int[] spanXY) {
+        return getSpanForWidget(info.provider, info.minWidth, info.minHeight, spanXY);
+    }
+
+    int[] getSpanForWidget(PendingAddWidgetInfo info, int[] spanXY) {
+        return getSpanForWidget(info.componentName, info.minWidth, info.minHeight, spanXY);
+    }
+
     /**
      * Add a widget to the workspace.
      *
@@ -890,12 +910,7 @@
         // Calculate the grid spans needed to fit this widget
         CellLayout layout = getCellLayout(container, screen);
 
-        Padding padding = getPaddingForWidget(appWidgetInfo);
-        // We want to account for the extra amount of padding that we are adding to the widget
-        // to ensure that it gets the full amount of space that it has requested
-        int requiredWidth = appWidgetInfo.minWidth + padding.left + padding.right;
-        int requiredHeight = appWidgetInfo.minHeight + padding.top + padding.bottom;
-        int[] spanXY = layout.rectToCell(requiredWidth, requiredHeight, null);
+        int[] spanXY = getSpanForWidget(appWidgetInfo, null);
 
         // Try finding open space on Launcher screen
         // We have saved the position to which the widget was dragged-- this really only matters
diff --git a/src/com/android/launcher2/LauncherAppWidgetHostView.java b/src/com/android/launcher2/LauncherAppWidgetHostView.java
index a84ced6..7118c49 100644
--- a/src/com/android/launcher2/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher2/LauncherAppWidgetHostView.java
@@ -119,7 +119,7 @@
     public void setAppWidget(int appWidgetId, AppWidgetProviderInfo info) {
         super.setAppWidget(appWidgetId, info);
         // We add necessary padding to the AppWidgetHostView
-        Launcher.Padding padding = mLauncher.getPaddingForWidget(info);
+        Launcher.Padding padding = mLauncher.getPaddingForWidget(info.provider);
         setPadding(padding.left, padding.top, padding.right, padding.bottom);
     }
 
