diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index f7908b6..2199432 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -39,7 +39,6 @@
 import android.database.DataSetObserver;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.BlurMaskFilter;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.drawable.BitmapDrawable;
@@ -386,6 +385,7 @@
         private Allocation mAllocTouchXBorders;
 
         private Bitmap mSelectionBitmap;
+        private Canvas mSelectionCanvas;
 
         Params mParams;
         State mState;
@@ -534,20 +534,9 @@
             mParams.save();
             mState.save();
 
-            mSelectionBitmap = Bitmap.createBitmap(Defines.ICON_WIDTH_PX, Defines.ICON_HEIGHT_PX,
-                    Bitmap.Config.ARGB_8888);
-            Bitmap selectionBitmap = mSelectionBitmap;
-            Paint paint = new Paint();
-            float radius = 12 * getContext().getResources().getDisplayMetrics().density;
-            //paint.setMaskFilter(new BlurMaskFilter(radius, BlurMaskFilter.Blur.OUTER));
-            Canvas canvas = new Canvas(selectionBitmap);
-            canvas.drawColor(0xffff0000);
-
-            mSelectedIcon = Allocation.createFromBitmap(mRS, selectionBitmap,
-                    Element.RGBA_8888, false);
-            mSelectedIcon.uploadToTexture(0);
-
-            mState.selectedIconTexture = mSelectedIcon.getID();
+            mSelectionBitmap = Bitmap.createBitmap(Defines.ICON_TEXTURE_WIDTH_PX,
+                    Defines.ICON_TEXTURE_HEIGHT_PX, Bitmap.Config.ARGB_8888);
+            mSelectionCanvas = new Canvas(mSelectionBitmap);
 
             Log.d(TAG, "initData calling mRollo.setApps");
             setApps(null);
@@ -612,6 +601,9 @@
                 mScript.bindAllocation(mAllocLabelID, Defines.ALLOC_LABEL_IDS);
             }
 
+            if (mAllAppsList != null) {
+                selectIcon(0); // TODO remove
+            }
             mState.save();
         }
 
@@ -676,13 +668,29 @@
          * You need to call save() on mState on your own after calling this.
          */
         void selectIcon(int x, int y, int scrollX, int currentPage) {
-            int iconCount = mAllAppsList.size();
             int index = chooseTappedIcon(x, y, scrollX, currentPage);
+            selectIcon(index);
+        }
+
+        void selectIcon(int index) {
+            Log.d(TAG, "selectIcon index=" + index);
+            int iconCount = mAllAppsList.size();
             if (index < 0 || index >= iconCount) {
                 mState.selectedIconIndex = -1;
                 return;
             } else {
                 mState.selectedIconIndex = index;
+
+                Bitmap selectionBitmap = mSelectionBitmap;
+
+                Utilities.drawSelectedAllAppsBitmap(mSelectionCanvas,
+                        selectionBitmap.getWidth(), selectionBitmap.getHeight(),
+                        mAllAppsList.get(index).iconBitmap);
+
+                mSelectedIcon = Allocation.createFromBitmap(mRS, selectionBitmap,
+                        Element.RGBA_8888, false);
+                mSelectedIcon.uploadToTexture(0);
+                mState.selectedIconTexture = mSelectedIcon.getID();
             }
         }
 
@@ -690,7 +698,7 @@
          * You need to call save() on mState on your own after calling this.
          */
         void clearSelectedIcon() {
-            mState.selectedIconIndex = -1;
+            //mState.selectedIconIndex = -1;
         }
     }
 }
diff --git a/src/com/android/launcher2/Utilities.java b/src/com/android/launcher2/Utilities.java
index 073b179..50757ca 100644
--- a/src/com/android/launcher2/Utilities.java
+++ b/src/com/android/launcher2/Utilities.java
@@ -20,10 +20,12 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.PaintDrawable;
 import android.graphics.Bitmap;
+import android.graphics.BlurMaskFilter;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.PaintFlagsDrawFilter;
 import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.Typeface;
@@ -39,12 +41,17 @@
  * Various utilities shared amongst the Launcher's classes.
  */
 final class Utilities {
+    private static final String TAG = "Launcher.Utilities";
+
     private static int sIconWidth = -1;
     private static int sIconHeight = -1;
     private static int sIconTextureWidth = -1;
     private static int sIconTextureHeight = -1;
 
     private static final Paint sPaint = new Paint();
+    private static final Paint sBlurPaint = new Paint();
+    private static final Paint sGlowColorPaint = new Paint();
+    private static final Paint sEmptyPaint = new Paint();
     private static final Rect sBounds = new Rect();
     private static final Rect sOldBounds = new Rect();
     private static Canvas sCanvas = new Canvas();
@@ -236,6 +243,32 @@
         }
     }
 
+    static void drawSelectedAllAppsBitmap(Canvas dest, int destWidth, int destHeight, Bitmap src) {
+        synchronized (sCanvas) { // we share the statics :-(
+            if (sIconWidth == -1) {
+                // We can't have gotten to here without src being initialized, which
+                // comes from this file already.  So just assert.
+                //initStatics(context);
+                throw new RuntimeException("Assertion failed: Utilities not initialized");
+            }
+
+            dest.drawColor(0, PorterDuff.Mode.CLEAR);
+
+            final float scale = 1.55f;
+            Bitmap scaled = Bitmap.createScaledBitmap(src, (int)(src.getWidth()*scale),
+                    (int)(src.getHeight()*scale), true);
+
+            int[] xy = new int[2];
+            Bitmap mask = scaled.extractAlpha(sBlurPaint, xy);
+
+            dest.drawBitmap(mask, (destWidth - mask.getWidth()) / 2,
+                    (destHeight - mask.getHeight()) / 2, sGlowColorPaint);
+            dest.drawBitmap(src, (destWidth - src.getWidth()) / 2,
+                    (destHeight - src.getHeight()) / 2, sEmptyPaint);
+
+            mask.recycle();
+        }
+    }
 
     /**
      * Returns a Bitmap representing the thumbnail of the specified Bitmap.
@@ -289,8 +322,14 @@
 
     private static void initStatics(Context context) {
         final Resources resources = context.getResources();
+        final DisplayMetrics metrics = resources.getDisplayMetrics();
+        final float density = metrics.density;
+
         sIconWidth = sIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size);
         sIconTextureWidth = sIconTextureHeight = roundToPow2(sIconWidth);
+
+        sBlurPaint.setMaskFilter(new BlurMaskFilter(7 * density, BlurMaskFilter.Blur.NORMAL));
+        sGlowColorPaint.setColor(0xffff9000);
     }
 
     static class BubbleText {
@@ -333,7 +372,7 @@
             rectPaint.setColor(0xff000000);
             rectPaint.setAntiAlias(true);
 
-            Log.d(Launcher.LOG_TAG, "scale=" + scale + " textSize=" + (13*scale));
+            Log.d(TAG, "scale=" + scale + " textSize=" + (13*scale));
 
             TextPaint textPaint = mTextPaint = new TextPaint();
             textPaint.setTypeface(Typeface.DEFAULT);
@@ -352,7 +391,7 @@
             mBitmapWidth = roundToPow2((int)(mBubbleRect.width() + 0.5f));
             mBitmapHeight = roundToPow2((int)((MAX_LINES * mLineHeight) + leading + 0.5f));
 
-            Log.d(Launcher.LOG_TAG, "mBitmapWidth=" + mBitmapWidth + " mBitmapHeight="
+            Log.d(TAG, "mBitmapWidth=" + mBitmapWidth + " mBitmapHeight="
                     + mBitmapHeight + " w=" + ((int)(mBubbleRect.width() + 0.5f))
                     + " h=" + ((int)((MAX_LINES * mLineHeight) + leading + 0.5f)));
         }
