diff --git a/res/layout/apps_customize_widget.xml b/res/layout/apps_customize_widget.xml
index 44f6ae1..31c3fbe 100644
--- a/res/layout/apps_customize_widget.xml
+++ b/res/layout/apps_customize_widget.xml
@@ -41,16 +41,16 @@
             android:layout_height="wrap_content"
             android:layout_weight="0"
             android:gravity="left|bottom"
+            android:singleLine="true"
+            android:ellipsize="marquee"
+            android:fadingEdge="horizontal"
 
             android:textColor="#FFBBBBBB"
             android:textSize="14sp"
             android:shadowColor="#FF000000"
             android:shadowDx="0.0"
             android:shadowDy="1.0"
-            android:shadowRadius="1.0"
-
-            android:maxLines="2"
-            android:fadingEdge="horizontal" />
+            android:shadowRadius="1.0" />
 
         <!-- The original dimensions of the widget (can't be the same text as above due to different
              style. -->
@@ -73,7 +73,7 @@
     <ImageView
         android:id="@+id/widget_preview"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_height="wrap_content"
         android:layout_weight="1"
         android:adjustViewBounds="true"
         android:scaleType="fitStart" />
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index b00e8c3..4540c15 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -40,7 +40,7 @@
 
 <!-- AppsCustomize -->
     <dimen name="apps_customize_widget_cell_width_gap">30dp</dimen>
-    <dimen name="apps_customize_widget_cell_height_gap">0dp</dimen>
+    <dimen name="apps_customize_widget_cell_height_gap">5dp</dimen>
     <integer name="apps_customize_widget_cell_count_x">3</integer>
     <integer name="apps_customize_widget_cell_count_y">1</integer>
 </resources>
diff --git a/res/values-port/dimens.xml b/res/values-port/dimens.xml
index 3b18653..8b423dd 100644
--- a/res/values-port/dimens.xml
+++ b/res/values-port/dimens.xml
@@ -37,7 +37,7 @@
     <dimen name="all_apps_view_pageLayoutPaddingRight">0dp</dimen>
 
     <dimen name="apps_customize_widget_cell_width_gap">20dp</dimen>
-    <dimen name="apps_customize_widget_cell_height_gap">40dp</dimen>
+    <dimen name="apps_customize_widget_cell_height_gap">10dp</dimen>
     <integer name="apps_customize_widget_cell_count_x">2</integer>
     <integer name="apps_customize_widget_cell_count_y">2</integer>
 </resources>
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index fd8678d..e793363 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -77,13 +77,14 @@
         doInBackgroundCallback = bgR;
         postExecuteCallback = postR;
     }
-    AsyncTaskPageData(int p, ArrayList<Object> l, int cw, int ch, AsyncTaskCallback bgR,
+    AsyncTaskPageData(int p, ArrayList<Object> l, int cw, int ch, int ccx, AsyncTaskCallback bgR,
             AsyncTaskCallback postR) {
         page = p;
         items = l;
         generatedImages = new ArrayList<Bitmap>();
         cellWidth = cw;
         cellHeight = ch;
+        cellCountX = ccx;
         doInBackgroundCallback = bgR;
         postExecuteCallback = postR;
     }
@@ -93,6 +94,7 @@
     ArrayList<Bitmap> generatedImages;
     int cellWidth;
     int cellHeight;
+    int cellCountX;
     AsyncTaskCallback doInBackgroundCallback;
     AsyncTaskCallback postExecuteCallback;
 }
@@ -156,7 +158,8 @@
     // Content
     private ContentType mContentType;
     private ArrayList<ApplicationInfo> mApps;
-    private List<Object> mWidgets;
+    private ArrayList<Object> mWidgets;
+    private ArrayList<Object> mShortcuts;
 
     // Caching
     private Canvas mCanvas;
@@ -165,9 +168,12 @@
 
     // Dimens
     private int mContentWidth;
+    private int mAppIconSize;
     private int mMaxWidgetSpan, mMinWidgetSpan;
-    private int mWidgetWidthGap, mWidgetHeightGap;
     private int mWidgetCountX, mWidgetCountY;
+    private int mWidgetWidthGap, mWidgetHeightGap;
+    private int mShortcutCountX, mShortcutCountY;
+    private int mShortcutWidthGap, mShortcutHeightGap;
     private final int mWidgetPreviewIconPaddedDimension;
     private final float sWidgetPreviewIconPaddingPercentage = 0.25f;
     private PagedViewCellLayout mWidgetSpacingLayout;
@@ -183,6 +189,7 @@
         mContentType = ContentType.Applications;
         mApps = new ArrayList<ApplicationInfo>();
         mWidgets = new ArrayList<Object>();
+        mShortcuts = new ArrayList<Object>();
         mIconCache = ((LauncherApplication) context.getApplicationContext()).getIconCache();
         mHolographicOutlineHelper = new HolographicOutlineHelper();
         mCanvas = new Canvas();
@@ -191,6 +198,7 @@
         // Save the default widget preview background
         Resources resources = context.getResources();
         mDefaultWidgetBackground = resources.getDrawable(R.drawable.default_widget_preview);
+        mAppIconSize = getResources().getDimensionPixelSize(R.dimen.app_icon_size);
 
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PagedView, 0, 0);
         // TODO-APPS_CUSTOMIZE: remove these unnecessary attrs after
@@ -214,9 +222,8 @@
 
         // The padding on the non-matched dimension for the default widget preview icons
         // (top + bottom)
-        int iconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size);
         mWidgetPreviewIconPaddedDimension =
-            (int) (iconSize * (1 + (2 * sWidgetPreviewIconPaddingPercentage)));
+            (int) (mAppIconSize * (1 + (2 * sWidgetPreviewIconPaddingPercentage)));
     }
 
     @Override
@@ -266,6 +273,9 @@
         mCellCountY = mWidgetSpacingLayout.getCellCountY();
         mWidgetCountX = Math.max(1, (int) Math.round(mCellCountX / 2f));
         mWidgetCountY = Math.max(1, (int) Math.round(mCellCountY / 3f));
+        mShortcutCountX = Math.max(1, (int) Math.round(mCellCountX / 2f));
+        mShortcutCountY = Math.max(1, (int) Math.round(mCellCountY / 2f));
+
         mContentWidth = mWidgetSpacingLayout.getContentWidth();
 
         invalidatePageData();
@@ -305,6 +315,7 @@
     public void onPackagesUpdated() {
         // Get the list of widgets and shortcuts
         mWidgets.clear();
+        mShortcuts.clear();
         List<AppWidgetProviderInfo> widgets =
             AppWidgetManager.getInstance(mLauncher).getInstalledProviders();
         Collections.sort(widgets,
@@ -314,7 +325,7 @@
         Collections.sort(shortcuts,
                 new LauncherModel.WidgetAndShortcutNameComparator(mPackageManager));
         mWidgets.addAll(widgets);
-        mWidgets.addAll(shortcuts);
+        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.
@@ -376,11 +387,10 @@
         // Compose the visible rect of the drag image
         Rect dragRect = null;
         if (v instanceof TextView) {
-            int iconSize = getResources().getDimensionPixelSize(R.dimen.app_icon_size);
             int top = v.getPaddingTop();
-            int left = (b.getWidth() - iconSize) / 2;
-            int right = left + iconSize;
-            int bottom = top + iconSize;
+            int left = (b.getWidth() - mAppIconSize) / 2;
+            int right = left + mAppIconSize;
+            int bottom = top + mAppIconSize;
             dragRect = new Rect(left, top, right, bottom);
         }
 
@@ -588,7 +598,7 @@
      * Creates and executes a new AsyncTask to load a page of widget previews.
      */
     private void prepareLoadWidgetPreviewsTask(int page, ArrayList<Object> widgets,
-            int cellWidth, int cellHeight) {
+            int cellWidth, int cellHeight, int cellCountX) {
         // Prune all tasks that are no longer needed
         Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
         while (iter.hasNext()) {
@@ -604,7 +614,7 @@
         }
 
         AsyncTaskPageData pageData = new AsyncTaskPageData(page, widgets, cellWidth, cellHeight,
-            new AsyncTaskCallback() {
+            cellCountX, new AsyncTaskCallback() {
                 @Override
                 public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
                     // Ensure that this task starts running at the correct priority
@@ -733,18 +743,11 @@
             d.setBounds(oldBounds); // Restore the bounds
         }
     }
-    private Bitmap getShortcutPreview(ResolveInfo info, int cellWidth,
-            int cellHeight) {
-        Resources resources = mLauncher.getResources();
-        int iconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size);
-        // We only need to make it wide enough so as not allow the preview to be scaled
-        int expectedWidth = cellWidth;
-        int expectedHeight = mWidgetPreviewIconPaddedDimension;
-
+    private Bitmap getShortcutPreview(ResolveInfo info, int cellWidth, int cellHeight) {
         // Render the icon
-        Bitmap preview = Bitmap.createBitmap(expectedWidth, expectedHeight, Config.ARGB_8888);
+        Bitmap preview = Bitmap.createBitmap(cellWidth, mAppIconSize, Config.ARGB_8888);
         Drawable icon = mIconCache.getFullResIcon(info, mPackageManager);
-        renderDrawableToBitmap(icon, preview, 0, 0, iconSize, iconSize, 1f, 1f);
+        renderDrawableToBitmap(icon, preview, 0, 0, mAppIconSize, mAppIconSize, 1f, 1f);
         return preview;
     }
     private Bitmap getWidgetPreview(AppWidgetProviderInfo info,
@@ -793,7 +796,6 @@
         // Generate a preview image if we couldn't load one
         if (drawable == null) {
             Resources resources = mLauncher.getResources();
-            int iconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size);
 
             // Specify the dimensions of the bitmap
             if (info.minWidth >= info.minHeight) {
@@ -816,8 +818,9 @@
                 if (info.icon > 0) icon = mPackageManager.getDrawable(packageName, info.icon, null);
                 if (icon == null) icon = resources.getDrawable(R.drawable.ic_launcher_application);
 
-                int offset = (int) (iconSize * sWidgetPreviewIconPaddingPercentage);
-                renderDrawableToBitmap(icon, preview, offset, offset, iconSize, iconSize, 1f, 1f);
+                int offset = (int) (mAppIconSize * sWidgetPreviewIconPaddingPercentage);
+                renderDrawableToBitmap(icon, preview, offset, offset,
+                        mAppIconSize, mAppIconSize, 1f, 1f);
             } catch (Resources.NotFoundException e) {}
         }
         return preview;
@@ -825,32 +828,49 @@
     public void syncWidgetPages() {
         // Ensure that we have the right number of pages
         Context context = getContext();
-        int numWidgetsPerPage = mWidgetCountX * mWidgetCountY;
-        int numPages = (int) Math.ceil(mWidgets.size() / (float) numWidgetsPerPage);
-        for (int i = 0; i < numPages; ++i) {
-            PagedViewGridLayout layout = new PagedViewGridLayout(context, mWidgetCountX,
-                    mWidgetCountY);
-            setupPage(layout);
-            addView(layout);
+        int[] countX = { mWidgetCountX, mShortcutCountX };
+        int[] countY = { mWidgetCountY, mShortcutCountY };
+        Object[] collection = { mWidgets, mShortcuts };
+        for (int i = 0; i < 2; ++i) {
+            ArrayList<Object> list = (ArrayList<Object>) collection[i];
+            int numItemsPerPage = countX[i] * countY[i];
+            int numItemPages = (int) Math.ceil(list.size() / (float) numItemsPerPage);
+            for (int j = 0; j < numItemPages; ++j) {
+                PagedViewGridLayout layout = new PagedViewGridLayout(context, countX[i],
+                        countY[i]);
+                setupPage(layout);
+                addView(layout);
+            }
         }
     }
     public void syncWidgetPageItems(int page) {
-        // Calculate the dimensions of each cell we are giving to each widget
-        ArrayList<Object> widgets = new ArrayList<Object>();
-        int cellWidth = ((mWidgetSpacingLayout.getContentWidth()
-                - mPageLayoutPaddingLeft - mPageLayoutPaddingRight
-                - ((mWidgetCountX - 1) * mWidgetWidthGap)) / mWidgetCountX);
-        int cellHeight = ((mWidgetSpacingLayout.getContentHeight()
-                - mPageLayoutPaddingTop - mPageLayoutPaddingBottom
-                - ((mWidgetCountY - 1) * mWidgetHeightGap)) / mWidgetCountY);
+        int[] countX = { mWidgetCountX, mShortcutCountX };
+        int[] countY = { mWidgetCountY, mShortcutCountY };
+        int[] widthGap = { mWidgetWidthGap, mWidgetWidthGap };
+        int[] heightGap = { mWidgetHeightGap, mWidgetHeightGap };
+        int[] numItemsPerPage = { mWidgetCountX * mWidgetCountY,
+                mShortcutCountX * mShortcutCountY };
+        Object[] collection = { mWidgets, mShortcuts };
+        int contentWidth = mWidgetSpacingLayout.getContentWidth();
+        int contentHeight = mWidgetSpacingLayout.getContentHeight();
+        int numWidgetPages = (int) Math.ceil(mWidgets.size() / (float) numItemsPerPage[0]);
+        int[] offsets = { page * numItemsPerPage[0], (page - numWidgetPages) * numItemsPerPage[1] };
+        int index = (page < numWidgetPages ? 0 : 1);
 
-        int numWidgetsPerPage = mWidgetCountX * mWidgetCountY;
-        int offset = page * numWidgetsPerPage;
-        for (int i = offset; i < Math.min(offset + numWidgetsPerPage, mWidgets.size()); ++i) {
-            widgets.add(mWidgets.get(i));
+        // Calculate the dimensions of each cell we are giving to each widget
+        ArrayList<Object> list = (ArrayList<Object>) collection[index];
+        ArrayList<Object> items = new ArrayList<Object>();
+        int cellWidth = ((contentWidth - mPageLayoutPaddingLeft - mPageLayoutPaddingRight
+                - ((countX[index] - 1) * widthGap[index])) / countX[index]);
+        int cellHeight = ((contentHeight - mPageLayoutPaddingTop - mPageLayoutPaddingBottom
+                - ((countY[index] - 1) * heightGap[index])) / countY[index]);
+
+        int offset = offsets[index];
+        for (int i = offset; i < Math.min(offset + numItemsPerPage[index], list.size()); ++i) {
+            items.add(list.get(i));
         }
 
-        prepareLoadWidgetPreviewsTask(page, widgets, cellWidth, cellHeight);
+        prepareLoadWidgetPreviewsTask(page, items, cellWidth, cellHeight, countX[index]);
     }
     private void onSyncWidgetPageItems(AsyncTaskPageData data) {
         int page = data.page;
@@ -861,6 +881,7 @@
         int count = items.size();
         int cellWidth = data.cellWidth;
         int cellHeight = data.cellHeight;
+        int cellCountX = data.cellCountX;
         for (int i = 0; i < count; ++i) {
             Object rawInfo = items.get(i);
             PendingAddItemInfo createItemInfo = null;
@@ -893,8 +914,8 @@
             widget.setOnTouchListener(this);
 
             // Layout each widget
-            int ix = i % mWidgetCountX;
-            int iy = i / mWidgetCountX;
+            int ix = i % cellCountX;
+            int iy = i / cellCountX;
             GridLayout.LayoutParams lp = new GridLayout.LayoutParams(
                     new GridLayout.Group(iy, 1, GridLayout.LEFT),
                     new GridLayout.Group(ix, 1, GridLayout.TOP));
@@ -1089,9 +1110,10 @@
         // TODO: Dump information related to current list of Applications, Widgets, etc.
         ApplicationInfo.dumpApplicationInfoList(LOG_TAG, "mApps", mApps);
         dumpAppWidgetProviderInfoList(LOG_TAG, "mWidgets", mWidgets);
+        dumpAppWidgetProviderInfoList(LOG_TAG, "mShortcuts", mShortcuts);
     }
     private void dumpAppWidgetProviderInfoList(String tag, String label,
-            List<Object> list) {
+            ArrayList<Object> list) {
         Log.d(tag, label + " size=" + list.size());
         for (Object i: list) {
             if (i instanceof AppWidgetProviderInfo) {
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index f65f458..3f4a47c 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -2864,7 +2864,10 @@
             AddAdapter.ListItem item = (AddAdapter.ListItem) mAdapter.getItem(which);
             switch (item.actionTag) {
                 case AddAdapter.ITEM_SHORTCUT: {
-                    pickShortcut();
+                    if (mAppsCustomizeTabHost != null) {
+                        mAppsCustomizeTabHost.selectWidgetsTab();
+                    }
+                    showAllApps(true);
                     break;
                 }
                 case AddAdapter.ITEM_APPLICATION: {
