diff --git a/src/com/android/settings/GearPreference.java b/src/com/android/settings/GearPreference.java
index 30f9a68..0f303d3 100644
--- a/src/com/android/settings/GearPreference.java
+++ b/src/com/android/settings/GearPreference.java
@@ -17,15 +17,16 @@
 package com.android.settings;
 
 import android.content.Context;
-import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.util.AttributeSet;
 import android.view.View;
 
+import com.android.settingslib.RestrictedPreference;
+
 /**
  * A preference with a Gear on the side
  */
-public class GearPreference extends Preference implements View.OnClickListener {
+public class GearPreference extends RestrictedPreference implements View.OnClickListener {
 
     private OnGearClickListener mOnGearClickListener;
 
@@ -42,7 +43,9 @@
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
-        holder.findViewById(R.id.settings_button).setOnClickListener(this);
+        final View gear = holder.findViewById(R.id.settings_button);
+        gear.setOnClickListener(this);
+        gear.setEnabled(true);  // Make gear available even if the preference itself is disabled.
     }
 
     @Override
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index ccc158f..2f21e29 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -228,6 +228,15 @@
         final int resid = getResIdForLockUnlockScreen(getActivity(), mLockPatternUtils, MY_USER_ID);
         addPreferencesFromResource(resid);
 
+        final EnforcedAdmin admin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
+                getActivity(), MY_USER_ID);
+        if (admin != null && mDPM.getPasswordQuality(admin.component) ==
+                DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
+            final GearPreference unlockSetOrChangePref =
+                    (GearPreference) getPreferenceScreen().findPreference(KEY_UNLOCK_SET_OR_CHANGE);
+            unlockSetOrChangePref.setDisabledByAdmin(admin);
+        }
+
         mProfileChallengeUserId = Utils.getManagedProfileId(mUm, MY_USER_ID);
         if (mProfileChallengeUserId != UserHandle.USER_NULL
                 && mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId)) {
@@ -742,59 +751,58 @@
         @Override
         public List<SearchIndexableResource> getXmlResourcesToIndex(
                 Context context, boolean enabled) {
+            final List<SearchIndexableResource> index = new ArrayList<SearchIndexableResource>();
 
-            List<SearchIndexableResource> result = new ArrayList<SearchIndexableResource>();
-
-            LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
-            // Add options for lock/unlock screen
-            int resId = getResIdForLockUnlockScreen(context, lockPatternUtils, MY_USER_ID);
-
-            SearchIndexableResource sir = new SearchIndexableResource(context);
-            sir.xmlResId = resId;
-            result.add(sir);
-
+            final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
+            final EnforcedAdmin admin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
+                    context, MY_USER_ID);
+            final DevicePolicyManager dpm = (DevicePolicyManager)
+                    context.getSystemService(Context.DEVICE_POLICY_SERVICE);
             final UserManager um = UserManager.get(context);
+
+            if (admin == null || dpm.getPasswordQuality(admin.component) !=
+                    DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
+                // Add options for lock/unlock screen
+                final int resId = getResIdForLockUnlockScreen(context, lockPatternUtils,
+                        MY_USER_ID);
+                index.add(getSearchResource(context, resId));
+            }
+
             final int profileUserId = Utils.getManagedProfileId(um, MY_USER_ID);
             if (profileUserId != UserHandle.USER_NULL
                     && lockPatternUtils.isSeparateProfileChallengeAllowed(profileUserId)) {
-                sir = new SearchIndexableResource(context);
-                sir.xmlResId = getResIdForLockUnlockScreen(
-                        context, lockPatternUtils, profileUserId);
-                result.add(sir);
+                index.add(getSearchResource(context, getResIdForLockUnlockScreen(context,
+                        lockPatternUtils, profileUserId)));
             }
 
             if (um.isAdminUser()) {
-                DevicePolicyManager dpm = (DevicePolicyManager)
-                        context.getSystemService(Context.DEVICE_POLICY_SERVICE);
-
                 switch (dpm.getStorageEncryptionStatus()) {
                     case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
                         // The device is currently encrypted.
-                        resId = R.xml.security_settings_encrypted;
+                        index.add(getSearchResource(context, R.xml.security_settings_encrypted));
                         break;
                     case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
                         // This device supports encryption but isn't encrypted.
-                        resId = R.xml.security_settings_unencrypted;
+                        index.add(getSearchResource(context, R.xml.security_settings_unencrypted));
                         break;
                 }
-
-                sir = new SearchIndexableResource(context);
-                sir.xmlResId = resId;
-                result.add(sir);
             }
 
-            sir = new SearchIndexableResource(context);
-            sir.xmlResId = SecuritySubSettings.getResIdForLockUnlockSubScreen(context,
-                    lockPatternUtils);
+            final SearchIndexableResource sir = getSearchResource(context,
+                    SecuritySubSettings.getResIdForLockUnlockSubScreen(context, lockPatternUtils));
             sir.className = SecuritySubSettings.class.getName();
-            result.add(sir);
+            index.add(sir);
 
             // Append the rest of the settings
-            sir = new SearchIndexableResource(context);
-            sir.xmlResId = R.xml.security_settings_misc;
-            result.add(sir);
+            index.add(getSearchResource(context, R.xml.security_settings_misc));
 
-            return result;
+            return index;
+        }
+
+        private SearchIndexableResource getSearchResource(Context context, int xmlResId) {
+            final SearchIndexableResource sir = new SearchIndexableResource(context);
+            sir.xmlResId = xmlResId;
+            return sir;
         }
 
         @Override
