diff --git a/res/xml/general_preferences.xml b/res/xml/general_preferences.xml
index 7571a6a..75b4600 100644
--- a/res/xml/general_preferences.xml
+++ b/res/xml/general_preferences.xml
@@ -57,7 +57,7 @@
             android:summary="@string/pref_nightmode_enabled_summary"
             android:title="@string/pref_nightmode_enabled" />
 
-        <SwitchPreference
+        <com.android.browser.mdm.MdmCheckBoxPreference
             android:layout="@layout/swe_preference"
             android:key="autofill_enabled"
             android:title="@string/pref_autofill_enabled"
diff --git a/src/com/android/browser/mdm/AutoFillRestriction.java b/src/com/android/browser/mdm/AutoFillRestriction.java
new file mode 100644
index 0000000..e0e516d
--- /dev/null
+++ b/src/com/android/browser/mdm/AutoFillRestriction.java
@@ -0,0 +1,108 @@
+/*
+ * 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.SharedPreferences;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.util.Log;
+
+import com.android.browser.BrowserSettings;
+import com.android.browser.PreferenceKeys;
+
+public class AutoFillRestriction extends Restriction implements PreferenceKeys {
+
+    private final static String TAG = "AutoFillRestriction";
+
+    public static final String AUTO_FILL_RESTRICTION = "AutoFillEnabled";
+
+    private static AutoFillRestriction sInstance;
+    private MdmCheckBoxPreference mPref = null;
+
+    private AutoFillRestriction() {
+        super(TAG);
+    }
+
+    public static AutoFillRestriction getInstance() {
+        synchronized (AutoFillRestriction.class) {
+            if (sInstance == null) {
+                sInstance = new AutoFillRestriction();
+            }
+        }
+        return sInstance;
+    }
+
+    @Override
+    protected void doCustomInit() {
+    }
+
+
+    public void registerPreference (Preference pref) {
+        mPref = (MdmCheckBoxPreference) pref;
+        updatePref();
+    }
+
+    private void updatePref() {
+        if (null != mPref) {
+            if (isEnabled()) {
+                mPref.setChecked(false);
+                mPref.disablePref();
+            }
+            else {
+                mPref.setChecked(true);
+                mPref.enablePref();
+            }
+            mPref.setMdmRestrictionState(isEnabled());
+        }
+    }
+
+    /*
+     *   Note reversed logic:
+     *       [x] 'Restrict' true  = AutoFillEnabled : false   => disable Auto fill in swe
+     *       [ ] 'Restrict' false = AutoFillEnabled : true    => enable Auto fill in swe
+     */
+    @Override
+    public void enforce(Bundle restrictions) {
+        SharedPreferences.Editor editor = BrowserSettings.getInstance().getPreferences().edit();
+
+        boolean bEnable = false;
+        if (restrictions.containsKey(AUTO_FILL_RESTRICTION)) {
+            bEnable = ! restrictions.getBoolean(AUTO_FILL_RESTRICTION);
+        }
+        Log.i(TAG, "Enforce [" + bEnable + "]");
+        enable(bEnable);
+
+        editor.putBoolean(PREF_AUTOFILL_ENABLED, !isEnabled());
+        editor.apply();
+
+        updatePref();
+    }
+}
diff --git a/src/com/android/browser/mdm/DoNotTrackRestriction.java b/src/com/android/browser/mdm/DoNotTrackRestriction.java
index 94db45f..2f4a540 100644
--- a/src/com/android/browser/mdm/DoNotTrackRestriction.java
+++ b/src/com/android/browser/mdm/DoNotTrackRestriction.java
@@ -31,11 +31,9 @@
 package com.android.browser.mdm;
 
 import android.os.Bundle;
-import android.util.Log;
+import android.preference.Preference;
 
-import com.android.browser.PreferenceKeys;
-
-public class DoNotTrackRestriction extends Restriction implements PreferenceKeys {
+public class DoNotTrackRestriction extends Restriction {
 
     private final static String TAG = "DoNotTrackRestriction";
 
@@ -103,8 +101,8 @@
         return mDntValue;
     }
 
-    public void registerPreference (MdmCheckBoxPreference pref) {
-        mPref = pref;
+    public void registerPreference (Preference pref) {
+        mPref = (MdmCheckBoxPreference) pref;
         updatePref();
     }
 }
diff --git a/src/com/android/browser/mdm/tests/AutoFillRestrictionsTest.java b/src/com/android/browser/mdm/tests/AutoFillRestrictionsTest.java
new file mode 100644
index 0000000..291f6fe
--- /dev/null
+++ b/src/com/android/browser/mdm/tests/AutoFillRestrictionsTest.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.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.AutoFillRestriction;
+import com.android.browser.mdm.EditBookmarksRestriction;
+import com.android.browser.mdm.ManagedProfileManager;
+
+public class AutoFillRestrictionsTest extends ActivityInstrumentationTestCase2<BrowserActivity> {
+
+    private final static String TAG = "+++AutoFillRestTest";
+
+    private Instrumentation mInstrumentation;
+    private BrowserActivity mActivity;
+    private AutoFillRestriction autoFillRestriction;
+
+    public AutoFillRestrictionsTest() {
+        super(BrowserActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mInstrumentation = getInstrumentation();
+        mActivity = getActivity();
+        autoFillRestriction = AutoFillRestriction.getInstance();
+    }
+
+    public void test_EditBookmarksRestriction() throws Throwable {
+        Log.i(TAG, "*** Starting AutoFillTest ***");
+        clearAutoFillRestrictions();
+        assertFalse(autoFillRestriction.isEnabled());
+
+        setAutoFillRestrictions(true);
+        assertTrue(autoFillRestriction.isEnabled());
+
+        setAutoFillRestrictions(false);
+        assertFalse(autoFillRestriction.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 setAutoFillRestrictions(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(AutoFillRestriction.AUTO_FILL_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 clearAutoFillRestrictions() {
+        setAutoFillRestrictions(true, false);
+    }
+
+    private void setAutoFillRestrictions(boolean enabled) {
+        setAutoFillRestrictions(false, enabled);
+    }
+}
diff --git a/src/com/android/browser/preferences/GeneralPreferencesFragment.java b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
index 07d53b1..e9c62ac 100644
--- a/src/com/android/browser/preferences/GeneralPreferencesFragment.java
+++ b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
@@ -47,8 +47,8 @@
 import com.android.browser.R;
 import com.android.browser.UrlUtils;
 import com.android.browser.homepages.HomeProvider;
+import com.android.browser.mdm.AutoFillRestriction;
 import com.android.browser.mdm.DoNotTrackRestriction;
-import com.android.browser.mdm.MdmCheckBoxPreference;
 import com.android.browser.mdm.SearchEngineRestriction;
 
 public class GeneralPreferencesFragment extends SWEPreferenceFragment
@@ -105,10 +105,11 @@
             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);
+        // Register Preference objects with their MDM restriction handlers
+        DoNotTrackRestriction.getInstance().
+                registerPreference(findPreference(PreferenceKeys.PREF_DO_NOT_TRACK));
+        AutoFillRestriction.getInstance().
+                registerPreference(findPreference(PreferenceKeys.PREF_AUTOFILL_ENABLED));
 
         mAdvFrag = new AdvancedPreferencesFragment(this);
         //mPrivFrag = new PrivacySecurityPreferencesFragment(this);
@@ -118,9 +119,9 @@
     public void onDestroy() {
         super.onDestroy();
 
-        // Log.i("+++", "===== DESTROYING =====\n");
-        // Un-register Do-Not-Track Preference from it's MDM restriction handler
+        // Un-register Preference objects from their MDM restriction handlers
         DoNotTrackRestriction.getInstance().registerPreference(null);
+        AutoFillRestriction.getInstance().registerPreference(null);
     }
 
     @Override
