diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml
index d74e8c2..5219caa 100644
--- a/res/xml/date_time_prefs.xml
+++ b/res/xml/date_time_prefs.xml
@@ -29,32 +29,37 @@
             android:summaryOn="@string/date_time_auto_summaryOn"
             android:summaryOff="@string/date_time_auto_summaryOff"
             settings:useAdditionalSummary="true"
-            settings:restrictedSwitchSummary="@string/enabled_by_admin" />
+            settings:restrictedSwitchSummary="@string/enabled_by_admin"
+            settings:userRestriction="no_config_date_time" />
 
-        <Preference
+        <com.android.settingslib.RestrictedPreference
             android:key="date"
             android:title="@string/date_time_set_date"
-            android:summary="@string/summary_placeholder" />
+            android:summary="@string/summary_placeholder"
+            settings:userRestriction="no_config_date_time" />
 
-        <Preference
+        <com.android.settingslib.RestrictedPreference
             android:key="time"
             android:title="@string/date_time_set_time"
-            android:summary="@string/summary_placeholder" />
+            android:summary="@string/summary_placeholder"
+            settings:userRestriction="no_config_date_time" />
     </PreferenceCategory>
 
     <PreferenceCategory
         android:key="time_zone_preference_category">
-        <SwitchPreference
+        <com.android.settingslib.RestrictedSwitchPreference
             android:key="auto_zone"
             android:title="@string/zone_auto"
             android:summaryOn="@string/zone_auto_summaryOn"
-            android:summaryOff="@string/zone_auto_summaryOff" />
+            android:summaryOff="@string/zone_auto_summaryOff"
+            settings:userRestriction="no_config_date_time" />
 
-        <Preference
+        <com.android.settingslib.RestrictedPreference
             android:fragment="com.android.settings.datetime.ZonePicker"
             android:key="timezone"
             android:title="@string/date_time_set_timezone"
-            android:summary="GMT-8:00" />
+            android:summary="GMT-8:00"
+            settings:userRestriction="no_config_date_time" />
     </PreferenceCategory>
 
     <PreferenceCategory
diff --git a/src/com/android/settings/datetime/AutoTimePreferenceController.java b/src/com/android/settings/datetime/AutoTimePreferenceController.java
index 0b70f45..3da712a 100644
--- a/src/com/android/settings/datetime/AutoTimePreferenceController.java
+++ b/src/com/android/settings/datetime/AutoTimePreferenceController.java
@@ -46,8 +46,10 @@
         if (!(preference instanceof RestrictedSwitchPreference)) {
             return;
         }
-        ((RestrictedSwitchPreference) preference).setDisabledByAdmin(
-                getEnforcedAdminProperty());
+        if (!((RestrictedSwitchPreference) preference).isDisabledByAdmin()) {
+            ((RestrictedSwitchPreference) preference).setDisabledByAdmin(
+                    getEnforcedAdminProperty());
+        }
         ((RestrictedSwitchPreference) preference).setChecked(isEnabled());
     }
 
diff --git a/src/com/android/settings/datetime/DatePreferenceController.java b/src/com/android/settings/datetime/DatePreferenceController.java
index 9582e9e..d2a8686 100644
--- a/src/com/android/settings/datetime/DatePreferenceController.java
+++ b/src/com/android/settings/datetime/DatePreferenceController.java
@@ -27,6 +27,7 @@
 import android.widget.DatePicker;
 
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.Calendar;
@@ -59,9 +60,14 @@
 
     @Override
     public void updateState(Preference preference) {
+        if (!(preference instanceof RestrictedPreference)) {
+            return;
+        }
         final Calendar now = Calendar.getInstance();
         preference.setSummary(DateFormat.getLongDateFormat(mContext).format(now.getTime()));
-        preference.setEnabled(!mAutoTimePreferenceController.isEnabled());
+        if (!((RestrictedPreference) preference).isDisabledByAdmin()) {
+            preference.setEnabled(!mAutoTimePreferenceController.isEnabled());
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/datetime/TimePreferenceController.java b/src/com/android/settings/datetime/TimePreferenceController.java
index 9bb5689..684ad0c 100644
--- a/src/com/android/settings/datetime/TimePreferenceController.java
+++ b/src/com/android/settings/datetime/TimePreferenceController.java
@@ -26,6 +26,7 @@
 import android.widget.TimePicker;
 
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.Calendar;
@@ -60,9 +61,14 @@
 
     @Override
     public void updateState(Preference preference) {
+        if (!(preference instanceof RestrictedPreference)) {
+            return;
+        }
         final Calendar now = Calendar.getInstance();
         preference.setSummary(DateFormat.getTimeFormat(mContext).format(now.getTime()));
-        preference.setEnabled(!mAutoTimePreferenceController.isEnabled());
+        if (!((RestrictedPreference) preference).isDisabledByAdmin()) {
+            preference.setEnabled(!mAutoTimePreferenceController.isEnabled());
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/datetime/TimeZonePreferenceController.java b/src/com/android/settings/datetime/TimeZonePreferenceController.java
index 987132b..435b1fe 100644
--- a/src/com/android/settings/datetime/TimeZonePreferenceController.java
+++ b/src/com/android/settings/datetime/TimeZonePreferenceController.java
@@ -21,6 +21,7 @@
 import android.support.v7.preference.Preference;
 
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.datetime.ZoneGetter;
 
@@ -41,8 +42,13 @@
 
     @Override
     public void updateState(Preference preference) {
+        if (!(preference instanceof RestrictedPreference)) {
+            return;
+        }
         preference.setSummary(getTimeZoneOffsetAndName());
-        preference.setEnabled(!mAutoTimeZonePreferenceController.isEnabled());
+        if( !((RestrictedPreference) preference).isDisabledByAdmin()) {
+            preference.setEnabled(!mAutoTimeZonePreferenceController.isEnabled());
+        }
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/datetime/DatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/DatePreferenceControllerTest.java
index e6a6dd8..f1d34f8 100644
--- a/tests/robotests/src/com/android/settings/datetime/DatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/DatePreferenceControllerTest.java
@@ -22,6 +22,7 @@
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settingslib.RestrictedPreference;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -48,14 +49,15 @@
     @Mock
     private AutoTimePreferenceController mAutoTimePreferenceController;
 
-    private Preference mPreference;
+    private RestrictedPreference mPreference;
     private DatePreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         when(mContext.getSystemService(Context.ALARM_SERVICE)).thenReturn(mAlarmManager);
-        mPreference = new Preference(ShadowApplication.getInstance().getApplicationContext());
+        mPreference = new RestrictedPreference(ShadowApplication.getInstance().
+                getApplicationContext());
         mController = new DatePreferenceController(mContext, mHost, mAutoTimePreferenceController);
     }
 
@@ -72,6 +74,9 @@
 
     @Test
     public void updateState_autoTimeEnabled_shouldDisablePref() {
+        // Make sure not disabled by admin.
+        mPreference.setDisabledByAdmin(null);
+
         when(mAutoTimePreferenceController.isEnabled()).thenReturn(true);
         mController.updateState(mPreference);
 
@@ -80,6 +85,9 @@
 
     @Test
     public void updateState_autoTimeDisabled_shouldEnablePref() {
+        // Make sure not disabled by admin.
+        mPreference.setDisabledByAdmin(null);
+
         when(mAutoTimePreferenceController.isEnabled()).thenReturn(false);
         mController.updateState(mPreference);
 
diff --git a/tests/robotests/src/com/android/settings/datetime/TimePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/TimePreferenceControllerTest.java
index 15877e0..89c5f47 100644
--- a/tests/robotests/src/com/android/settings/datetime/TimePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/TimePreferenceControllerTest.java
@@ -17,10 +17,11 @@
 package com.android.settings.datetime;
 
 import android.content.Context;
-import android.support.v7.preference.Preference;
+import android.os.UserManager;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settingslib.RestrictedPreference;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -31,6 +32,7 @@
 import org.robolectric.shadows.ShadowApplication;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -46,12 +48,13 @@
     private AutoTimePreferenceController mAutoTimePreferenceController;
 
     private TimePreferenceController mController;
-    private Preference mPreference;
+    private RestrictedPreference mPreference;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mPreference = new Preference(ShadowApplication.getInstance().getApplicationContext());
+        mPreference = new RestrictedPreference(
+                ShadowApplication.getInstance().getApplicationContext());
         mController = new TimePreferenceController(mContext, mHost, mAutoTimePreferenceController);
     }
 
@@ -62,6 +65,9 @@
 
     @Test
     public void updateState_autoTimeEnabled_shouldDisablePref() {
+        // Make sure not disabled by admin.
+        mPreference.setDisabledByAdmin(null);
+
         when(mAutoTimePreferenceController.isEnabled()).thenReturn(true);
         mController.updateState(mPreference);
 
@@ -70,6 +76,9 @@
 
     @Test
     public void updateState_autoTimeDisabled_shouldEnablePref() {
+        // Make sure not disabled by admin.
+        mPreference.setDisabledByAdmin(null);
+
         when(mAutoTimePreferenceController.isEnabled()).thenReturn(false);
         mController.updateState(mPreference);
 
diff --git a/tests/robotests/src/com/android/settings/datetime/TimeZonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/TimeZonePreferenceControllerTest.java
index 2f96d65..ec26448 100644
--- a/tests/robotests/src/com/android/settings/datetime/TimeZonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/TimeZonePreferenceControllerTest.java
@@ -21,6 +21,7 @@
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settingslib.RestrictedPreference;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -41,15 +42,16 @@
 
     @Mock
     private AutoTimeZonePreferenceController mAutoTimeZonePreferenceController;
+
     private Context mContext;
     private TimeZonePreferenceController mController;
-    private Preference mPreference;
+    private RestrictedPreference mPreference;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = ShadowApplication.getInstance().getApplicationContext();
-        mPreference = new Preference(mContext);
+        mPreference = new RestrictedPreference(mContext);
         mController = spy(new TimeZonePreferenceController(mContext,
                 mAutoTimeZonePreferenceController));
     }
@@ -61,6 +63,9 @@
 
     @Test
     public void updateState_autoTimeZoneEnabled_shouldDisablePref() {
+        // Make sure not disabled by admin.
+        mPreference.setDisabledByAdmin(null);
+
         doReturn("test timezone").when(mController).getTimeZoneOffsetAndName();
         when(mAutoTimeZonePreferenceController.isEnabled()).thenReturn(true);
         mController.updateState(mPreference);
@@ -70,6 +75,9 @@
 
     @Test
     public void updateState_autoTimeZoneDisabled_shouldEnablePref() {
+        // Make sure not disabled by admin.
+        mPreference.setDisabledByAdmin(null);
+
         doReturn("test timezone").when(mController).getTimeZoneOffsetAndName();
         when(mAutoTimeZonePreferenceController.isEnabled()).thenReturn(false);
         mController.updateState(mPreference);
diff --git a/tests/unit/src/com/android/settings/core/UserRestrictionTest.java b/tests/unit/src/com/android/settings/core/UserRestrictionTest.java
new file mode 100644
index 0000000..ad00bd7
--- /dev/null
+++ b/tests/unit/src/com/android/settings/core/UserRestrictionTest.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.core;
+
+import static junit.framework.Assert.fail;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.os.UserManager;
+import android.platform.test.annotations.Presubmit;
+import android.provider.SearchIndexableResource;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+
+import com.android.settings.search.DatabaseIndexingUtils;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableResources;
+
+import com.google.android.collect.Sets;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class UserRestrictionTest {
+
+    private static final String TAG = "UserRestrictionTest";
+
+    private Context mContext;
+
+    private static final Set<String> USER_RESTRICTIONS = Sets.newHashSet(
+            UserManager.DISALLOW_CONFIG_DATE_TIME,
+            UserManager.DISALLOW_CONFIG_CREDENTIALS,
+            UserManager.DISALLOW_NETWORK_RESET,
+            UserManager.DISALLOW_FACTORY_RESET,
+            UserManager.DISALLOW_CONFIG_TETHERING,
+            UserManager.DISALLOW_CONFIG_VPN,
+            UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS
+    );
+
+    @Before
+    public void setUp() {
+        mContext = InstrumentationRegistry.getTargetContext();
+    }
+
+    /**
+     * Verity that userRestriction attributes are entered and parsed successfully.
+     */
+    @Test
+    public void userRestrictionAttributeShouldBeValid()
+            throws IOException, XmlPullParserException, Resources.NotFoundException {
+        for (Class<?> clazz : SearchIndexableResources.providerValues()) {
+            verifyUserRestriction(clazz);
+        }
+    }
+
+    private void verifyUserRestriction(Class<?> clazz)
+            throws IOException, XmlPullParserException, Resources.NotFoundException {
+        if (clazz == null) {
+            return;
+        }
+        final String className = clazz.getName();
+        final Indexable.SearchIndexProvider provider =
+                DatabaseIndexingUtils.getSearchIndexProvider(clazz);
+        final List<SearchIndexableResource> resourcesToIndex =
+                provider.getXmlResourcesToIndex(mContext, true);
+
+        if (resourcesToIndex == null) {
+            Log.d(TAG, className + "is not providing SearchIndexableResource, skipping");
+            return;
+        }
+
+        for (SearchIndexableResource sir : resourcesToIndex) {
+            if (sir.xmlResId <= 0) {
+                Log.d(TAG, className + " doesn't have a valid xml to index.");
+                continue;
+            }
+            final XmlResourceParser parser = mContext.getResources().getXml(sir.xmlResId);
+
+            int type;
+            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                    && type != XmlPullParser.START_TAG) {
+                // Parse next until start tag is found
+            }
+            final int outerDepth = parser.getDepth();
+
+            do {
+                if (type != XmlPullParser.START_TAG) {
+                    continue;
+                }
+                final String nodeName = parser.getName();
+                if (!nodeName.endsWith("Preference")) {
+                    continue;
+                }
+                final AttributeSet attrs = Xml.asAttributeSet(parser);
+                final String userRestriction = getDataUserRestrictions(mContext, attrs);
+                if (userRestriction != null) {
+                    if(!isValidRestriction(userRestriction)) {
+                        fail("userRestriction in " + className + " not valid.");
+                    }
+                }
+            } while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth));
+        }
+    }
+
+    boolean isValidRestriction(String userRestriction) {
+        return USER_RESTRICTIONS.contains(userRestriction);
+    }
+
+    private String getDataUserRestrictions(Context context, AttributeSet attrs) {
+        return getData(context, attrs,
+                com.android.settingslib.R.styleable.RestrictedPreference,
+                com.android.settingslib.R.styleable.RestrictedPreference_userRestriction);
+    }
+
+    private String getData(Context context, AttributeSet set, int[] attrs, int resId) {
+        final TypedArray ta = context.obtainStyledAttributes(set, attrs);
+        String data = ta.getString(resId);
+        ta.recycle();
+        return data;
+    }
+}
