diff --git a/src/com/android/settings/network/NetworkResetActionMenuController.java b/src/com/android/settings/network/NetworkResetActionMenuController.java
index 028ac7b..254834b 100644
--- a/src/com/android/settings/network/NetworkResetActionMenuController.java
+++ b/src/com/android/settings/network/NetworkResetActionMenuController.java
@@ -17,9 +17,6 @@
 package com.android.settings.network;
 
 import android.content.Context;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.support.annotation.VisibleForTesting;
 import android.view.Menu;
 import android.view.MenuItem;
 
@@ -27,15 +24,16 @@
 import com.android.settings.R;
 import com.android.settings.ResetNetwork;
 import com.android.settings.Utils;
-import com.android.settingslib.RestrictedLockUtils;
 
 public class NetworkResetActionMenuController {
 
     private static final int MENU_NETWORK_RESET = Menu.FIRST + 200;
     private final Context mContext;
+    private final NetworkResetRestrictionChecker mRestrictionChecker;
 
     public NetworkResetActionMenuController(Context context) {
         mContext = context;
+        mRestrictionChecker = new NetworkResetRestrictionChecker(context);
     }
 
     public void buildMenuItem(Menu menu) {
@@ -53,14 +51,8 @@
         }
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+
     boolean isAvailable() {
-        return isAvailable(mContext);
+        return !mRestrictionChecker.hasRestriction();
     }
-
-    static boolean isAvailable(Context context) {
-        return !RestrictedLockUtils.hasBaseUserRestriction(context,
-                UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId());
-    }
-
 }
diff --git a/src/com/android/settings/network/NetworkResetPreferenceController.java b/src/com/android/settings/network/NetworkResetPreferenceController.java
index 04573c9..ce36a7f 100644
--- a/src/com/android/settings/network/NetworkResetPreferenceController.java
+++ b/src/com/android/settings/network/NetworkResetPreferenceController.java
@@ -22,13 +22,16 @@
 
 public class NetworkResetPreferenceController extends PreferenceController {
 
+    private final NetworkResetRestrictionChecker mRestrictionChecker;
+
     public NetworkResetPreferenceController(Context context) {
         super(context);
+        mRestrictionChecker = new NetworkResetRestrictionChecker(context);
     }
 
     @Override
     public boolean isAvailable() {
-        return NetworkResetActionMenuController.isAvailable(mContext);
+        return !mRestrictionChecker.hasRestriction();
     }
 
     @Override
diff --git a/src/com/android/settings/network/NetworkResetRestrictionChecker.java b/src/com/android/settings/network/NetworkResetRestrictionChecker.java
new file mode 100644
index 0000000..4fe9f59
--- /dev/null
+++ b/src/com/android/settings/network/NetworkResetRestrictionChecker.java
@@ -0,0 +1,53 @@
+/*
+ * 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.network;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.support.annotation.VisibleForTesting;
+
+import com.android.settingslib.RestrictedLockUtils;
+
+public class NetworkResetRestrictionChecker {
+
+    private final Context mContext;
+    private final UserManager mUserManager;
+
+    public NetworkResetRestrictionChecker(Context context) {
+        mContext = context;
+        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    boolean hasUserBaseRestriction() {
+        return RestrictedLockUtils.hasBaseUserRestriction(mContext,
+                UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId());
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    boolean isRestrictionEnforcedByAdmin() {
+        return RestrictedLockUtils.checkIfRestrictionEnforced(
+                mContext, UserManager.DISALLOW_NETWORK_RESET, UserHandle.myUserId()) != null;
+    }
+
+    boolean hasRestriction() {
+        return !mUserManager.isAdminUser()
+                || hasUserBaseRestriction()
+                || isRestrictionEnforcedByAdmin();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java b/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java
index 7cd76d3..ee6ef69 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkResetActionMenuControllerTest.java
@@ -19,9 +19,7 @@
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -39,6 +37,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -50,19 +49,21 @@
     private Menu mMenu;
     @Mock
     private MenuItem mMenuItem;
+    @Mock
+    private NetworkResetRestrictionChecker mRestrictionChecker;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
-        mController = spy(new NetworkResetActionMenuController(mContext));
+        mController = new NetworkResetActionMenuController(mContext);
+        ReflectionHelpers.setField(mController, "mRestrictionChecker", mRestrictionChecker);
         when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
     }
 
     @Test
     public void buildMenuItem_available_shouldAddToMenu() {
-        doReturn(true).when(mController).isAvailable();
-
+        when(mRestrictionChecker.hasRestriction()).thenReturn(false);
         mController.buildMenuItem(mMenu);
 
         verify(mMenu).add(anyInt(), anyInt(), anyInt(), anyInt());
@@ -71,7 +72,7 @@
 
     @Test
     public void buildMenuItem_notAvailable_shouldNotAddToMenu() {
-        doReturn(false).when(mController).isAvailable();
+        when(mRestrictionChecker.hasRestriction()).thenReturn(true);
 
         mController.buildMenuItem(mMenu);
 
diff --git a/tests/robotests/src/com/android/settings/network/NetworkResetRestrictionCheckerTest.java b/tests/robotests/src/com/android/settings/network/NetworkResetRestrictionCheckerTest.java
new file mode 100644
index 0000000..b1c88d5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/NetworkResetRestrictionCheckerTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.network;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class NetworkResetRestrictionCheckerTest {
+
+    @Mock
+    private UserManager mUserManager;
+    @Mock
+    private Context mContext;
+    private NetworkResetRestrictionChecker mRestrictionChecker;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        mRestrictionChecker = spy(new NetworkResetRestrictionChecker(mContext));
+    }
+
+    @Test
+    public void testHasRestriction_notAdmin_shouldReturnTrue() {
+        final Context context = mock(Context.class);
+        when(context.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mUserManager.isAdminUser()).thenReturn(false);
+
+        assertThat(mRestrictionChecker.hasRestriction()).isTrue();
+    }
+
+    @Test
+    public void testHasRestriction_hasUserRestriction_shouldReturnTrue() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        doReturn(true).when(mRestrictionChecker).hasUserBaseRestriction();
+        doReturn(false).when(mRestrictionChecker).isRestrictionEnforcedByAdmin();
+
+        assertThat(mRestrictionChecker.hasRestriction()).isTrue();
+    }
+
+    @Test
+    public void testHasRestriction_hasAdminRestriction_shouldReturnTrue() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        doReturn(false).when(mRestrictionChecker).hasUserBaseRestriction();
+        doReturn(true).when(mRestrictionChecker).isRestrictionEnforcedByAdmin();
+
+        assertThat(mRestrictionChecker.hasRestriction()).isTrue();
+    }
+
+    @Test
+    public void testHasRestriction_noRestriction_shouldReturnFalse() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+        doReturn(false).when(mRestrictionChecker).hasUserBaseRestriction();
+        doReturn(false).when(mRestrictionChecker).isRestrictionEnforcedByAdmin();
+
+        assertThat(mRestrictionChecker.hasRestriction()).isFalse();
+    }
+}
