diff --git a/src/com/android/browser/BookmarkItem.java b/src/com/android/browser/BookmarkItem.java
index 12b2b70..1f7b7d2 100644
--- a/src/com/android/browser/BookmarkItem.java
+++ b/src/com/android/browser/BookmarkItem.java
@@ -84,10 +84,6 @@
         }
     }
 
-    public int getFavIconIntrinsicWidth() {
-        return mTileView.getMeasuredWidth();
-    }
-
     void setFaviconBackground(Drawable d) {
         mTileView.setBackgroundDrawable(d);
     }
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index d0930ff..fc75050 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -89,7 +89,6 @@
         SiteTileView thumb =  (SiteTileView) view.findViewById(R.id.thumb_image);
         TextView tv = (TextView) view.findViewById(R.id.label);
         tv.setText(item.title);
-        int containerWidth = thumb.getWidth() - thumb.getPaddingLeft() - thumb.getPaddingRight();
 
         Bitmap b;
 
@@ -109,24 +108,23 @@
         }
 
         // If the item is managed by mdm or edit bookmark restriction enabled
-        if (containerWidth != 0 && (item.is_mdm_managed ||
-                EditBookmarksRestriction.getInstance().isEnabled())) {
-            int iconResId;
-            float overlayScale, overlayVertPos;
+        if (item.title != null &&
+                (item.is_mdm_managed || EditBookmarksRestriction.getInstance().isEnabled())) {
+            int containerWidth = view.getResources().getDimensionPixelSize(R.dimen.bookmarkThumbnailWidth);
+            int containerHeight = view.getResources().getDimensionPixelSize(R.dimen.bookmarkThumbnailHeight);
+            Bitmap bm;
 
             if (item.is_mdm_managed) {
-                iconResId = R.drawable.img_deco_mdm_badge_bright;
-                overlayScale = 0.6f;
-                overlayVertPos = 100f;
+                bm = BrowserBookmarksPage.overlayBookmarkBitmap(mContext, b,
+                        R.drawable.img_deco_mdm_badge_bright,
+                        containerWidth, containerHeight, 0.6f, 185, 20);
             }
             else {
-                iconResId = R.drawable.ic_deco_secure;
-                overlayScale = 1.2f;
-                overlayVertPos = 75f;
+                bm = BrowserBookmarksPage.overlayBookmarkBitmap(mContext, b,
+                        R.drawable.ic_deco_secure,
+                        containerWidth, containerHeight, 1.7f, 110, 0);
             }
-            float willScale = (float) containerWidth / (float) b.getWidth();
-            Bitmap bm = BrowserBookmarksPage.overlayBookmarkBitmap(b, iconResId, mContext,
-                    overlayScale / willScale, (int) (overlayVertPos / willScale));
+
             thumb.replaceFavicon(bm);
         }
         else {
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 05bd248..59d4a68 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -333,19 +333,31 @@
                 || type == BrowserContract.Bookmarks.BOOKMARK_TYPE_FOLDER;
     }
 
-    public static Bitmap overlayBookmarkBitmap(Bitmap origImage, int overlayResId, Context context,
-                                               float overlayScaleFactor, int overlayOffsetY) {
+    public static Bitmap overlayBookmarkBitmap(Context context, Bitmap origImage, int overlayResId,
+                                               int containerWidth, int containerHeight,
+                                               float overlayScale, int overlayOffsetY,
+                                               int overlayMarginX) {
         if (origImage == null) {
             Log.e(TAG, "Orig Image is null!");
             return origImage;
         }
+
         // Get metrics for incoming bitmap
         int origWidth = origImage.getWidth();
         int origHeight = origImage.getHeight();
 
+        // Compute final overlay scale factor based on container size
+        float willScale, overlayScaleFactor;
+        if (Math.abs(containerWidth - origWidth) > Math.abs(containerHeight - origHeight)) {
+            willScale = (float) containerWidth / (float) origWidth;
+        }
+        else {
+            willScale = (float) containerHeight / (float) origHeight;
+        }
+        overlayScaleFactor = overlayScale / willScale;
+
         // Load the bitmap for the badge
         Bitmap srcOverlay = BitmapFactory.decodeResource(context.getResources(), overlayResId);
-
         if (srcOverlay == null) {
             Log.e(TAG, "Overlay bitmap creation failed");
             return origImage;
@@ -376,11 +388,11 @@
         Canvas comboImage = new Canvas(overlaid);
         comboImage.drawBitmap(origImage, 0, 0, null);
 
-        // align overlay to right edge. Vertical alingment
+        // align overlay to right edge. Vertical alignment
         // determined by overlayOffsetY
         comboImage.drawBitmap(scaledOverlay,
-                origWidth  - scaledOverlay.getWidth(),
-                overlayOffsetY,
+                (origWidth  - scaledOverlay.getWidth()) - (overlayMarginX / willScale),
+                (overlayOffsetY / willScale),
                 null);
 
         // Clean up our bitmaps
@@ -411,22 +423,19 @@
             }
         }
 
-        // if mdm element or edit bookmak restriction enforced, overlay an indicator
-        int containerWidth = item.getFavIconIntrinsicWidth();
-        if (containerWidth != 0 &&
-                (isMdmElem || EditBookmarksRestriction.getInstance().isEnabled())) {
-            float willScale = (float) containerWidth / (float) bitmap.getWidth();
+        // if mdm element or edit bookmark restriction enforced, overlay an indicator
+        if (isMdmElem || EditBookmarksRestriction.getInstance().isEnabled()) {
+            int containerSize = getResources().
+                    getDimensionPixelSize(R.dimen.bookmark_widget_favicon_size);  // it's square!
             if (isMdmElem) {
-                float overlayscale = 0.3f;
-                float overlayVertPos = 50f;
-                bitmap = overlayBookmarkBitmap(bitmap, R.drawable.img_deco_mdm_badge_bright,
-                        getActivity(), overlayscale / willScale, (int) (overlayVertPos/willScale));
+                bitmap = overlayBookmarkBitmap(getActivity(), bitmap,
+                        R.drawable.img_deco_mdm_badge_bright,
+                        containerSize, containerSize, 0.25f, 40, 0);
             }
             else if (EditBookmarksRestriction.getInstance().isEnabled()) {
-                float overlayscale = 1.3f;
-                float overlayVertPos = -25f;
-                bitmap = overlayBookmarkBitmap(bitmap, R.drawable.ic_deco_secure,
-                        getActivity(), overlayscale / willScale, (int) (overlayVertPos/willScale));
+                bitmap = overlayBookmarkBitmap(getActivity(), bitmap,
+                        R.drawable.ic_deco_secure,
+                        containerSize, containerSize, 0.75f, 0, 0);
             }
         }
 
