diff --git a/src/com/android/browser/BookmarkItem.java b/src/com/android/browser/BookmarkItem.java
index 76115cf..b230de6 100644
--- a/src/com/android/browser/BookmarkItem.java
+++ b/src/com/android/browser/BookmarkItem.java
@@ -98,6 +98,10 @@
         }
     }
 
+    public int getFavIconIntrinsicWidth() {
+        return mImageView.getDrawable().getIntrinsicWidth();
+    }
+
     void setFaviconBackground(Drawable d) {
         mImageView.setBackgroundDrawable(d);
     }
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 8bade81..34a19fa 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -41,6 +41,7 @@
 
 import org.chromium.base.VisibleForTesting;
 import com.android.browser.R;
+import com.android.browser.mdm.EditBookmarksRestriction;
 import com.android.browser.mdm.ManagedBookmarksRestriction;
 import com.android.browser.mdm.ThirdPartyCookiesRestriction;
 import com.android.browser.search.DefaultSearchEngine;
@@ -163,6 +164,7 @@
         // MDM Restrictions not tied to a UI element initialized here.
         ThirdPartyCookiesRestriction.getInstance();
         ManagedBookmarksRestriction.getInstance();
+        EditBookmarksRestriction.getInstance();
     }
 
     @VisibleForTesting
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index ae9c491..d9bfcea 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -24,9 +24,9 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView.ScaleType;
 import android.widget.TextView;
 
+import com.android.browser.mdm.EditBookmarksRestriction;
 import com.android.browser.mdm.ManagedBookmarksRestriction;
 import com.android.browser.platformsupport.BrowserContract.Bookmarks;
 import com.android.browser.util.ThreadedCursorAdapter;
@@ -87,51 +87,45 @@
                 padding, view.getPaddingBottom());
         BookmarkThumbImageView thumb = (BookmarkThumbImageView) view.findViewById(R.id.thumb_image);
         TextView tv = (TextView) view.findViewById(R.id.label);
-        float badgeScale = 0.8f;
-
         tv.setText(item.title);
+        int containerWidth = thumb.getWidth() - thumb.getPaddingLeft() - thumb.getPaddingRight();
+
+        Bitmap b;
+
         if (item.is_folder) {
-            // folder
-            if(item.is_mdm_managed) {
-                // build a bitmap that has the mdm badge overlaid
-                Bitmap b = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.thumb_bookmark_widget_folder_holo);
-                Bitmap bm = BrowserBookmarksPage.overlayBookmarkBitmap(b, R.drawable.img_deco_mdm_badge_bright, mContext, badgeScale);
-                thumb.setmAdjustDown(false);
-                thumb.setScaleType(ScaleType.CENTER_INSIDE);
-                thumb.setImageBitmap(bm);
+            b = BitmapFactory.decodeResource(mContext.getResources(),
+                    R.drawable.thumb_bookmark_widget_folder_holo);
+        }
+        else if (item.thumbnail == null || !item.has_thumbnail) {
+            b = BitmapFactory.decodeResource(mContext.getResources(),
+                    R.drawable.browser_thumbnail);
+        }
+        else {
+            b = item.thumbnail.getBitmap();
+        }
+
+        // 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.is_mdm_managed) {
+                iconResId = R.drawable.img_deco_mdm_badge_bright;
+                overlayScale = 0.6f;
+                overlayVertPos = 100f;
             }
             else {
-                thumb.setmAdjustDown(true);
-                thumb.setImageResource(R.drawable.thumb_bookmark_widget_folder_holo);
-                thumb.setScaleType(ScaleType.FIT_END);
+                iconResId = R.drawable.ic_deco_secure;
+                overlayScale = 1.2f;
+                overlayVertPos = 75f;
             }
-            thumb.setBackground(null);
-        } else {
-            if (item.thumbnail == null || !item.has_thumbnail) {
-                if(item.is_mdm_managed) {
-                    Bitmap b = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.browser_thumbnail);
-                    Bitmap bm = BrowserBookmarksPage.overlayBookmarkBitmap(b, R.drawable.img_deco_mdm_badge_bright, mContext, badgeScale);
-                    thumb.setmAdjustDown(false);
-                    thumb.setScaleType(ScaleType.CENTER_INSIDE);
-                    thumb.setImageBitmap(bm);
-                }
-                else {
-                    thumb.setmAdjustDown(true);
-                    thumb.setScaleType(ScaleType.CENTER_CROP);
-                    thumb.setImageResource(R.drawable.browser_thumbnail);
-                }
-            } else {
-                if (item.is_mdm_managed) {
-                    Bitmap b = item.thumbnail.getBitmap();
-                    Bitmap bm = BrowserBookmarksPage.overlayBookmarkBitmap(b, R.drawable.img_deco_mdm_badge_bright, mContext, badgeScale);
-                    thumb.setmAdjustDown(false);
-                    thumb.setScaleType(ScaleType.CENTER_INSIDE);
-                    thumb.setImageBitmap(bm);
-                } else {
-                    thumb.setmAdjustDown(true);
-                    thumb.setImageDrawable(item.thumbnail);
-                }
-            }
+            float willScale = (float) containerWidth / (float) b.getWidth();
+            Bitmap bm = BrowserBookmarksPage.overlayBookmarkBitmap(b, iconResId, mContext,
+                    overlayScale / willScale, (int) (overlayVertPos / willScale));
+            thumb.setImageBitmap(bm);
+        }
+        else {
+            thumb.setImageBitmap(b);
         }
     }
 
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index e004225..80ff6d8 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -51,6 +51,7 @@
 import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.Toast;
 
+import com.android.browser.mdm.EditBookmarksRestriction;
 import com.android.browser.mdm.ManagedBookmarksRestriction;
 import com.android.browser.platformsupport.BrowserContract;
 import com.android.browser.platformsupport.BrowserContract.Accounts;
@@ -294,13 +295,14 @@
                 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
         boolean isMdmElem = ManagedBookmarksRestriction.getInstance().mDb.
                 isMdmElement(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
+        boolean isMdmEditRestricted = EditBookmarksRestriction.getInstance().isEnabled();
 
         final Activity activity = getActivity();
         MenuInflater inflater = activity.getMenuInflater();
         inflater.inflate(R.menu.bookmarkscontext, menu);
         if (isFolder) {
             menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
-            if(isMdmElem) {
+            if(isMdmElem || isMdmEditRestricted) {
                 menu.findItem(R.id.folder_edit_context_menu_id).setEnabled(false);
                 menu.findItem(R.id.folder_delete_context_menu_id).setEnabled(false);
             }
@@ -309,7 +311,7 @@
             if (mDisableNewWindow) {
                 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
             }
-            if(isMdmElem) {
+            if(isMdmElem || isMdmEditRestricted) {
                 menu.findItem(R.id.edit_context_menu_id).setEnabled(false);
                 menu.findItem(R.id.delete_context_menu_id).setEnabled(false);
             }
@@ -332,7 +334,7 @@
     }
 
     public static Bitmap overlayBookmarkBitmap(Bitmap origImage, int overlayResId, Context context,
-                                               float overlayScaleFactor) {
+                                               float overlayScaleFactor, int overlayOffsetY) {
         if (origImage == null) {
             Log.e(TAG, "Orig Image is null!");
             return origImage;
@@ -374,9 +376,11 @@
         Canvas comboImage = new Canvas(overlaid);
         comboImage.drawBitmap(origImage, 0, 0, null);
 
+        // align overlay to right edge. Vertical alingment
+        // determined by overlayOffsetY
         comboImage.drawBitmap(scaledOverlay,
                 origWidth  - scaledOverlay.getWidth(),
-                origHeight - scaledOverlay.getHeight(),
+                overlayOffsetY,
                 null);
 
         // Clean up our bitmaps
@@ -387,29 +391,50 @@
         return overlaid;
     }
 
-    private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder, boolean isMdmElem) {
+    private void populateBookmarkItem(Cursor cursor, BookmarkItem item,
+                                      boolean isFolder, boolean isMdmElem) {
         item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
+
+        // Fetch appropriate bitmap
+        Bitmap bitmap;
         if (isFolder) {
             item.setUrl(null);
-            Bitmap bitmap =
-                BitmapFactory.decodeResource(getResources(), R.drawable.ic_deco_folder_normal);
-            if (isMdmElem) {
-                bitmap = overlayBookmarkBitmap(bitmap, R.drawable.img_deco_mdm_badge_bright, getActivity(), 0.25f);
-            }
-            item.setFavicon(bitmap);
-            new LookupBookmarkCount(getActivity(), item)
-                    .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
-        } else {
+            bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_deco_folder_normal);
+        }
+        else {
             String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
             item.setUrl(url);
-            Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
-            if (isMdmElem) {
-                if (null == bitmap) {
-                    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_deco_favicon_normal);
-                }
-                bitmap = overlayBookmarkBitmap(bitmap, R.drawable.img_deco_mdm_badge_bright, getActivity(), 0.25f);
+            bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
+            if (null == bitmap) {
+                bitmap = BitmapFactory.decodeResource(getResources(),
+                        R.drawable.ic_deco_favicon_normal);
             }
-            item.setFavicon(bitmap);
+        }
+
+        // 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 (isMdmElem) {
+                float overlayscale = 0.3f;
+                float overlayVertPos = 50f;
+                bitmap = overlayBookmarkBitmap(bitmap, R.drawable.img_deco_mdm_badge_bright,
+                        getActivity(), overlayscale / willScale, (int) (overlayVertPos/willScale));
+            }
+            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));
+            }
+        }
+
+        // Set the bitmap
+        item.setFavicon(bitmap);
+        if (isFolder) {
+            new LookupBookmarkCount(getActivity(), item)
+                    .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
         }
     }
 
@@ -500,9 +525,10 @@
             @Override
             public void onClick(View view) {
                 ManagedBookmarksRestriction mbr = ManagedBookmarksRestriction.getInstance();
-                if (mbr.isEnabled() &&
-                    mbr.mDb.isMdmElement(mCurrentFolderId)) {
-                    Toast.makeText(getActivity(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
+                if ((mbr.isEnabled() && mbr.mDb.isMdmElement(mCurrentFolderId)) ||
+                        EditBookmarksRestriction.getInstance().isEnabled()) {
+                    Toast.makeText(getActivity().getApplicationContext(),
+                            R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
                 }
                 else {
                     Intent intent = new Intent(activity, AddBookmarkPage.class);
@@ -513,15 +539,17 @@
                 }
             }
         });
+        EditBookmarksRestriction.getInstance().registerControl(btn);
 
         btn = (Button) mRoot.findViewById(R.id.new_bmfolder_button);
         btn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 ManagedBookmarksRestriction mbr = ManagedBookmarksRestriction.getInstance();
-                if (mbr.isEnabled() &&
-                    mbr.mDb.isMdmElement(mCurrentFolderId)) {
-                    Toast.makeText(getActivity(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
+                if ((mbr.isEnabled() && mbr.mDb.isMdmElement(mCurrentFolderId)) ||
+                      EditBookmarksRestriction.getInstance().isEnabled()) {
+                    Toast.makeText(getActivity().getApplicationContext(),
+                            R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
                 }
                 else {
                     Intent intent = new Intent(activity, AddBookmarkFolder.class);
@@ -530,6 +558,7 @@
                 }
             }
         });
+        EditBookmarksRestriction.getInstance().registerControl(btn);
 
         // Start the loaders
         LoaderManager lm = getLoaderManager();
@@ -538,6 +567,8 @@
         //Notify about anticipated network activity
         NetworkServices.HintUpcomingUserActivity();
 
+        EditBookmarksRestriction.getInstance().registerView(mGrid);
+
         return mRoot;
     }
 
@@ -553,6 +584,8 @@
             lm.destroyLoader(id);
         }
         mBookmarkAdapters.clear();
+
+        EditBookmarksRestriction.getInstance().registerView(null);
     }
 
     private BrowserBookmarksAdapter getChildAdapter(int groupPosition) {
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 99a40fe..2f8db52 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -98,6 +98,7 @@
 import com.android.browser.R;
 import com.android.browser.IntentHandler.UrlData;
 import com.android.browser.UI.ComboViews;
+import com.android.browser.mdm.EditBookmarksRestriction;
 import com.android.browser.mdm.IncognitoRestriction;
 import com.android.browser.mdm.URLFilterRestriction;
 import com.android.browser.mynavigation.AddMyNavigationPage;
@@ -1933,8 +1934,9 @@
         mUi.onPrepareOptionsMenu(menu);
 
         IncognitoRestriction.getInstance()
-                            .registerControl(menu.findItem(R.id.incognito_menu_id)
-                                                 .getIcon());
+                .registerControl(menu.findItem(R.id.incognito_menu_id).getIcon());
+        EditBookmarksRestriction.getInstance()
+                .registerControl(menu.findItem(R.id.bookmark_this_page_id).getIcon());
     }
 
     private void setMenuItemVisibility(Menu menu, int id,
@@ -2347,20 +2349,25 @@
 
     @Override
     public void bookmarkCurrentPage() {
-        WebView w = getCurrentTopWebView();
-        if (w == null)
-            return;
-        final Intent i = createBookmarkCurrentPageIntent(false);
-        createScreenshotAsync(
-            w, getDesiredThumbnailWidth(mActivity),
-            getDesiredThumbnailHeight(mActivity),
-            new ValueCallback<Bitmap>() {
-                @Override
-                    public void onReceiveValue(Bitmap bitmap) {
-                    mBookmarkBitmap = bitmap;
-                    mActivity.startActivity(i);
-                }
-            });
+        if(EditBookmarksRestriction.getInstance().isEnabled()) {
+            Toast.makeText(getContext(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
+        }
+        else {
+            WebView w = getCurrentTopWebView();
+            if (w == null)
+                return;
+            final Intent i = createBookmarkCurrentPageIntent(false);
+            createScreenshotAsync(
+                    w, getDesiredThumbnailWidth(mActivity),
+                    getDesiredThumbnailHeight(mActivity),
+                    new ValueCallback<Bitmap>() {
+                        @Override
+                        public void onReceiveValue(Bitmap bitmap) {
+                            mBookmarkBitmap = bitmap;
+                            mActivity.startActivity(i);
+                        }
+                    });
+        }
     }
 
     private void goLive() {
diff --git a/src/com/android/browser/mdm/EditBookmarksRestriction.java b/src/com/android/browser/mdm/EditBookmarksRestriction.java
new file mode 100644
index 0000000..bbfe88a
--- /dev/null
+++ b/src/com/android/browser/mdm/EditBookmarksRestriction.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.browser.mdm;
+
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Button;
+import android.widget.ExpandableListView;
+
+import java.util.ArrayList;
+
+public class EditBookmarksRestriction extends Restriction {
+
+    private final static String TAG = "EditBookmarkRestriction";
+
+    public static final String EDIT_BOOKMARKS_RESTRICTION = "EditBookmarksEnabled";
+
+    private static EditBookmarksRestriction sInstance;
+
+    private ExpandableListView targetListView;
+    private ArrayList<Button> registeredButtons;
+    private ArrayList<Drawable> registeredDrawables;
+    private ColorStateList initialButtonColors;
+    private int disabledColor;
+
+    private EditBookmarksRestriction() {
+        super(TAG);
+    }
+
+    public static EditBookmarksRestriction getInstance() {
+        synchronized (EditBookmarksRestriction.class) {
+            if (sInstance == null) {
+                sInstance = new EditBookmarksRestriction();
+            }
+        }
+        return sInstance;
+    }
+
+    @Override
+    protected void doCustomInit() {
+        targetListView = null;
+        registeredButtons = new ArrayList<>();
+        registeredDrawables = new ArrayList<>();
+        initialButtonColors = null;
+        disabledColor = Color.parseColor("grey");
+    }
+
+    public void registerView(ExpandableListView f) {
+        targetListView = f;
+    }
+
+    public void registerControl(Button v) {
+        if (initialButtonColors == null) {
+            // we assume both buttons will have the same color info
+            initialButtonColors = v.getTextColors();
+        }
+        if (!registeredButtons.contains(v)) {
+            registeredButtons.add(v);
+        }
+        updateUiElems();
+    }
+
+    public void registerControl(Drawable d) {
+        if (!registeredDrawables.contains(d)) {
+            registeredDrawables.add(d);
+        }
+        updateUiElems();
+    }
+
+    private void updateUiElems() {
+        if (null != registeredButtons) {
+            for (Button v : registeredButtons) {
+                if (null != v) {
+                    if (isEnabled()) {
+                        v.setTextColor(disabledColor);
+                    }
+                    else {
+                        v.setTextColor(initialButtonColors);
+                    }
+                }
+            }
+        }
+        if (null != registeredDrawables) {
+            for (Drawable d : registeredDrawables) {
+                if (null != d) {
+                    d.setAlpha((isEnabled() ? 0x80 : 0xff));
+                }
+            }
+        }
+        if (targetListView != null) {
+            targetListView.invalidateViews();
+        }
+    }
+
+    /*
+     *   Note reversed logic:
+     *       [x] 'Restrict' true  = EditBookmarksEnabled : false   => disable editing in swe
+     *       [ ] 'Restrict' false = EditBookmarksEnabled : true    => enable editing in swe
+     */
+    @Override
+    public void enforce(Bundle restrictions) {
+        boolean bEnable = false;
+        if (restrictions.containsKey(EDIT_BOOKMARKS_RESTRICTION)) {
+            bEnable = ! restrictions.getBoolean(EDIT_BOOKMARKS_RESTRICTION);
+        }
+        Log.i(TAG, "Enforce [" + bEnable + "]");
+        enable(bEnable);
+
+        updateUiElems();
+    }
+}
diff --git a/src/com/android/browser/mdm/tests/EditBookmarkRestrictionsTest.java b/src/com/android/browser/mdm/tests/EditBookmarkRestrictionsTest.java
new file mode 100644
index 0000000..edc77cb
--- /dev/null
+++ b/src/com/android/browser/mdm/tests/EditBookmarkRestrictionsTest.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2015, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.browser.mdm.tests;
+
+import android.app.Instrumentation;
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import com.android.browser.BrowserActivity;
+import com.android.browser.mdm.EditBookmarksRestriction;
+import com.android.browser.mdm.ManagedProfileManager;
+
+public class EditBookmarkRestrictionsTest extends ActivityInstrumentationTestCase2<BrowserActivity> {
+
+    private final static String TAG = "+++EdBookmarkRestTest";
+
+    private Instrumentation mInstrumentation;
+    private BrowserActivity mActivity;
+    private EditBookmarksRestriction editBookmarksRestriction;
+
+    public EditBookmarkRestrictionsTest() {
+        super(BrowserActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mInstrumentation = getInstrumentation();
+        mActivity = getActivity();
+        editBookmarksRestriction = EditBookmarksRestriction.getInstance();
+    }
+
+    public void test_EditBookmarksRestriction() throws Throwable {
+        Log.i(TAG, "*** Starting EditBookmarksTest ***");
+        clearBookmarksRestrictions();
+        assertFalse(editBookmarksRestriction.isEnabled());
+
+        setBookmarksRestrictions(true);
+        assertTrue(editBookmarksRestriction.isEnabled());
+
+        setBookmarksRestrictions(false);
+        assertFalse(editBookmarksRestriction.isEnabled());
+    }
+
+    /**
+    * Activate EditBookmarks restriction
+     * @param clear    if true, sends an empty bundle (which is interpreted as "allow editing"
+     * @param enabled  Required. true (disallow editing: restriction enforced)
+     *                        or false (allow editing: restriction lifted)
+    *
+    */
+    private void setBookmarksRestrictions(boolean clear, boolean enabled) {
+        final Bundle restrictions = new Bundle();
+
+        if (!clear) {
+            // note reversed logic. This is setting 'EditBookmarksEnabled'
+            //    if enabled is true, we want it set to false and vice cersa
+            restrictions.putBoolean(EditBookmarksRestriction.EDIT_BOOKMARKS_RESTRICTION, ! enabled);
+        }
+
+        // Deliver restriction on UI thread
+        mActivity.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                ManagedProfileManager.getInstance().setMdmRestrictions(restrictions);
+            }
+        });
+
+        // Wait to ensure restriction is set
+        mInstrumentation.waitForIdleSync();
+    }
+
+    private void clearBookmarksRestrictions() {
+        setBookmarksRestrictions(true, false);
+    }
+
+    private void setBookmarksRestrictions(boolean enabled) {
+        setBookmarksRestrictions(false, enabled);
+    }
+}
diff --git a/src/com/android/browser/view/BookmarkThumbImageView.java b/src/com/android/browser/view/BookmarkThumbImageView.java
index 21c1f4f..50b3544 100644
--- a/src/com/android/browser/view/BookmarkThumbImageView.java
+++ b/src/com/android/browser/view/BookmarkThumbImageView.java
@@ -38,8 +38,6 @@
 
 public class BookmarkThumbImageView extends ImageView {
 
-    private boolean mAdjustDown = true;
-
     public BookmarkThumbImageView(Context context) {
         this(context, null);
     }
@@ -52,39 +50,29 @@
         super(context, attrs, defStyleAttr);
     }
 
-    public boolean getAdjustDown() {
-        return mAdjustDown;
-    }
-
-    public void setmAdjustDown(boolean mAdjustDown) {
-        this.mAdjustDown = mAdjustDown;
-    }
-
     @Override
     public void setImageDrawable(Drawable drawable) {
-        if (mAdjustDown) {
-            int drawableWidth = drawable.getIntrinsicWidth();
-            int drawableHeight = drawable.getIntrinsicHeight();
-            int containerWidth = getWidth() - getPaddingLeft() - getPaddingRight();
-            int containerHeight = getHeight() - getPaddingTop() - getPaddingBottom();
+        int drawableWidth = drawable.getIntrinsicWidth();
+        int drawableHeight = drawable.getIntrinsicHeight();
+        int containerWidth = getWidth() - getPaddingLeft() - getPaddingRight();
+        int containerHeight = getHeight() - getPaddingTop() - getPaddingBottom();
 
-            float scale;
-            Matrix m = new Matrix();
-            if ( (drawableWidth * containerHeight) > (containerWidth * drawableHeight)) {
-                scale = (float) containerHeight / (float) drawableHeight;
-            } else {
-                scale = (float) containerWidth / (float) drawableWidth;
-                float translateY = (containerHeight - drawableHeight * scale) / 2;
-                if (translateY < 0) {
-                    translateY = 0;
-                }
-                m.postTranslate(0, translateY + 0.5f);
+        float scale;
+        Matrix m = new Matrix();
+        if ( (drawableWidth * containerHeight) > (containerWidth * drawableHeight)) {
+            scale = (float) containerHeight / (float) drawableHeight;
+        } else {
+            scale = (float) containerWidth / (float) drawableWidth;
+            float translateY = (containerHeight - drawableHeight * scale) / 2;
+            if (translateY < 0) {
+                translateY = 0;
             }
-            m.setScale(scale, scale);
-
-            this.setScaleType(ScaleType.MATRIX);
-            this.setImageMatrix(m);
+            m.postTranslate(0, translateY + 0.5f);
         }
+        m.setScale(scale, scale);
+
+        this.setScaleType(ScaleType.MATRIX);
+        this.setImageMatrix(m);
         super.setImageDrawable(drawable);
     }
 }
