diff --git a/res/mipmap-xlarge/ic_launcher_browser.png b/res/mipmap-xlarge/ic_launcher_browser.png
new file mode 100644
index 0000000..2ca92c8
--- /dev/null
+++ b/res/mipmap-xlarge/ic_launcher_browser.png
Binary files differ
diff --git a/res/mipmap-xlarge/ic_launcher_shortcut_browser_bookmark.png b/res/mipmap-xlarge/ic_launcher_shortcut_browser_bookmark.png
new file mode 100644
index 0000000..7b2c680
--- /dev/null
+++ b/res/mipmap-xlarge/ic_launcher_shortcut_browser_bookmark.png
Binary files differ
diff --git a/res/values-xlarge/dimensions.xml b/res/values-xlarge/dimensions.xml
index c335c19..5b86c86 100644
--- a/res/values-xlarge/dimensions.xml
+++ b/res/values-xlarge/dimensions.xml
@@ -13,4 +13,5 @@
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <dimen name="bookmarkThumbnailWidth">180dip</dimen>
     <dimen name="bookmarkThumbnailHeight">120dip</dimen>
-</resources>
\ No newline at end of file
+    <dimen name="favicon_padded_size">24dip</dimen>
+</resources>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index 404b2ac..d51ab33 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -24,4 +24,6 @@
     <dimen name="add_bookmark_width">500dip</dimen>
     <dimen name="folder_selector_height">300dip</dimen>
     <dimen name="widgetItemMinHeight">48dip</dimen>
+    <dimen name="favicon_size">16dip</dimen>
+    <dimen name="favicon_padded_size">20dip</dimen>
 </resources>
diff --git a/src/com/android/browser/BookmarkUtils.java b/src/com/android/browser/BookmarkUtils.java
index a63b90f..c72cbd1 100644
--- a/src/com/android/browser/BookmarkUtils.java
+++ b/src/com/android/browser/BookmarkUtils.java
@@ -70,14 +70,14 @@
 
             if (icon != null) {
                 // Now draw the correct icon background into our new bitmap.
-                canvas.drawBitmap(icon, null, iconBounds, null);
+                Paint p = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+                canvas.drawBitmap(icon, null, iconBounds, p);
             }
 
             // If we have a favicon, overlay it in a nice rounded white box on top of the
             // background.
             if (favicon != null) {
-                drawFaviconToCanvas(favicon, canvas, iconBounds,
-                        context.getResources().getDisplayMetrics().density);
+                drawFaviconToCanvas(context, favicon, canvas, iconBounds);
             }
         }
         return bm;
@@ -139,8 +139,8 @@
         canvas.drawPath(path, paint);
     }
 
-    private static void drawFaviconToCanvas(Bitmap favicon, Canvas canvas, Rect iconBounds,
-            float density) {
+    private static void drawFaviconToCanvas(Context context, Bitmap favicon, Canvas canvas,
+            Rect iconBounds) {
         // Make a Paint for the white background rectangle and for
         // filtering the favicon.
         Paint p = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
@@ -148,15 +148,16 @@
         p.setColor(Color.WHITE);
 
         // Create a rectangle that is slightly wider than the favicon
-        final float iconSize = 16 * density; // 16x16 favicon
-        final float padding = 2 * density; // white padding around icon
-        final float rectSize = iconSize + 2 * padding;
-        final float x = iconBounds.exactCenterX() - (rectSize / 2);
-        // Note: Subtract 2 dip from the y position since the box is
+        int faviconDimension = context.getResources().getDimensionPixelSize(R.dimen.favicon_size);
+        int faviconPaddedRectDimension = context.getResources().getDimensionPixelSize(
+                R.dimen.favicon_padded_size);
+        float padding = (faviconPaddedRectDimension - faviconDimension) / 2;
+        final float x = iconBounds.exactCenterX() - (faviconPaddedRectDimension / 2);
+        // Note: Subtract from the y position since the box is
         // slightly higher than center. Use padding since it is already
-        // 2 * density.
-        final float y = iconBounds.exactCenterY() - (rectSize / 2) - padding;
-        RectF r = new RectF(x, y, x + rectSize, y + rectSize);
+        // device independent.
+        final float y = iconBounds.exactCenterY() - (faviconPaddedRectDimension / 2) - padding;
+        RectF r = new RectF(x, y, x + faviconPaddedRectDimension, y + faviconPaddedRectDimension);
 
         // Draw a white rounded rectangle behind the favicon
         canvas.drawRoundRect(r, 2, 2, p);
@@ -165,7 +166,7 @@
         // rectangle but inset by the padding
         // (results in a 16x16 favicon).
         r.inset(padding, padding);
-        canvas.drawBitmap(favicon, null, r, p);
+        canvas.drawBitmap(favicon, null, r, null);
     }
 
     /* package */ static Uri getBookmarksUri(Context context) {
diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java
index 4939b48..d0ba8ad 100644
--- a/src/com/android/browser/BreadCrumbView.java
+++ b/src/com/android/browser/BreadCrumbView.java
@@ -240,7 +240,7 @@
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
         int height = mSeparatorDrawable.getIntrinsicHeight();
-        if (mMeasuredHeight < height) {
+        if (getMeasuredHeight() < height) {
             // This should only be an issue if there are currently no separators
             // showing; i.e. if there is one crumb and no back button.
             int mode = View.MeasureSpec.getMode(heightMeasureSpec);
@@ -255,7 +255,7 @@
                 default:
                     break;
             }
-            setMeasuredDimension(mMeasuredWidth, height);
+            setMeasuredDimension(getMeasuredWidth(), height);
         }
     }
 
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 4887f3f..74385f9 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -357,8 +357,6 @@
         }
         BookmarkItem header = new BookmarkItem(activity);
         populateBookmarkItem(cursor, header, isFolder);
-        new LookupBookmarkCount(getActivity(), header)
-                .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
         menu.setHeaderView(header);
 
         int count = menu.size();
@@ -374,6 +372,8 @@
             Bitmap bitmap =
                 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder);
             item.setFavicon(bitmap);
+            new LookupBookmarkCount(getActivity(), item)
+                    .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
         } else {
             String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
             item.setUrl(url);
