diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 864315a..8cd2a08 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -32,6 +32,7 @@
 
 import com.android.browser.R;
 import com.android.browser.homepages.HomeProvider;
+import com.android.browser.mdm.DoNotTrackRestriction;
 import com.android.browser.mdm.ProxyRestriction;
 import com.android.browser.mdm.SearchEngineRestriction;
 import com.android.browser.platformsupport.Browser;
@@ -896,7 +897,14 @@
     }
 
     public boolean doNotTrack() {
-        return mPrefs.getBoolean(PREF_DO_NOT_TRACK, true);
+        boolean dntVal;
+        if (DoNotTrackRestriction.getInstance().isEnabled()) {
+            dntVal = DoNotTrackRestriction.getInstance().getValue();
+        }
+        else {
+            dntVal = mPrefs.getBoolean(PREF_DO_NOT_TRACK, true);
+        }
+        return dntVal;
     }
 
     public boolean acceptCookies() {
diff --git a/src/com/android/browser/mdm/DoNotTrackRestriction.java b/src/com/android/browser/mdm/DoNotTrackRestriction.java
new file mode 100644
index 0000000..e69fe16
--- /dev/null
+++ b/src/com/android/browser/mdm/DoNotTrackRestriction.java
@@ -0,0 +1,110 @@
+/*
+ * 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.os.Bundle;
+import android.util.Log;
+
+import com.android.browser.PreferenceKeys;
+
+public class DoNotTrackRestriction extends Restriction implements PreferenceKeys {
+
+    private final static String TAG = "DoNotTrackRestriction";
+
+    public static final String DO_NOT_TRACK_ENABLED = "DoNotTrackEnabled"; // boolean
+    public static final String DO_NOT_TRACK_VALUE   = "DoNotTrackValue";   // boolean
+
+    private static DoNotTrackRestriction sInstance;
+    private boolean mDntValue;
+
+    private MdmCheckBoxPreference mPref = null;
+
+    private DoNotTrackRestriction() {
+        super();
+    }
+
+    public static DoNotTrackRestriction getInstance() {
+        synchronized (DoNotTrackRestriction.class) {
+            if (sInstance == null) {
+                sInstance = new DoNotTrackRestriction();
+            }
+        }
+        return sInstance;
+    }
+
+    @Override
+    public void enforce(Bundle restrictions) {
+        // Possible states
+        //   DNT_enabled  DNT_value  |  menu-item-enabled      check-box-value
+        //   -----------------------------------------------------------------
+        //     not set       x       |        Yes              curr-sys-value
+        //       0           x       |        Yes              curr-sys-value
+        //       1           0       |        No                   0
+        //       1           1       |        No                   1
+
+        boolean dntEnabled = restrictions.getBoolean(DO_NOT_TRACK_ENABLED,false);
+        if (dntEnabled) {
+            mDntValue = restrictions.getBoolean(DO_NOT_TRACK_VALUE, true); // default to true
+
+            // enable the restriction : controls enable of the menu item
+            // Log.i(TAG, "DNT Restriction enabled. new val [" + mDntValue + "]");
+            enable(true);
+        }
+        else {
+            enable(false);
+        }
+
+        // Real time update of the Preference if it is registered
+        updatePref();
+    }
+
+    private void updatePref() {
+        if (null != mPref) {
+            if (isEnabled()) {
+                mPref.setChecked(getValue());
+                mPref.disablePref();
+            }
+            else {
+                mPref.enablePref();
+            }
+            mPref.setMdmRestrictionState(isEnabled());
+        }
+    }
+
+    public boolean getValue() {
+        return mDntValue;
+    }
+
+    public void registerPreference (MdmCheckBoxPreference pref) {
+        mPref = pref;
+        updatePref();
+    }
+}
diff --git a/src/com/android/browser/mdm/MdmCheckBoxPreference.java b/src/com/android/browser/mdm/MdmCheckBoxPreference.java
new file mode 100644
index 0000000..c235d52
--- /dev/null
+++ b/src/com/android/browser/mdm/MdmCheckBoxPreference.java
@@ -0,0 +1,128 @@
+/*
+ * 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.Context;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.util.AttributeSet;
+//import android.util.Log;
+import android.view.View;
+import android.widget.Toast;
+
+import com.android.browser.R;
+
+public class MdmCheckBoxPreference extends CheckBoxPreference {
+
+    View mView = null;
+    OnPreferenceClickListener mOrigClickListener = null;
+    boolean mMdmRestrictionState;
+    private boolean mPrefEnabled = true;
+
+    public MdmCheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public MdmCheckBoxPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    public MdmCheckBoxPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MdmCheckBoxPreference(Context context) {
+        super(context);
+    }
+
+    public void setMdmRestrictionState(boolean val) {
+        // Log.i("+++", "setMdmRestrictionState(" + val + ")");
+        mMdmRestrictionState = val;
+    }
+
+    public void disablePref() {
+        // Log.i("+++", "disablePref(): mView[" +
+        //        (mView != null ? "OK" : "Null") +
+        //        "]  mPrefEnabled[" + mPrefEnabled + "]");
+
+        if (null != mView && mPrefEnabled == true) {
+            // Set the onClick listener that will present the toast message to the user
+            mOrigClickListener = getOnPreferenceClickListener();
+
+            // Log.i("+++", "Setting toast");
+            setOnPreferenceClickListener( new OnPreferenceClickListener() {
+                @Override
+                public boolean onPreferenceClick(Preference preference) {
+                    Toast.makeText(getContext(), R.string.mdm_managed_alert, Toast.LENGTH_SHORT).show();
+                    return true;
+                }
+            });
+
+            // Prevent clicks from registering. We can't use setEnable() because
+            // we need the click to trigger the toast message.
+            setOnPreferenceChangeListener( new OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    return false; // Do Not update
+                }
+            });
+
+            // Dim the view. setEnable usually does this for us, but we can't
+            // use it here.
+            mView.setAlpha((float) 0.5);
+            mPrefEnabled = false;
+
+        }
+    }
+
+    public void enablePref () {
+        // Log.i("+++", "enablePref(): mView[" +
+        //        (mView != null ? "OK" : "Null") +
+        //        "]  mPrefEnabled[" + mPrefEnabled + "]");
+
+        if (null != mView && mPrefEnabled == false) {
+            setOnPreferenceClickListener(mOrigClickListener);
+            setOnPreferenceChangeListener(null);
+            mView.setAlpha((float) 1.0);
+            mPrefEnabled = true;
+        }
+    }
+
+    @Override
+	protected void onBindView(View view) {
+        // Log.i("+++", "onBindView() : rs[" + mMdmRestrictionState + "]");
+        super.onBindView(view);
+
+        mView = view;
+        if (mMdmRestrictionState) {
+            disablePref();
+        }
+    }
+}
diff --git a/src/com/android/browser/mdm/tests/DNTRestrictionsTest.java b/src/com/android/browser/mdm/tests/DNTRestrictionsTest.java
new file mode 100644
index 0000000..5778fe3
--- /dev/null
+++ b/src/com/android/browser/mdm/tests/DNTRestrictionsTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.PreferenceKeys;
+import com.android.browser.mdm.DoNotTrackRestriction;
+import com.android.browser.mdm.ManagedProfileManager;
+
+public class DNTRestrictionsTest extends ActivityInstrumentationTestCase2<BrowserActivity>
+        implements PreferenceKeys {
+
+    private final static String TAG = "DNTRestrictionsTest";
+
+    private Instrumentation mInstrumentation;
+    private BrowserActivity mActivity;
+    private DoNotTrackRestriction mDNTRestriction;
+
+    public DNTRestrictionsTest() {
+        super(BrowserActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mInstrumentation = getInstrumentation();
+        mActivity = getActivity();
+        mDNTRestriction = DoNotTrackRestriction.getInstance();
+    }
+
+    // Possible states
+    //   DNT_enabled  DNT_value  |  menu-item-enabled      check-box-value
+    //   -----------------------------------------------------------------
+    //     not set       x       |        Yes              curr-sys-value
+    //       0           x       |        Yes              curr-sys-value
+    //       1           0       |        No                   0
+    //       1           1       |        No                   1
+    public void test_DNT() throws Throwable {
+        Log.i(TAG,"!!! ******** Starting DNT Tests *************");
+
+        clearDNTRestrictions();
+        assertFalse(mDNTRestriction.isEnabled());
+
+        setDNTRestrictions(false, true);
+        assertFalse(mDNTRestriction.isEnabled());
+
+        setDNTRestrictions(true, false);
+        assertTrue(mDNTRestriction.isEnabled());
+        assertFalse(mDNTRestriction.getValue());
+
+        setDNTRestrictions(true, true);
+        assertTrue(mDNTRestriction.isEnabled());
+        assertTrue(mDNTRestriction.getValue());
+    }
+
+    /**
+     * Activate DoNotTrack restriction
+     * @param clear  boolean. if true, clears the restriction by sending an empty bundle. In
+     *               this case, the other args are ignored.
+     *
+     * @param enable boolean. Set the state of the restriction.
+     *
+     * @param value boolean. Set the state of Do Not Track if enabled is set to true.
+     *              we still bundle it, but it should be ignored by the handler.
+     */
+    private void setDNTRestrictions(boolean clear, boolean enable, boolean value) {
+        // Construct restriction bundle
+        final Bundle restrictions = new Bundle();
+
+        if(!clear) {
+            restrictions.putBoolean(DoNotTrackRestriction.DO_NOT_TRACK_ENABLED,enable);
+            restrictions.putBoolean(DoNotTrackRestriction.DO_NOT_TRACK_VALUE, value);
+        }
+
+        // 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 setDNTRestrictions (boolean enable, boolean value) {
+        setDNTRestrictions(false, enable, value);
+    }
+
+    private void clearDNTRestrictions() {
+        setDNTRestrictions(true, false, false);
+    }
+}
diff --git a/src/com/android/browser/preferences/GeneralPreferencesFragment.java b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
index 8ab79a3..0629115 100644
--- a/src/com/android/browser/preferences/GeneralPreferencesFragment.java
+++ b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
@@ -48,6 +48,8 @@
 import com.android.browser.R;
 import com.android.browser.UrlUtils;
 import com.android.browser.homepages.HomeProvider;
+import com.android.browser.mdm.DoNotTrackRestriction;
+import com.android.browser.mdm.MdmCheckBoxPreference;
 import com.android.browser.mdm.SearchEngineRestriction;
 
 public class GeneralPreferencesFragment extends PreferenceFragment
@@ -104,11 +106,25 @@
             findPreference("search_engine").setEnabled(false);
         }
 
+        // Register Do-Not-Track Preference with it's MDM restriction handler
+        // Log.i("+++", "\n===== REGISTERING =====");
+        MdmCheckBoxPreference dntPref = (MdmCheckBoxPreference) findPreference(PreferenceKeys.PREF_DO_NOT_TRACK);
+        DoNotTrackRestriction.getInstance().registerPreference(dntPref);
+
         mAdvFrag = new AdvancedPreferencesFragment(this);
         mPrivFrag = new PrivacySecurityPreferencesFragment(this);
     }
 
     @Override
+    public void onDestroy() {
+        super.onDestroy();
+
+        // Log.i("+++", "===== DESTROYING =====\n");
+        // Un-register Do-Not-Track Preference from it's MDM restriction handler
+        DoNotTrackRestriction.getInstance().registerPreference(null);
+    }
+
+    @Override
     public boolean onPreferenceChange(Preference pref, Object objValue) {
         if (getActivity() == null) {
             // We aren't attached, so don't accept preferences changes from the
