diff --git a/src/com/android/settings/RestrictedSettingsFragment.java b/src/com/android/settings/RestrictedSettingsFragment.java
index c78d6e2..3642fa6 100644
--- a/src/com/android/settings/RestrictedSettingsFragment.java
+++ b/src/com/android/settings/RestrictedSettingsFragment.java
@@ -17,6 +17,7 @@
 package com.android.settings;
 
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -24,10 +25,18 @@
 import android.content.RestrictionsManager;
 import android.os.Bundle;
 import android.os.PersistableBundle;
+import android.os.UserHandle;
 import android.os.UserManager;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.settingslib.RestrictedLockUtils;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 /**
- * Base class for settings screens that should be pin protected when in restricted mode.
+ * Base class for settings screens that should be pin protected when in restricted mode or
+ * that will display an admin support message in case an admin has disabled the options.
  * The constructor for this class will take the restriction key that this screen should be
  * locked by.  If {@link RestrictionsManager.hasRestrictionsProvider()} and
  * {@link UserManager.hasUserRestriction()}, then the user will have to enter the restrictions
@@ -37,7 +46,8 @@
  * {@link RestrictionsManager.hasRestrictionsProvider()} returns true, pass in
  * {@link RESTRICT_IF_OVERRIDABLE} to the constructor instead of a restrictions key.
  */
-public abstract class RestrictedSettingsFragment extends SettingsPreferenceFragment {
+public abstract class RestrictedSettingsFragment extends SettingsPreferenceFragment
+            implements View.OnClickListener {
 
     protected static final String RESTRICT_IF_OVERRIDABLE = "restrict_if_overridable";
 
@@ -55,6 +65,9 @@
     private RestrictionsManager mRestrictionsManager;
 
     private final String mRestrictionKey;
+    private View mAdminSupportDetails;
+    private EnforcedAdmin mEnforcedAdmin;
+    private TextView mEmptyTextView;
 
     // Receiver to clear pin status when the screen is turned off.
     private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
@@ -95,6 +108,13 @@
     }
 
     @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mAdminSupportDetails = initAdminSupportDetailsView();
+        mEmptyTextView = initEmptyTextView();
+    }
+
+    @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
 
@@ -178,6 +198,68 @@
         return restricted && mRestrictionsManager.hasRestrictionsProvider();
     }
 
+    protected View initAdminSupportDetailsView() {
+        return null;
+    }
+
+    protected TextView initEmptyTextView() {
+        return null;
+    }
+
+    private void updateAdminSupportDetailsView() {
+        mEnforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(getActivity(),
+                mRestrictionKey, UserHandle.myUserId());
+        if (mEnforcedAdmin != null) {
+            final Activity activity = getActivity();
+            DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(
+                    Context.DEVICE_POLICY_SERVICE);
+            if (mEnforcedAdmin.userId == UserHandle.USER_NULL) {
+                mEnforcedAdmin.userId = UserHandle.myUserId();
+            }
+            CharSequence supportMessage = dpm.getShortSupportMessageForUser(
+                    mEnforcedAdmin.component, mEnforcedAdmin.userId);
+            if (supportMessage != null) {
+                TextView textView = (TextView) activity.findViewById(R.id.admin_support_msg);
+                textView.setText(supportMessage);
+            }
+            activity.findViewById(R.id.admins_policies_list).setOnClickListener(this);
+        }
+    }
+
+    @Override
+    public void onClick(View view) {
+        Intent intent = new Intent();
+        if (view.getId() == R.id.admins_policies_list && mEnforcedAdmin != null) {
+            if (mEnforcedAdmin.component != null) {
+                intent.setClass(getActivity(), DeviceAdminAdd.class);
+                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mEnforcedAdmin.component);
+                // DeviceAdminAdd class may need to run as managed profile.
+                getActivity().startActivityAsUser(intent, UserHandle.of(mEnforcedAdmin.userId));
+            } else {
+                intent.setClass(getActivity(), Settings.DeviceAdminSettingsActivity.class);
+                // Activity merges both managed profile and parent users
+                // admins so show as same user as this activity.
+                getActivity().startActivity(intent);
+            }
+        }
+    }
+
+    public TextView getEmptyTextView() {
+        return mEmptyTextView;
+    }
+
+    @Override
+    protected void onDataSetChanged() {
+        highlightPreferenceIfNeeded();
+        if (mAdminSupportDetails != null && isUiRestricted()) {
+            updateAdminSupportDetailsView();
+            setEmptyView(mAdminSupportDetails);
+        } else if (mEmptyTextView != null) {
+            setEmptyView(mEmptyTextView);
+        }
+        super.onDataSetChanged();
+    }
+
     /**
      * Returns whether restricted or actionable UI elements should be removed or disabled.
      */
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 4f81a38..d8b9b91 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -176,13 +176,6 @@
         unregisterObserverIfNeeded();
     }
 
-    @Override
-    public void onStop() {
-        super.onStop();
-
-        unregisterObserverIfNeeded();
-    }
-
     public void showLoadingWhenEmpty() {
         View loading = getView().findViewById(R.id.loading_container);
         setEmptyView(loading);
@@ -220,7 +213,7 @@
         }
     }
 
-    private void onDataSetChanged() {
+    protected void onDataSetChanged() {
         highlightPreferenceIfNeeded();
         updateEmptyView();
     }
@@ -290,6 +283,9 @@
     }
 
     public void setEmptyView(View v) {
+        if (mEmptyView != null) {
+            mEmptyView.setVisibility(View.GONE);
+        }
         mEmptyView = v;
         updateEmptyView();
     }
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index eac89b1..f71dd0a 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -87,7 +87,6 @@
     private boolean mInitialScanStarted;
     private boolean mInitiateDiscoverable;
 
-    private TextView mEmptyView;
     private SwitchBar mSwitchBar;
 
     private final IntentFilter mIntentFilter;
@@ -136,10 +135,6 @@
         mInitialScanStarted = false;
         mInitiateDiscoverable = true;
 
-        mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
-        setEmptyView(mEmptyView);
-        mEmptyView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
-
         final SettingsActivity activity = (SettingsActivity) getActivity();
         mSwitchBar = activity.getSwitchBar();
 
@@ -175,7 +170,6 @@
         if (isUiRestricted()) {
             setDeviceListGroup(getPreferenceScreen());
             removeAllDevices();
-            mEmptyView.setText(R.string.bluetooth_empty_list_user_restricted);
             return;
         }
 
@@ -298,7 +292,6 @@
                 mDevicePreferenceMap.clear();
 
                 if (isUiRestricted()) {
-                    messageId = R.string.bluetooth_empty_list_user_restricted;
                     break;
                 }
 
@@ -360,7 +353,7 @@
             case BluetoothAdapter.STATE_OFF:
                 setOffMessage();
                 if (isUiRestricted()) {
-                    messageId = R.string.bluetooth_empty_list_user_restricted;
+                    messageId = 0;
                 }
                 break;
 
@@ -373,15 +366,28 @@
         setDeviceListGroup(preferenceScreen);
         removeAllDevices();
         if (messageId != 0) {
-            mEmptyView.setText(messageId);
+            getEmptyTextView().setText(messageId);
         }
         if (!isUiRestricted()) {
             getActivity().invalidateOptionsMenu();
         }
     }
 
+    @Override
+    protected TextView initEmptyTextView() {
+        TextView textView = (TextView) getView().findViewById(android.R.id.empty);
+        textView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
+        return textView;
+    }
+
+    @Override
+    protected View initAdminSupportDetailsView() {
+        return getActivity().findViewById(R.id.admin_support_details);
+    }
+
     private void setOffMessage() {
-        if (mEmptyView == null) {
+        final TextView emptyView = getEmptyTextView();
+        if (emptyView == null) {
             return;
         }
         final CharSequence briefText = getText(R.string.bluetooth_empty_list_bluetooth_off);
@@ -392,13 +398,13 @@
 
         if (!bleScanningMode) {
             // Show only the brief text if the scanning mode has been turned off.
-            mEmptyView.setText(briefText, TextView.BufferType.SPANNABLE);
+            emptyView.setText(briefText, TextView.BufferType.SPANNABLE);
         } else {
             final StringBuilder contentBuilder = new StringBuilder();
             contentBuilder.append(briefText);
             contentBuilder.append("\n\n");
             contentBuilder.append(getText(R.string.ble_scan_notify_text));
-            LinkifyUtils.linkify(mEmptyView, contentBuilder, new LinkifyUtils.OnClickListener() {
+            LinkifyUtils.linkify(emptyView, contentBuilder, new LinkifyUtils.OnClickListener() {
                 @Override
                 public void onClick() {
                     final SettingsActivity activity =
@@ -409,7 +415,7 @@
             });
         }
         getPreferenceScreen().removeAll();
-        Spannable boldSpan = (Spannable) mEmptyView.getText();
+        Spannable boldSpan = (Spannable) emptyView.getText();
         boldSpan.setSpan(
                 new TextAppearanceSpan(getActivity(), android.R.style.TextAppearance_Medium), 0,
                 briefText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 403d12a..8be0e79 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -131,7 +131,6 @@
     private WifiDialog mDialog;
     private WriteWifiConfigToNfcDialog mWifiToNfcDialog;
 
-    private TextView mEmptyView;
     private ProgressBar mProgressHeader;
 
     // this boolean extra specifies whether to disable the Next button when not connected. Used by
@@ -280,7 +279,6 @@
             }
         }
 
-        mEmptyView = initEmptyView();
         registerForContextMenu(getListView());
         setHasOptionsMenu(true);
 
@@ -628,9 +626,8 @@
     public void onAccessPointsChanged() {
         // Safeguard from some delayed event handling
         if (getActivity() == null) return;
-
         if (isUiRestricted()) {
-            addMessagePreference(R.string.wifi_empty_list_user_restricted);
+            getPreferenceScreen().removeAll();
             return;
         }
         final int wifiState = mWifiManager.getWifiState();
@@ -708,15 +705,26 @@
         }
     }
 
-    protected TextView initEmptyView() {
+    @Override
+    protected TextView initEmptyTextView() {
         TextView emptyView = (TextView) getActivity().findViewById(android.R.id.empty);
         emptyView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
-        setEmptyView(emptyView);
         return emptyView;
     }
 
+    @Override
+    protected View initAdminSupportDetailsView() {
+        return getActivity().findViewById(R.id.admin_support_details);
+    }
+
     private void setOffMessage() {
-        if (mEmptyView == null) {
+        if (isUiRestricted()) {
+            getPreferenceScreen().removeAll();
+            return;
+        }
+
+        TextView emptyTextView = getEmptyTextView();
+        if (emptyTextView == null) {
             return;
         }
 
@@ -729,17 +737,17 @@
         final boolean wifiScanningMode = Settings.Global.getInt(
                 resolver, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1;
 
-        if (isUiRestricted() || !wifiScanningMode) {
+        if (!wifiScanningMode) {
             // Show only the brief text if the user is not allowed to configure scanning settings,
             // or the scanning mode has been turned off.
-            mEmptyView.setText(briefText, BufferType.SPANNABLE);
+            emptyTextView.setText(briefText, BufferType.SPANNABLE);
         } else {
             // Append the description of scanning settings with link.
             final StringBuilder contentBuilder = new StringBuilder();
             contentBuilder.append(briefText);
             contentBuilder.append("\n\n");
             contentBuilder.append(getText(R.string.wifi_scan_notify_text));
-            LinkifyUtils.linkify(mEmptyView, contentBuilder, new LinkifyUtils.OnClickListener() {
+            LinkifyUtils.linkify(emptyTextView, contentBuilder, new LinkifyUtils.OnClickListener() {
                 @Override
                 public void onClick() {
                     final SettingsActivity activity =
@@ -750,7 +758,7 @@
             });
         }
         // Embolden and enlarge the brief description anyway.
-        Spannable boldSpan = (Spannable) mEmptyView.getText();
+        Spannable boldSpan = (Spannable) emptyTextView.getText();
         boldSpan.setSpan(
                 new TextAppearanceSpan(getActivity(), android.R.style.TextAppearance_Medium), 0,
                 briefText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -758,7 +766,8 @@
     }
 
     private void addMessagePreference(int messageId) {
-        if (mEmptyView != null) mEmptyView.setText(messageId);
+        TextView emptyTextView = getEmptyTextView();
+        if (emptyTextView != null) emptyTextView.setText(messageId);
         getPreferenceScreen().removeAll();
     }
 
diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
index 096847d..2f35478 100644
--- a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
+++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
@@ -144,7 +144,7 @@
     }
 
     @Override
-    protected TextView initEmptyView() {
+    protected TextView initEmptyTextView() {
         final LayoutInflater inflater = LayoutInflater.from(getActivity());
         mEmptyFooter = (TextView) inflater.inflate(R.layout.setup_wifi_empty, getListView(), false);
         return mEmptyFooter;
