diff --git a/res/drawable-xxhdpi/img_deco_mdm_badge_bright.png b/res/drawable-xxhdpi/img_deco_mdm_badge_bright.png
new file mode 100644
index 0000000..060f183
--- /dev/null
+++ b/res/drawable-xxhdpi/img_deco_mdm_badge_bright.png
Binary files differ
diff --git a/res/drawable-xxhdpi/img_deco_mdm_badge_dark.png b/res/drawable-xxhdpi/img_deco_mdm_badge_dark.png
new file mode 100644
index 0000000..0afa667
--- /dev/null
+++ b/res/drawable-xxhdpi/img_deco_mdm_badge_dark.png
Binary files differ
diff --git a/res/menu/bookmarkscontext.xml b/res/menu/bookmarkscontext.xml
index df6f9af..ac19e0b 100644
--- a/res/menu/bookmarkscontext.xml
+++ b/res/menu/bookmarkscontext.xml
@@ -38,9 +38,9 @@
     android:visible="false">
     <item android:id="@+id/new_window_context_menu_id"
       android:title="@string/open_all_in_new_window"/>
-    <item android:id="@+id/edit_context_menu_id"
+    <item android:id="@+id/folder_edit_context_menu_id"
       android:title="@string/edit_folder"/>
-    <item android:id="@+id/delete_context_menu_id"
+    <item android:id="@+id/folder_delete_context_menu_id"
       android:title="@string/delete_folder"/>
   </group>
 </menu>
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 0f10072..8bade81 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.ManagedBookmarksRestriction;
 import com.android.browser.mdm.ThirdPartyCookiesRestriction;
 import com.android.browser.search.DefaultSearchEngine;
 import com.android.browser.search.SearchEngine;
@@ -161,6 +162,7 @@
 
         // MDM Restrictions not tied to a UI element initialized here.
         ThirdPartyCookiesRestriction.getInstance();
+        ManagedBookmarksRestriction.getInstance();
     }
 
     @VisibleForTesting
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 2acc9c9..ae9c491 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.drawable.BitmapDrawable;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -26,7 +27,7 @@
 import android.widget.ImageView.ScaleType;
 import android.widget.TextView;
 
-import com.android.browser.R;
+import com.android.browser.mdm.ManagedBookmarksRestriction;
 import com.android.browser.platformsupport.BrowserContract.Bookmarks;
 import com.android.browser.util.ThreadedCursorAdapter;
 import com.android.browser.view.BookmarkContainer;
@@ -35,6 +36,7 @@
 public class BrowserBookmarksAdapter extends
         ThreadedCursorAdapter<BrowserBookmarksAdapterItem> {
 
+    private static final String TAG = "BrowserBookmarksAdapter";
     LayoutInflater mInflater;
     Context mContext;
 
@@ -85,19 +87,50 @@
                 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);
         if (item.is_folder) {
             // folder
-            thumb.setImageResource(R.drawable.thumb_bookmark_widget_folder_holo);
-            thumb.setScaleType(ScaleType.FIT_END);
+            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);
+            }
+            else {
+                thumb.setmAdjustDown(true);
+                thumb.setImageResource(R.drawable.thumb_bookmark_widget_folder_holo);
+                thumb.setScaleType(ScaleType.FIT_END);
+            }
             thumb.setBackground(null);
         } else {
             if (item.thumbnail == null || !item.has_thumbnail) {
-                thumb.setScaleType(ScaleType.CENTER_CROP);
-                thumb.setImageResource(R.drawable.browser_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 {
-                thumb.setImageDrawable(item.thumbnail);
+                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);
+                }
             }
         }
     }
@@ -119,6 +152,7 @@
         item.is_folder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
         item.title = getTitle(c);
         item.url = c.getString(BookmarksLoader.COLUMN_INDEX_URL);
+        item.is_mdm_managed = ManagedBookmarksRestriction.getInstance().mDb.isMdmElement(getItemId(c));
         return item;
     }
 
diff --git a/src/com/android/browser/BrowserBookmarksAdapterItem.java b/src/com/android/browser/BrowserBookmarksAdapterItem.java
index 6b99578..5fb648e 100644
--- a/src/com/android/browser/BrowserBookmarksAdapterItem.java
+++ b/src/com/android/browser/BrowserBookmarksAdapterItem.java
@@ -23,4 +23,5 @@
     public BitmapDrawable thumbnail;
     public boolean has_thumbnail;
     public boolean is_folder;
+    public boolean is_mdm_managed;
 }
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index d026b09..e004225 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -34,13 +34,14 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.BitmapFactory.Options;
+import android.graphics.Canvas;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
-import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
@@ -50,7 +51,7 @@
 import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.Toast;
 
-import com.android.browser.R;
+import com.android.browser.mdm.ManagedBookmarksRestriction;
 import com.android.browser.platformsupport.BrowserContract;
 import com.android.browser.platformsupport.BrowserContract.Accounts;
 import com.android.browser.provider.BrowserProvider2;
@@ -78,6 +79,8 @@
         LoaderManager.LoaderCallbacks<Cursor>, BreadCrumbView.Controller,
         OnChildClickListener {
 
+    private static final String TAG = "BrowserBookmarksPage";
+
     public static class ExtraDragState {
         public int childPosition;
         public int groupPosition;
@@ -196,6 +199,7 @@
         case R.id.open_context_menu_id:
             loadUrl(adapter, childPosition);
             break;
+        case R.id.folder_edit_context_menu_id:
         case R.id.edit_context_menu_id:
             editBookmark(adapter, childPosition);
             break;
@@ -203,6 +207,7 @@
             Cursor c = adapter.getItem(childPosition);
             activity.sendBroadcast(createShortcutIntent(getActivity(), c));
             break;
+        case R.id.folder_delete_context_menu_id:
         case R.id.delete_context_menu_id:
             displayRemoveBookmarkDialog(adapter, childPosition);
             break;
@@ -287,21 +292,31 @@
         }
         boolean isFolder
                 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
+        boolean isMdmElem = ManagedBookmarksRestriction.getInstance().mDb.
+                isMdmElement(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
 
         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) {
+                menu.findItem(R.id.folder_edit_context_menu_id).setEnabled(false);
+                menu.findItem(R.id.folder_delete_context_menu_id).setEnabled(false);
+            }
         } else {
             menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
             if (mDisableNewWindow) {
                 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
             }
+            if(isMdmElem) {
+                menu.findItem(R.id.edit_context_menu_id).setEnabled(false);
+                menu.findItem(R.id.delete_context_menu_id).setEnabled(false);
+            }
         }
         BookmarkItem header = new BookmarkItem(activity);
         header.setEnableScrolling(true);
-        populateBookmarkItem(cursor, header, isFolder);
+        populateBookmarkItem(cursor, header, isFolder, isMdmElem);
         menu.setHeaderView(header);
 
         int count = menu.size();
@@ -316,12 +331,71 @@
                 || type == BrowserContract.Bookmarks.BOOKMARK_TYPE_FOLDER;
     }
 
-    private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
+    public static Bitmap overlayBookmarkBitmap(Bitmap origImage, int overlayResId, Context context,
+                                               float overlayScaleFactor) {
+        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();
+
+        // 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;
+        }
+
+        // Scale the badge
+        float fx = (float) srcOverlay.getWidth()  * overlayScaleFactor;
+        float fy = (float) srcOverlay.getHeight() * overlayScaleFactor;
+        Bitmap scaledOverlay = Bitmap.createScaledBitmap(srcOverlay, (int) fx, (int) fy, true);
+        if (scaledOverlay == null) {
+            srcOverlay.recycle();
+            Runtime.getRuntime().gc();
+            Log.e(TAG, "Scaled bitmap creation failed");
+            return origImage;
+        }
+
+        // Create the bitmap we are compositing into
+        Bitmap overlaid = Bitmap.createBitmap(origWidth, origHeight, Bitmap.Config.ARGB_8888);
+        if (overlaid == null) {
+            srcOverlay.recycle();
+            scaledOverlay.recycle();
+            Runtime.getRuntime().gc();
+            Log.e(TAG, "Composite bitmap creation failed");
+            return origImage;
+        }
+
+        // Do the overlay
+        Canvas comboImage = new Canvas(overlaid);
+        comboImage.drawBitmap(origImage, 0, 0, null);
+
+        comboImage.drawBitmap(scaledOverlay,
+                origWidth  - scaledOverlay.getWidth(),
+                origHeight - scaledOverlay.getHeight(),
+                null);
+
+        // Clean up our bitmaps
+        srcOverlay.recycle();
+        scaledOverlay.recycle();
+        Runtime.getRuntime().gc();
+
+        return overlaid;
+    }
+
+    private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder, boolean isMdmElem) {
         item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
         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));
@@ -329,6 +403,12 @@
             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);
+            }
             item.setFavicon(bitmap);
         }
     }
@@ -419,11 +499,18 @@
         btn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                Intent intent = new Intent(activity, AddBookmarkPage.class);
-                intent.putExtra(BrowserContract.Bookmarks.URL, "http://");
-                intent.putExtra(BrowserContract.Bookmarks.TITLE, "");
-                intent.putExtra(BrowserContract.Bookmarks.PARENT, mCurrentFolderId);
-                activity.startActivity(intent);
+                ManagedBookmarksRestriction mbr = ManagedBookmarksRestriction.getInstance();
+                if (mbr.isEnabled() &&
+                    mbr.mDb.isMdmElement(mCurrentFolderId)) {
+                    Toast.makeText(getActivity(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
+                }
+                else {
+                    Intent intent = new Intent(activity, AddBookmarkPage.class);
+                    intent.putExtra(BrowserContract.Bookmarks.URL, "http://");
+                    intent.putExtra(BrowserContract.Bookmarks.TITLE, "");
+                    intent.putExtra(BrowserContract.Bookmarks.PARENT, mCurrentFolderId);
+                    activity.startActivity(intent);
+                }
             }
         });
 
@@ -431,9 +518,16 @@
         btn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                Intent intent = new Intent(activity, AddBookmarkFolder.class);
-                intent.putExtra(BrowserContract.Bookmarks.PARENT, mCurrentFolderId);
-                activity.startActivity(intent);
+                ManagedBookmarksRestriction mbr = ManagedBookmarksRestriction.getInstance();
+                if (mbr.isEnabled() &&
+                    mbr.mDb.isMdmElement(mCurrentFolderId)) {
+                    Toast.makeText(getActivity(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
+                }
+                else {
+                    Intent intent = new Intent(activity, AddBookmarkFolder.class);
+                    intent.putExtra(BrowserContract.Bookmarks.PARENT, mCurrentFolderId);
+                    activity.startActivity(intent);
+                }
             }
         });
 
diff --git a/src/com/android/browser/mdm/DoNotTrackRestriction.java b/src/com/android/browser/mdm/DoNotTrackRestriction.java
index e69fe16..94db45f 100644
--- a/src/com/android/browser/mdm/DoNotTrackRestriction.java
+++ b/src/com/android/browser/mdm/DoNotTrackRestriction.java
@@ -48,7 +48,7 @@
     private MdmCheckBoxPreference mPref = null;
 
     private DoNotTrackRestriction() {
-        super();
+        super(TAG);
     }
 
     public static DoNotTrackRestriction getInstance() {
diff --git a/src/com/android/browser/mdm/IncognitoRestriction.java b/src/com/android/browser/mdm/IncognitoRestriction.java
index 3ea1fe4..ee2f2e6 100644
--- a/src/com/android/browser/mdm/IncognitoRestriction.java
+++ b/src/com/android/browser/mdm/IncognitoRestriction.java
@@ -48,7 +48,7 @@
     private ArrayList<Drawable> registeredDrawables;
 
     private IncognitoRestriction() {
-        super();
+        super(TAG);
         registeredViews = new ArrayList<>();
         registeredDrawables = new ArrayList<>();
     }
diff --git a/src/com/android/browser/mdm/ManagedBookmarksRestriction.java b/src/com/android/browser/mdm/ManagedBookmarksRestriction.java
new file mode 100644
index 0000000..84c21a7
--- /dev/null
+++ b/src/com/android/browser/mdm/ManagedBookmarksRestriction.java
@@ -0,0 +1,441 @@
+/*
+ * 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.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.browser.platformsupport.BrowserContract;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import static org.chromium.base.ApplicationStatus.getApplicationContext;
+
+public class ManagedBookmarksRestriction extends Restriction {
+
+    private final static String TAG = "+++MngdBookmarks_Rest";
+
+    public static final String MANAGED_BOOKMARKS = "ManagedBookmarks";
+    private static final String FOLDER_URL_KEY = "MDM";
+    private static ManagedBookmarksRestriction sInstance;
+    private String mJsonBookmarks;
+    public BookmarksDb mDb;
+    private boolean mCreatedMdmBookmarks;
+
+    private ManagedBookmarksRestriction() {
+        super(TAG);
+    }
+
+    public static ManagedBookmarksRestriction getInstance() {
+        synchronized (ManagedBookmarksRestriction.class) {
+            if (sInstance == null) {
+                sInstance = new ManagedBookmarksRestriction();
+            }
+        }
+        return sInstance;
+    }
+
+    @Override
+    protected void doCustomInit() {
+        mDb = new BookmarksDb();
+        mCreatedMdmBookmarks = false;
+    }
+
+    public class BookmarksDb {
+        private ContentResolver mCr = null;
+
+        public class CRException extends Exception {
+            public CRException(String s) {
+                super(s);
+            }
+        }
+        private ContentResolver cr() throws CRException {
+            if (mCr == null) {
+                mCr = getApplicationContext().getContentResolver();
+            }
+            if (mCr == null) {
+                throw new CRException("Null ContentResolver");
+            }
+            return mCr;
+        }
+
+        public Cursor queryById(long id, String[] projections) {
+            String where =  BrowserContract.Bookmarks._ID + " = " + id;
+            Cursor c = null;
+            try {
+                c = cr().query(BrowserContract.Bookmarks.CONTENT_URI,
+                        projections,  // projections... the columns we want. null means all
+                        where,        // where clause (without the WHERE keyword)
+                        null,         // selectionArgs
+                        null);        // sortOrder
+            } catch (android.database.sqlite.SQLiteException e) {
+                Log.e(TAG, "queryById SQL Exception: [" + e.toString() + "]");
+            } catch (CRException e) {
+                Log.e(TAG, "queryById CR Exception: [" + e.toString() + "]");
+            }
+            return c;
+        }
+
+        public void deleteItemById(long id) {
+            String where =  BrowserContract.Bookmarks._ID + " = " + id;
+            try {
+                cr().delete(BrowserContract.Bookmarks.CONTENT_URI, where, null);
+            }
+            catch (android.database.sqlite.SQLiteException e) {
+                Log.e(TAG, "deleteItemById Exception: [" + e.toString() + "]");
+            } catch (CRException e) {
+                Log.e(TAG, "deleteItemById CR Exception: [" + e.toString() + "]");
+            }
+        }
+
+        public long getMdmRootFolderId() {
+            long result = -1;
+            String projections[] = new String[] {BrowserContract.Bookmarks._ID};
+            String where =  BrowserContract.Bookmarks.TITLE     + " = 'Managed' AND " +
+                            BrowserContract.Bookmarks.IS_FOLDER + " = 1         AND " +
+                            BrowserContract.Bookmarks.URL       + " like '" + FOLDER_URL_KEY + "%' AND " +
+                            BrowserContract.Bookmarks.PARENT    + " = 1";
+            try {
+                Cursor c = cr().query(BrowserContract.Bookmarks.CONTENT_URI,
+                        projections,  // projections... the columns we want. null means all
+                        where,        // where clause (without the WHERE keyword)
+                        null,         // selectionArgs
+                        null);        // sortOrder
+                if (c.getCount() != 0) {
+                    c.moveToFirst();
+                    result = c.getLong(0);
+                }
+                c.close();
+            } catch (android.database.sqlite.SQLiteException e) {
+                Log.e(TAG, "getMdmRootFolderId SQL Exception: [" + e.toString() + "]");
+            } catch (CRException e) {
+                Log.e(TAG, "getMdmRootFolderId CR Exception: [" + e.toString() + "]");
+            }
+            return result;
+        }
+
+        public Cursor getChildrenForMdmFolder(long id, String [] projections) {
+            String where =  BrowserContract.Bookmarks.PARENT + " = " + id;
+            Cursor c = null;
+            try {
+                c = cr().query(BrowserContract.Bookmarks.CONTENT_URI,
+                        projections,  // projections... the columns we want. null means all
+                        where,        // where clause (without the WHERE keyword)
+                        null,         // selectionArgs
+                        null);        // sortOrder
+            } catch (android.database.sqlite.SQLiteException e) {
+                Log.e(TAG, "getChildrenForMdmFolder SQL Exception: [" + e.toString() + "]");
+            } catch (CRException e) {
+                Log.e(TAG, "getChildrenForMdmFolder CR Exception: [" + e.toString() + "]");
+            }
+            return c;
+        }
+
+        private void addBookmark(String title, long parent, String url) {
+            ContentValues values = new ContentValues();
+            values.put(BrowserContract.Bookmarks.PARENT, parent);
+            values.put(BrowserContract.Bookmarks.TITLE, title);
+            values.put(BrowserContract.Bookmarks.URL, url);
+
+            try {
+                Uri uri = cr().insert(BrowserContract.Bookmarks.CONTENT_URI, values);
+                if (uri == null) {
+                    Log.e(TAG, "Bookmark '" + title + "' creation failed.");
+                }
+            } catch (android.database.sqlite.SQLiteException e) {
+                Log.e(TAG, "addBookmark-SQL Exception during creation: [" + e.toString() + "]");
+            } catch (CRException e) {
+                Log.e(TAG, "addBookmark CR Exception: [" + e.toString() + "]");
+            }
+        }
+
+        private boolean bookmarksAlreadyEnabled(int hash) {
+            boolean ret = false;
+            String incomingHash = String.valueOf(hash);
+            long rootId = getMdmRootFolderId();
+            if (rootId != -1) {
+                Cursor c = queryById(rootId, new String[] {BrowserContract.Bookmarks.URL});
+                if (c.getCount() == 1) {
+                    c.moveToFirst();
+                    String url = c.getString(0);
+                    if (url.contains(incomingHash)) {
+                        ret = true;
+                    }
+                }
+                c.close();
+            }
+            return ret;
+        }
+
+        private void addFolder(String title, long parent, JSONArray children, int hash) {
+            ContentValues values = new ContentValues();
+            values.put(BrowserContract.Bookmarks.PARENT, parent);
+            values.put(BrowserContract.Bookmarks.TITLE, title);
+            values.put(BrowserContract.Bookmarks.IS_FOLDER, 1);
+
+            // We are using the URL field (normally not used for folders) to
+            // lock down that this folder is managed by Mdm.  This is certainly
+            // non-standard, but the alternative would be to modify the database schema,
+            // which would become a maintenance headache later when google updates the schema.
+            if (hash != 0) {
+                // We add the hash of the json string to the root folder. We use this
+                // to check if we already have this bookmark set enabled.
+                values.put(BrowserContract.Bookmarks.URL, FOLDER_URL_KEY + ":" + hash);
+            }
+            else {
+                values.put(BrowserContract.Bookmarks.URL, FOLDER_URL_KEY);
+            }
+
+            try {
+                Uri uri = cr().insert(BrowserContract.Bookmarks.CONTENT_URI, values);
+                if (uri != null) {
+                    long nodeId = ContentUris.parseId(uri);
+
+                    if (children != null) {
+                        for (int i = 0; i < children.length(); i++) {
+                            JSONObject j = children.getJSONObject(i);
+
+                            // if it has a URL, then it's a bookmark
+                            if (j.has("url")) {
+                                String t = j.getString("name");
+                                String u = j.getString("url");
+                                mDb.addBookmark(t, nodeId, u);
+                            }
+                            // if it has children, then it's a subfolder
+                            else if (j.has("children")) {
+                                String t = j.getString("name");
+                                JSONArray ja = new JSONArray(j.getString("children"));
+                                addFolder(t, nodeId, ja, 0);
+                            } else {
+                                Log.e(TAG, "Parse error processing children for [" + title + "]");
+                            }
+                        }
+                    }
+                } else {
+                    Log.e(TAG, "Folder creation failed.");
+                }
+            } catch (android.database.sqlite.SQLiteException e) {
+                Log.e(TAG, "addFolder-SQL Exception during creation: [" + e.toString() + "]");
+            } catch (JSONException e) {
+                Log.e(TAG, "addFolder-JSON exception during creation: [" + e.toString() + "]");
+            } catch (CRException e) {
+                Log.e(TAG, "addFolder CR Exception: [" + e.toString() + "]");
+            }
+        }
+
+        public boolean isMdmElement(long id) {
+            boolean ret = false;
+
+            String[] projections =
+                    new String[]{
+                            BrowserContract.Bookmarks.IS_FOLDER,
+                            BrowserContract.Bookmarks.URL,
+                            BrowserContract.Bookmarks.PARENT};
+
+            Cursor c = mDb.queryById(id, projections);
+            if(1 == c.getCount()) {
+                c.moveToFirst();
+                int isFolder = c.getInt(0);
+                String url = c.getString(1);
+                long parent = c.getLong(2);
+
+                if (isFolder != 0) {
+                    if (url != null && url.startsWith(FOLDER_URL_KEY)) {
+                        ret = true;
+                    }
+                }
+                else {
+                    Cursor cp = mDb.queryById(parent, projections);
+                    if(1 == cp.getCount()) {
+                        cp.moveToFirst();
+                        String u2 = cp.getString(1);
+                        if (u2 != null && u2.startsWith(FOLDER_URL_KEY)) {
+                            ret = true;
+                        }
+                    }
+                    else {
+                        Log.e(TAG,"isMdmElement: Invalid parent id ["+id+"]");
+                    }
+                }
+            }
+            else {
+                Log.e(TAG,"isMdmElement: Invalid id ["+id+"]");
+            }
+            c.close();
+            return ret;
+        }
+
+        private void deleteTree(long folderId) {
+            if (folderId == -1) {
+                Log.i(TAG, " deleteTree: no tree to delete.");
+                return;
+            }
+
+            String[] projections =
+                    new String[]{
+                            BrowserContract.Bookmarks.IS_FOLDER,
+                            BrowserContract.Bookmarks._ID};
+
+            try {
+                Cursor c = getChildrenForMdmFolder(folderId, projections);
+
+                int n = c.getCount();
+                if (n != 0) {
+                    c.moveToFirst();
+                    for (int i = 0; i < n; i++) {
+                        int isFolder = c.getInt(0);
+                        int itemId   = c.getInt(1);
+
+                        if (isFolder == 1) {
+                            deleteTree(itemId);
+                        }
+                        else {
+                            mDb.deleteItemById(itemId);
+                        }
+                        c.moveToNext();
+                    }
+                }
+                else {
+                    Log.i(TAG,"DeleteTree: no children for id["+folderId+"]");
+                }
+                c.close();
+
+                // now that the contents have been deleted, delete this folder
+                mDb.deleteItemById(folderId);
+            } catch (android.database.sqlite.SQLiteException e) {
+                Log.e(TAG, "deleteTree SQL Exception: [" + e.toString() + "]");
+            }
+        }
+    }
+
+    /* For Debugging
+    public void dumpCursor(Cursor c) {
+        int n = c.getCount();
+        int pos = c.getPosition();
+
+        if (n != 0) {
+            String cols[] = c.getColumnNames();
+            Log.i(TAG, " ********* Dumping " + n + " records *************");
+            c.moveToFirst();
+            for (int i = 0; i < n; i++) {
+                Log.i(TAG,"  == Record ["+i+"]");
+                for (String col : cols) {
+                    int ndx = c.getColumnIndex(col);
+                    switch (c.getType(ndx)) {
+                        case Cursor.FIELD_TYPE_NULL:
+                            Log.i(TAG, "      " + col + " = <null>");
+                            break;
+                        case Cursor.FIELD_TYPE_BLOB:
+                            Log.i(TAG, "      " + col + " = <blob>");
+                            break;
+                        case Cursor.FIELD_TYPE_FLOAT:
+                            Log.i(TAG, "      " + col + " = " +
+                                    c.getFloat(ndx));
+                            break;
+                        case Cursor.FIELD_TYPE_INTEGER:
+                            Log.i(TAG, "      " + col + " = " +
+                                    c.getInt(ndx));
+                            break;
+                        case Cursor.FIELD_TYPE_STRING:
+                            Log.i(TAG, "      " + col + " = " +
+                                    c.getString(ndx));
+                            break;
+                    }
+                }
+                c.moveToNext();
+            }
+            Log.i(TAG, " ********* END Dump *************");
+        }
+        c.moveToPosition(pos); // restore incoming position
+    } */
+
+    private void removeManagedBookmarks() {
+        mDb.deleteTree(mDb.getMdmRootFolderId());
+    }
+
+    public boolean bookmarksWereCreated() {
+        return mCreatedMdmBookmarks;
+    }
+
+    private void addManagedBookmarks() {
+        String name = "Managed";
+        int rootFolder = 1;
+        mCreatedMdmBookmarks = false;
+
+        int hash = mJsonBookmarks.hashCode();
+        if (! mDb.bookmarksAlreadyEnabled(hash)) {
+            Log.i(TAG, ">>>>>>> BOOKMARKS NOT ALREADY ENABLED <<<<<<<<<<<<");
+            removeManagedBookmarks();
+            JSONArray dict = null;
+            try {
+                dict = new JSONArray(mJsonBookmarks);
+            } catch (JSONException e) {
+                Log.w(TAG, "addManagedBookmarks: Incoming JSON didn't parse. Creating empty folder." + e.toString());
+            }
+
+            mDb.addFolder(name, rootFolder, dict, hash);
+
+            mCreatedMdmBookmarks = true;
+        }
+        else {
+            Log.w(TAG, ">>>>>>> BOOKMARKS ALREADY ENABLED <<<<<<<<<<<<");
+            mCreatedMdmBookmarks = false;
+        }
+    }
+
+    @Override
+    public void enforce(Bundle restrictions) {
+        mJsonBookmarks = restrictions.getString(MANAGED_BOOKMARKS);
+
+        // Enable if we got something in the json bookmarks string
+        enable(!(mJsonBookmarks == null || mJsonBookmarks.isEmpty()));
+
+        Log.i(TAG, "Enforcing. enabled[" + isEnabled() + "]. val[" + mJsonBookmarks + "]");
+
+        if(isEnabled()){
+            addManagedBookmarks();
+        }
+        else {
+            removeManagedBookmarks();
+        }
+    }
+
+    public String getValue() {
+        return mJsonBookmarks;
+    }
+}
diff --git a/src/com/android/browser/mdm/ProxyRestriction.java b/src/com/android/browser/mdm/ProxyRestriction.java
index ddcf0a2..1a4b591 100644
--- a/src/com/android/browser/mdm/ProxyRestriction.java
+++ b/src/com/android/browser/mdm/ProxyRestriction.java
@@ -62,7 +62,7 @@
     private static ProxyRestriction sInstance;
 
     private ProxyRestriction() {
-        super();
+        super(TAG);
     }
 
     public static ProxyRestriction getInstance() {
diff --git a/src/com/android/browser/mdm/Restriction.java b/src/com/android/browser/mdm/Restriction.java
index ab21c03..a9e4285 100644
--- a/src/com/android/browser/mdm/Restriction.java
+++ b/src/com/android/browser/mdm/Restriction.java
@@ -31,6 +31,7 @@
 package com.android.browser.mdm;
 
 import android.os.Bundle;
+import android.util.Log;
 
 import org.codeaurora.swe.util.Activator;
 import org.codeaurora.swe.util.Observable;
@@ -44,8 +45,10 @@
 
     private boolean mEnabled = false;
 
-    public Restriction() {
+    public Restriction(String s) {
         // Register observer for restrictions
+        Log.i("+++", "["+ s + "] is registering it's observer");
+        doCustomInit();
         Activator.activate(new Observable.Observer() {
             @Override
             public void onChange(Object... params) {
@@ -65,5 +68,7 @@
     }
 
     abstract public void enforce(Bundle restrictions);
+
+    protected void doCustomInit() {}
 }
 
diff --git a/src/com/android/browser/mdm/SearchEngineRestriction.java b/src/com/android/browser/mdm/SearchEngineRestriction.java
index 23a75a0..3f0eef8 100644
--- a/src/com/android/browser/mdm/SearchEngineRestriction.java
+++ b/src/com/android/browser/mdm/SearchEngineRestriction.java
@@ -53,7 +53,7 @@
     private SearchEngineInfo mSearchEngineInfo;
 
     private SearchEngineRestriction() {
-        super();
+        super(TAG);
     }
 
     public static SearchEngineRestriction getInstance() {
diff --git a/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java b/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java
index 7f55c22..86e3103 100644
--- a/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java
+++ b/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java
@@ -46,7 +46,7 @@
     private boolean mTpcValue;
 
     private ThirdPartyCookiesRestriction() {
-        super();
+        super(TAG);
     }
 
     public static ThirdPartyCookiesRestriction getInstance() {
diff --git a/src/com/android/browser/mdm/URLFilterRestriction.java b/src/com/android/browser/mdm/URLFilterRestriction.java
index 551f5ea..3141247 100644
--- a/src/com/android/browser/mdm/URLFilterRestriction.java
+++ b/src/com/android/browser/mdm/URLFilterRestriction.java
@@ -41,7 +41,7 @@
     private static URLFilterRestriction sInstance;
 
     private URLFilterRestriction() {
-        super();
+        super(TAG);
     }
 
     public static URLFilterRestriction getInstance() {
diff --git a/src/com/android/browser/mdm/tests/ManagedBookmarksRestrictionsTest.java b/src/com/android/browser/mdm/tests/ManagedBookmarksRestrictionsTest.java
new file mode 100644
index 0000000..3767663
--- /dev/null
+++ b/src/com/android/browser/mdm/tests/ManagedBookmarksRestrictionsTest.java
@@ -0,0 +1,278 @@
+/*
+ * 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.database.Cursor;
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import com.android.browser.BrowserActivity;
+import com.android.browser.PreferenceKeys;
+import com.android.browser.mdm.ManagedBookmarksRestriction;
+import com.android.browser.mdm.ManagedProfileManager;
+import com.android.browser.platformsupport.BrowserContract;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+
+public class ManagedBookmarksRestrictionsTest extends ActivityInstrumentationTestCase2<BrowserActivity>
+        implements PreferenceKeys {
+
+    private final static String TAG = "BkmrksRestTest";
+
+    private Instrumentation mInstrumentation;
+    private BrowserActivity mActivity;
+    private ManagedBookmarksRestriction managedBookmarksRestriction;
+    private ManagedBookmarksRestriction.BookmarksDb mDb;
+
+    private ArrayList<bmTuple> mBookmarks;
+    private String mSubDirName;
+
+    public ManagedBookmarksRestrictionsTest() {
+        super(BrowserActivity.class);
+    }
+
+    private class bmTuple {
+        String name;
+        String url;
+        public bmTuple(String n, String u) {
+            name = n;
+            url = u;
+        }
+        public String getName(){ return name;}
+        public String getUrl() { return url;}
+    }
+
+    void initializeTestData() {
+        mBookmarks = new ArrayList<>();
+        // Level 0
+        mBookmarks.add(new bmTuple("Chromium for Snapdragon", "www.codeaurora.org/forums/chromium-snapdragon"));
+        mBookmarks.add(new bmTuple("Chromium Browser for Snapdragon", "www.codeaurora.org/xwiki/bin/Chromium+for+Snapdragon"));
+        mSubDirName = "Repos And Patches";
+
+        // Level 1
+        mBookmarks.add(new bmTuple("Code Aurora git repositories", "www.codeaurora.org/cgit/quic/chrome4sdp"));
+        mBookmarks.add(new bmTuple("Patches", "www.codeaurora.org/patches/quic/chrome4snapdragon"));
+    }
+
+    private String getBookmarksDict(int indent) {
+        JSONArray dict = new JSONArray();
+
+        JSONObject bm_0_0 = new JSONObject();
+        JSONObject bm_0_1 = new JSONObject();
+
+        JSONObject level_1_Folder = new JSONObject();
+        JSONArray level_1_Children = new JSONArray();
+        JSONObject bm_1_0 = new JSONObject();
+        JSONObject bm_1_1 = new JSONObject();
+        try {
+            bm_0_0.put("name", mBookmarks.get(0).getName());
+            bm_0_0.put("url",  mBookmarks.get(0).getUrl());
+
+            bm_0_1.put("name", mBookmarks.get(1).getName());
+            bm_0_1.put("url",  mBookmarks.get(1).getUrl());
+
+            bm_1_0.put("name", mBookmarks.get(2).getName());
+            bm_1_0.put("url",  mBookmarks.get(2).getUrl());
+
+            bm_1_1.put("name", mBookmarks.get(3).getName());
+            bm_1_1.put("url",  mBookmarks.get(3).getUrl());
+
+            level_1_Children.put(bm_1_0);
+            level_1_Children.put(bm_1_1);
+
+            level_1_Folder.put("name", mSubDirName);
+            level_1_Folder.put("children", level_1_Children);
+
+            dict.put(bm_0_0);
+            dict.put(bm_0_1);
+            dict.put(level_1_Folder);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        String ret = null;
+        try {
+            ret = (indent != 0 ? dict.toString(indent): dict.toString());
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        return ret;
+    }
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mInstrumentation = getInstrumentation();
+        mActivity = getActivity();
+        managedBookmarksRestriction = ManagedBookmarksRestriction.getInstance();
+        mDb = managedBookmarksRestriction.mDb;
+        initializeTestData();
+    }
+
+    public void test_MB() throws Throwable {
+        Log.i(TAG,"!!! ******** Starting Managed Bookmark Tests *************");
+
+        clearMBRestrictions();
+        assertFalse(managedBookmarksRestriction.isEnabled());
+        assertNull(managedBookmarksRestriction.getValue());
+
+        setMBRestrictions(true);
+        assertTrue(managedBookmarksRestriction.isEnabled());
+        assertEquals(getBookmarksDict(0), managedBookmarksRestriction.getValue());
+
+        // Now check the DB for our bookmark records
+        assertTrue(managedBookmarksRestriction.bookmarksWereCreated());
+        long rootId = mDb.getMdmRootFolderId();
+        assertFalse(rootId == -1);
+        assertTrue(mDb.isMdmElement(rootId));
+
+        String[] projections = new String[] {
+                BrowserContract.Bookmarks.URL,
+                BrowserContract.Bookmarks.IS_FOLDER,
+                BrowserContract.Bookmarks.TITLE,
+                BrowserContract.Bookmarks._ID,
+        };
+
+        long chromeLinksId = -1;  // we need the folder id for the 2nd level checks
+
+        //
+        // Check Level 0
+        //
+        Cursor c = mDb.getChildrenForMdmFolder(rootId, projections);
+        int n = c.getCount();
+        assertTrue(n == 3);
+
+        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
+            String url   = c.getString(0);
+            int isFolder = c.getInt(1);
+            String title = c.getString(2);
+            long id = c.getLong(3);
+
+            assertTrue(mDb.isMdmElement(id));
+
+            boolean found = false;
+            for (bmTuple t : mBookmarks){
+                if (t.getName().equals(title)) {
+                    found = true;
+                    assertEquals(t.getUrl(), url);
+                    assertEquals(0, isFolder);
+                }
+            }
+
+            if (title.equals(mSubDirName)) {
+                assertEquals("MDM", url);
+                assertEquals(1, isFolder);
+                chromeLinksId = id;
+                found = true;
+            }
+            if (!found) {
+                assertFalse("Unexpected entry ["+title+"] found", true);
+            }
+        }
+        //
+        // Check Level 1
+        //
+        c = mDb.getChildrenForMdmFolder(chromeLinksId, projections);
+        n = c.getCount();
+        assertTrue(n == 2);
+
+        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
+            String url   = c.getString(0);
+            int isFolder = c.getInt(1);
+            String title = c.getString(2);
+            long id = c.getLong(3);
+
+            assertTrue(mDb.isMdmElement(id));
+
+            boolean found = false;
+            for (bmTuple t : mBookmarks){
+                if (t.getName().equals(title)) {
+                    found = true;
+                    assertEquals(t.getUrl(), url);
+                    assertEquals(0, isFolder);
+                }
+            }
+            if (!found) {
+                assertFalse("Unexpected entry ["+title+"] found", true);
+            }
+        }
+
+        //
+        // attempt to add bookmarks again.  Should fail silently.
+        // catt bookmarksWereCreated() to  see if they were actually created or not
+        //
+        setMBRestrictions(true);
+        assertFalse(managedBookmarksRestriction.bookmarksWereCreated());
+
+        //
+        // Now, clear the restriction and check that there is no root mdm folder in the DB
+        //
+        clearMBRestrictions();
+        assertFalse(managedBookmarksRestriction.isEnabled());
+        assertNull(managedBookmarksRestriction.getValue());
+        rootId = mDb.getMdmRootFolderId();
+        assertTrue(rootId == -1);
+    }
+
+    /**
+     * Activate ManagedBookmarks restriction
+     * @param enable boolean. Set the state of the restriction.
+     */
+    private void setMBRestrictions(boolean enable) {
+        // Construct restriction bundle
+        final Bundle restrictions = new Bundle();
+
+        if(enable) {
+            restrictions.putString(ManagedBookmarksRestriction.MANAGED_BOOKMARKS, getBookmarksDict(0));
+        }
+
+        // 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 clearMBRestrictions() {
+        setMBRestrictions(false);
+    }
+}
diff --git a/src/com/android/browser/view/BookmarkThumbImageView.java b/src/com/android/browser/view/BookmarkThumbImageView.java
index 50b3544..21c1f4f 100644
--- a/src/com/android/browser/view/BookmarkThumbImageView.java
+++ b/src/com/android/browser/view/BookmarkThumbImageView.java
@@ -38,6 +38,8 @@
 
 public class BookmarkThumbImageView extends ImageView {
 
+    private boolean mAdjustDown = true;
+
     public BookmarkThumbImageView(Context context) {
         this(context, null);
     }
@@ -50,29 +52,39 @@
         super(context, attrs, defStyleAttr);
     }
 
+    public boolean getAdjustDown() {
+        return mAdjustDown;
+    }
+
+    public void setmAdjustDown(boolean mAdjustDown) {
+        this.mAdjustDown = mAdjustDown;
+    }
+
     @Override
     public void setImageDrawable(Drawable drawable) {
-        int drawableWidth = drawable.getIntrinsicWidth();
-        int drawableHeight = drawable.getIntrinsicHeight();
-        int containerWidth = getWidth() - getPaddingLeft() - getPaddingRight();
-        int containerHeight = getHeight() - getPaddingTop() - getPaddingBottom();
+        if (mAdjustDown) {
+            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;
+            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);
             }
-            m.postTranslate(0, translateY + 0.5f);
-        }
-        m.setScale(scale, scale);
+            m.setScale(scale, scale);
 
-        this.setScaleType(ScaleType.MATRIX);
-        this.setImageMatrix(m);
+            this.setScaleType(ScaleType.MATRIX);
+            this.setImageMatrix(m);
+        }
         super.setImageDrawable(drawable);
     }
 }
