diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 3d35bc8..56c53d3 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -316,10 +316,11 @@
         }
 
         private String getKeyForCurrent() {
-            if (mLockPatternUtils.isLockScreenDisabled(mUserId)) {
+            final int credentialOwner = mUserManager.getCredentialOwnerProfile(mUserId);
+            if (mLockPatternUtils.isLockScreenDisabled(credentialOwner)) {
                 return KEY_UNLOCK_SET_OFF;
             }
-            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
+            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(credentialOwner)) {
                 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
                     return KEY_UNLOCK_SET_PATTERN;
                 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
@@ -521,6 +522,7 @@
             }
 
             if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
+                mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true);
                 mChooseLockSettingsHelper.utils().clearLock(mUserId);
                 mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
                 mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, false);
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index a1d9750..b0a685c 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -203,6 +203,7 @@
     private static final int RESULT_MOCK_LOCATION_APP = 1001;
 
     private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
+    private static final String FLASH_LOCKED_PROP = "ro.boot.flash.locked";
 
     private static final int REQUEST_CODE_ENABLE_OEM_UNLOCK = 0;
 
@@ -703,6 +704,7 @@
         updateForceResizableOptions();
         updateEnableFreeformWindowsSupportOptions();
         updateWebViewProviderOptions();
+        updateOemUnlockOptions();
         if (mColorTemperaturePreference != null) {
             updateColorTemperature();
         }
@@ -967,6 +969,17 @@
         return !SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals("");
     }
 
+    private static boolean enableOemUnlockPreference() {
+        String flashLocked = SystemProperties.get(FLASH_LOCKED_PROP);
+        return !"0".equals(flashLocked);
+    }
+
+    private void updateOemUnlockOptions() {
+        if (mEnableOemUnlock != null) {
+            mEnableOemUnlock.setEnabled(enableOemUnlockPreference());
+        }
+    }
+
     private void updateBugreportOptions() {
         mBugreport.setEnabled(true);
         mBugreportInPower.setEnabled(true);
diff --git a/src/com/android/settings/ProfileChallengePreferenceFragment.java b/src/com/android/settings/ProfileChallengePreferenceFragment.java
index 4e3fcfd..676f61f 100644
--- a/src/com/android/settings/ProfileChallengePreferenceFragment.java
+++ b/src/com/android/settings/ProfileChallengePreferenceFragment.java
@@ -128,12 +128,16 @@
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if (requestCode == UNIFY_LOCK_METHOD_REQUEST && resultCode == Activity.RESULT_OK) {
-            mLockPatternUtils.clearLock(mProfileUserId);
-            mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileUserId, false);
+            unifyLocks();
             return;
         }
     }
 
+    private void unifyLocks() {
+        mLockPatternUtils.clearLock(mProfileUserId);
+        mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileUserId, false);
+    }
+
     @Override
     public void onResume() {
         super.onResume();
@@ -260,6 +264,8 @@
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             final Bundle args = getArguments();
+            final ProfileChallengePreferenceFragment parentFragment =
+                    ((ProfileChallengePreferenceFragment) getParentFragment());
             return new AlertDialog.Builder(getActivity())
                     .setTitle(R.string.lock_settings_profile_unification_dialog_title)
                     .setMessage(R.string.lock_settings_profile_unification_dialog_body)
@@ -271,9 +277,13 @@
                                             R.string.lock_settings_profile_screen_lock_title);
                                     ChooseLockSettingsHelper helper =
                                             new ChooseLockSettingsHelper(
-                                                    getActivity(), getParentFragment());
-                                    helper.launchConfirmationActivity(UNIFY_LOCK_METHOD_REQUEST,
-                                            title, true, args.getInt(ARG_USER_ID));
+                                                    getActivity(), parentFragment);
+                                    if (!helper.launchConfirmationActivity(
+                                            UNIFY_LOCK_METHOD_REQUEST,
+                                            title, true, args.getInt(ARG_USER_ID))) {
+                                        parentFragment.unifyLocks();
+                                        parentFragment.createPreferenceHierarchy();
+                                    }
                                 }
                             }
                     )
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index 65e0217..f9c9ba6 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -77,6 +77,9 @@
         addPreferencesFromResource(R.xml.data_usage);
 
         int defaultSubId = getDefaultSubscriptionId(getContext());
+        if (defaultSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            hasMobileData = false;
+        }
         mDefaultTemplate = getDefaultTemplate(getContext(), defaultSubId);
         if (hasMobileData) {
             mLimitPreference = findPreference(KEY_LIMIT_SUMMARY);
@@ -279,7 +282,7 @@
     }
 
     public static NetworkTemplate getDefaultTemplate(Context context, int defaultSubId) {
-        if (hasMobileData(context)) {
+        if (hasMobileData(context) && defaultSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
             TelephonyManager telephonyManager = TelephonyManager.from(context);
             NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll(
                     telephonyManager.getSubscriberId(defaultSubId));
