diff --git a/res/values-large/styles.xml b/res/values-large/styles.xml
index 41bd9cd..265eff8 100644
--- a/res/values-large/styles.xml
+++ b/res/values-large/styles.xml
@@ -20,7 +20,7 @@
 <resources>
 <!-- Workspace -->
     <style name="WorkspaceIcon.Portrait">
-        <item name="android:drawablePadding">4dp</item>
+        <item name="android:drawablePadding">0dp</item>
         <item name="android:paddingLeft">4dp</item>
         <item name="android:paddingRight">4dp</item>
         <item name="android:paddingTop">4dp</item>
@@ -35,7 +35,7 @@
         <item name="android:textSize">13dip</item>
     </style>
     <style name="WorkspaceIcon.Landscape">
-        <item name="android:drawablePadding">4dp</item>
+        <item name="android:drawablePadding">0dp</item>
         <item name="android:paddingLeft">4dp</item>
         <item name="android:paddingRight">4dp</item>
         <item name="android:paddingTop">4dp</item>
@@ -49,10 +49,6 @@
         <item name="android:paddingBottom">0dp</item>
         <item name="android:textSize">13dip</item>
     </style>
-    <style name="WorkspaceIcon.AppsCustomize">
-        <item name="android:drawablePadding">2dp</item>
-        <item name="android:textSize">13dip</item>
-    </style>
 
     <style name="Theme" parent="android:Theme.Holo.Wallpaper.NoTitleBar">
         <item name="android:windowActionModeOverlay">true</item>
@@ -62,6 +58,24 @@
         <item name="android:screenOrientation">unspecified</item>
     </style>
 
+    <style name="WorkspaceIcon.Portrait.AppsCustomize">
+        <item name="android:background">@null</item>
+        <item name="android:paddingTop">4dp</item>
+        <item name="android:paddingBottom">0dp</item>
+        <item name="android:paddingLeft">0dp</item>
+        <item name="android:paddingRight">0dp</item>
+        <item name="android:drawablePadding">4dp</item>
+        <item name="android:includeFontPadding">false</item>
+        <item name="android:textSize">13dip</item>
+    </style>
+    <style name="WorkspaceIcon.Landscape.AppsCustomize">
+        <item name="android:background">@null</item>
+        <item name="android:paddingTop">4dp</item>
+        <item name="android:paddingBottom">0dp</item>
+        <item name="android:drawablePadding">4dp</item>
+        <item name="android:includeFontPadding">false</item>
+        <item name="android:textSize">13dip</item>
+    </style>
     <style name="TabIndicator.AppsCustomize">
         <item name="android:paddingLeft">40dp</item>
         <item name="android:paddingRight">40dp</item>
diff --git a/src/com/android/launcher2/IconCache.java b/src/com/android/launcher2/IconCache.java
index 1fdafc8..b2ebe2a 100644
--- a/src/com/android/launcher2/IconCache.java
+++ b/src/com/android/launcher2/IconCache.java
@@ -44,7 +44,6 @@
     private final Bitmap mDefaultIcon;
     private final LauncherApplication mContext;
     private final PackageManager mPackageManager;
-    private final Utilities.BubbleText mBubble;
     private final HashMap<ComponentName, CacheEntry> mCache =
             new HashMap<ComponentName, CacheEntry>(INITIAL_ICON_CACHE_CAPACITY);
     private int mIconDpi;
@@ -52,7 +51,6 @@
     public IconCache(LauncherApplication context) {
         mContext = context;
         mPackageManager = context.getPackageManager();
-        mBubble = new Utilities.BubbleText(context);
         int density = context.getResources().getDisplayMetrics().densityDpi;
         if (LauncherApplication.isScreenLarge()) {
             if (density == DisplayMetrics.DENSITY_LOW) {
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 0321e3f..d228fef 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -131,7 +131,7 @@
     private PageSwitchListener mPageSwitchListener;
 
     private ArrayList<Boolean> mDirtyPageContent;
-    private boolean mDirtyPageAlpha;
+    private boolean mDirtyPageAlpha = true;
 
     // choice modes
     protected static final int CHOICE_MODE_NONE = 0;
diff --git a/src/com/android/launcher2/Utilities.java b/src/com/android/launcher2/Utilities.java
index b537f7a..1175fad 100644
--- a/src/com/android/launcher2/Utilities.java
+++ b/src/com/android/launcher2/Utilities.java
@@ -265,120 +265,6 @@
         sDisabledPaint.setAlpha(0x88);
     }
 
-    static class BubbleText {
-        private static final int MAX_LINES = 2;
-
-        private final TextPaint mTextPaint;
-
-        private final RectF mBubbleRect = new RectF();
-
-        private final float mTextWidth;
-        private final int mLeading;
-        private final int mFirstLineY;
-        private final int mLineHeight;
-
-        private final int mBitmapWidth;
-        private final int mBitmapHeight;
-        private final int mDensity;
-
-        BubbleText(Context context) {
-            final Resources resources = context.getResources();
-
-            final DisplayMetrics metrics = resources.getDisplayMetrics();
-            final float scale = metrics.density;
-            mDensity = metrics.densityDpi;
-
-            final float paddingLeft = 2.0f * scale;
-            final float paddingRight = 2.0f * scale;
-            final float cellWidth = resources.getDimension(R.dimen.title_texture_width);
-
-            RectF bubbleRect = mBubbleRect;
-            bubbleRect.left = 0;
-            bubbleRect.top = 0;
-            bubbleRect.right = (int) cellWidth;
-
-            mTextWidth = cellWidth - paddingLeft - paddingRight;
-
-            TextPaint textPaint = mTextPaint = new TextPaint();
-            textPaint.setTypeface(Typeface.DEFAULT);
-            textPaint.setTextSize(13*scale);
-            textPaint.setColor(0xffffffff);
-            textPaint.setAntiAlias(true);
-            if (TEXT_BURN) {
-                textPaint.setShadowLayer(8, 0, 0, 0xff000000);
-            }
-
-            float ascent = -textPaint.ascent();
-            float descent = textPaint.descent();
-            float leading = 0.0f;//(ascent+descent) * 0.1f;
-            mLeading = (int)(leading + 0.5f);
-            mFirstLineY = (int)(leading + ascent + 0.5f);
-            mLineHeight = (int)(leading + ascent + descent + 0.5f);
-
-            mBitmapWidth = (int)(mBubbleRect.width() + 0.5f);
-            mBitmapHeight = roundToPow2((int)((MAX_LINES * mLineHeight) + leading + 0.5f));
-
-            mBubbleRect.offsetTo((mBitmapWidth-mBubbleRect.width())/2, 0);
-
-            if (false) {
-                Log.d(TAG, "mBitmapWidth=" + mBitmapWidth + " mBitmapHeight="
-                        + mBitmapHeight + " w=" + ((int)(mBubbleRect.width() + 0.5f))
-                        + " h=" + ((int)((MAX_LINES * mLineHeight) + leading + 0.5f)));
-            }
-        }
-
-        /** You own the bitmap after this and you must call recycle on it. */
-        Bitmap createTextBitmap(String text) {
-            Bitmap b = Bitmap.createBitmap(mBitmapWidth, mBitmapHeight, Bitmap.Config.ALPHA_8);
-            b.setDensity(mDensity);
-            Canvas c = new Canvas(b);
-
-            StaticLayout layout = new StaticLayout(text, mTextPaint, (int)mTextWidth,
-                    Alignment.ALIGN_CENTER, 1, 0, true);
-            int lineCount = layout.getLineCount();
-            if (lineCount > MAX_LINES) {
-                lineCount = MAX_LINES;
-            }
-            //if (!TEXT_BURN && lineCount > 0) {
-                //RectF bubbleRect = mBubbleRect;
-                //bubbleRect.bottom = height(lineCount);
-                //c.drawRoundRect(bubbleRect, mCornerRadius, mCornerRadius, mRectPaint);
-            //}
-            for (int i=0; i<lineCount; i++) {
-                //int x = (int)((mBubbleRect.width() - layout.getLineMax(i)) / 2.0f);
-                //int y = mFirstLineY + (i * mLineHeight);
-                final String lineText = text.substring(layout.getLineStart(i), layout.getLineEnd(i));
-                int x = (int)(mBubbleRect.left
-                        + ((mBubbleRect.width() - mTextPaint.measureText(lineText)) * 0.5f));
-                int y = mFirstLineY + (i * mLineHeight);
-                c.drawText(lineText, x, y, mTextPaint);
-            }
-
-            c.setBitmap(null);
-            return b;
-        }
-
-        private int height(int lineCount) {
-            return (int)((lineCount * mLineHeight) + mLeading + mLeading + 0.0f);
-        }
-
-        int getBubbleWidth() {
-            return (int)(mBubbleRect.width() + 0.5f);
-        }
-
-        int getMaxBubbleHeight() {
-            return height(MAX_LINES);
-        }
-
-        int getBitmapWidth() {
-            return mBitmapWidth;
-        }
-
-        int getBitmapHeight() {
-            return mBitmapHeight;
-        }
-    }
-
     /** Only works for positive numbers. */
     static int roundToPow2(int n) {
         int orig = n;
