diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java
index 153a1aa..7a85dbe 100644
--- a/src/com/android/settings/MasterClearConfirm.java
+++ b/src/com/android/settings/MasterClearConfirm.java
@@ -25,6 +25,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
+import android.service.oemlock.OemLockManager;
 import android.service.persistentdata.PersistentDataBlockManager;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -67,12 +68,14 @@
 
             final PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)
                     getActivity().getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
+            final OemLockManager oemLockManager = (OemLockManager)
+                    getActivity().getSystemService(Context.OEM_LOCK_SERVICE);
 
-            if (pdbManager != null && !pdbManager.getOemUnlockEnabled() &&
+            if (pdbManager != null && !oemLockManager.isOemUnlockAllowed() &&
                     Utils.isDeviceProvisioned(getActivity())) {
-                // if OEM unlock is enabled, this will be wiped during FR process. If disabled, it
-                // will be wiped here, unless the device is still being provisioned, in which case
-                // the persistent data block will be preserved.
+                // if OEM unlock is allowed, the persistent data block will be wiped during FR
+                // process. If disabled, it will be wiped here, unless the device is still being
+                // provisioned, in which case the persistent data block will be preserved.
                 new AsyncTask<Void, Void, Void>() {
                     int mOldOrientation;
                     ProgressDialog mProgressDialog;
diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java
index bfb9f0f..376005c 100644
--- a/src/com/android/settings/development/DevelopmentSettings.java
+++ b/src/com/android/settings/development/DevelopmentSettings.java
@@ -59,7 +59,7 @@
 import android.os.storage.IStorageManager;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
-import android.service.persistentdata.PersistentDataBlockManager;
+import android.service.oemlock.OemLockManager;
 import android.support.annotation.VisibleForTesting;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.ListPreference;
@@ -238,7 +238,6 @@
     private static final int RESULT_DEBUG_APP = 1000;
     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 String SHORTCUT_MANAGER_RESET_KEY = "reset_shortcut_manager_throttling";
@@ -252,7 +251,7 @@
     private IWebViewUpdateService mWebViewUpdateService;
     private UserManager mUm;
     private WifiManager mWifiManager;
-    private PersistentDataBlockManager mOemUnlockManager;
+    private OemLockManager mOemLockManager;
     private TelephonyManager mTelephonyManager;
 
     private SwitchBar mSwitchBar;
@@ -383,8 +382,7 @@
         mBackupManager = IBackupManager.Stub.asInterface(
                 ServiceManager.getService(Context.BACKUP_SERVICE));
         mWebViewUpdateService = WebViewFactory.getUpdateService();
-        mOemUnlockManager = (PersistentDataBlockManager) getActivity()
-                .getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
+        mOemLockManager = (OemLockManager) getSystemService(Context.OEM_LOCK_SERVICE);
         mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
 
         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
@@ -431,7 +429,7 @@
         mKeepScreenOn = (RestrictedSwitchPreference) findAndInitSwitchPref(KEEP_SCREEN_ON);
         mBtHciSnoopLog = findAndInitSwitchPref(BT_HCI_SNOOP_LOG);
         mEnableOemUnlock = (RestrictedSwitchPreference) findAndInitSwitchPref(ENABLE_OEM_UNLOCK);
-        if (!showEnableOemUnlockPreference()) {
+        if (!showEnableOemUnlockPreference(getActivity())) {
             removePreference(mEnableOemUnlock);
             mEnableOemUnlock = null;
         }
@@ -1070,18 +1068,17 @@
                 Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0;
     }
 
-    private static boolean showEnableOemUnlockPreference() {
-        return !SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals("");
+    private static boolean showEnableOemUnlockPreference(Context context) {
+        return context.getSystemService(Context.OEM_LOCK_SERVICE) != null;
     }
 
     private boolean enableOemUnlockPreference() {
-        return !isBootloaderUnlocked() && OemUnlockUtils.isOemUnlockAllowed(mUm);
+        return !isBootloaderUnlocked() && mOemLockManager.canUserAllowOemUnlock();
     }
 
     private void updateOemUnlockOptions() {
         if (mEnableOemUnlock != null) {
-            updateSwitchPreference(mEnableOemUnlock,
-                    OemUnlockUtils.isOemUnlockEnabled(getActivity()));
+            updateSwitchPreference(mEnableOemUnlock, mOemLockManager.isOemUnlockAllowed());
             updateOemUnlockSettingDescription();
             // Showing mEnableOemUnlock preference as device has persistent data block.
             mEnableOemUnlock.setDisabledByAdmin(null);
@@ -2339,7 +2336,7 @@
             @Override
             public void onClick(DialogInterface dialog, int which) {
                 if (which == DialogInterface.BUTTON_POSITIVE) {
-                    OemUnlockUtils.setOemUnlockEnabled(getActivity(), true);
+                    mOemLockManager.setOemUnlockAllowedByUser(true);
                 }
             }
         };
@@ -2410,7 +2407,7 @@
                 if (mEnableOemUnlock.isChecked()) {
                     confirmEnableOemUnlock();
                 } else {
-                    OemUnlockUtils.setOemUnlockEnabled(getActivity(), false);
+                    mOemLockManager.setOemUnlockAllowedByUser(false);
                 }
             }
         } else {
@@ -2480,7 +2477,7 @@
                     confirmEnableOemUnlock();
                 }
             } else {
-                OemUnlockUtils.setOemUnlockEnabled(getActivity(), false);
+                mOemLockManager.setOemUnlockAllowedByUser(false);
             }
         } else if (preference == mMockLocationAppPref) {
             Intent intent = new Intent(getActivity(), AppPicker.class);
@@ -2821,7 +2818,7 @@
                     }
 
                     final List<String> keys = new ArrayList<String>();
-                    if (!showEnableOemUnlockPreference()) {
+                    if (!showEnableOemUnlockPreference(context)) {
                         keys.add(ENABLE_OEM_UNLOCK);
                     }
                     return keys;
@@ -2849,11 +2846,10 @@
                 oemUnlockSummary = R.string.oem_unlock_enable_disabled_summary_bootloader_unlocked;
             } else if (isSimLockedDevice()) {
                 oemUnlockSummary = R.string.oem_unlock_enable_disabled_summary_sim_locked_device;
-            } else if (!OemUnlockUtils.isOemUnlockAllowed(mUm)) {
-                // If the device isn't SIM-locked but OEM unlock is disabled by the system via the
-                // user restriction, this means either some other carrier restriction is in place or
-                // the device hasn't been able to confirm which restrictions (SIM-lock or otherwise)
-                // apply.
+            } else if (!mOemLockManager.canUserAllowOemUnlock()) {
+                // If the device isn't SIM-locked but OEM unlock is disallowed by some party, this
+                // means either some other carrier restriction is in place or the device hasn't been
+                // able to confirm which restrictions (SIM-lock or otherwise) apply.
                 oemUnlockSummary =
                         R.string.oem_unlock_enable_disabled_summary_connectivity_or_locked;
             }
@@ -2876,12 +2872,7 @@
      * Returns {@code true} if the bootloader has been unlocked. Otherwise, returns {code false}.
      */
     private boolean isBootloaderUnlocked() {
-        int flashLockState = PersistentDataBlockManager.FLASH_LOCK_UNKNOWN;
-        if (mOemUnlockManager != null) {
-            flashLockState = mOemUnlockManager.getFlashLockState();
-        }
-
-        return flashLockState == PersistentDataBlockManager.FLASH_LOCK_UNLOCKED;
+        return mOemLockManager.isDeviceOemUnlocked();
     }
 
 
diff --git a/src/com/android/settings/development/OemUnlockUtils.java b/src/com/android/settings/development/OemUnlockUtils.java
deleted file mode 100644
index cee3679..0000000
--- a/src/com/android/settings/development/OemUnlockUtils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.development;
-
-import android.content.Context;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.service.persistentdata.PersistentDataBlockManager;
-import android.util.Log;
-
-public class OemUnlockUtils {
-    private static final String TAG = "OemUnlockUtils";
-
-    /**
-     * Returns whether or not this device is able to be OEM unlocked.
-     */
-    static boolean isOemUnlockEnabled(Context context) {
-        PersistentDataBlockManager manager = (PersistentDataBlockManager)
-                context.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
-        return manager.getOemUnlockEnabled();
-    }
-
-    /**
-     * Allows enabling or disabling OEM unlock on this device. OEM unlocked
-     * devices allow users to flash other OSes to them.
-     */
-    static void setOemUnlockEnabled(Context context, boolean enabled) {
-        try {
-            PersistentDataBlockManager manager = (PersistentDataBlockManager)
-                    context.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
-            manager.setOemUnlockEnabled(enabled);
-        } catch (SecurityException e) {
-            Log.e(TAG, "Fail to set oem unlock.", e);
-        }
-    }
-
-    /**
-     * Returns {@code true} if OEM unlock is disallowed by user restriction
-     * {@link UserManager#DISALLOW_FACTORY_RESET} or {@link UserManager#DISALLOW_OEM_UNLOCK}.
-     * Otherwise, returns {@code false}.
-     */
-    static boolean isOemUnlockAllowed(UserManager um) {
-        final UserHandle userHandle = UserHandle.of(UserHandle.myUserId());
-        return !(um.hasBaseUserRestriction(UserManager.DISALLOW_OEM_UNLOCK, userHandle)
-                || um.hasBaseUserRestriction(UserManager.DISALLOW_FACTORY_RESET, userHandle));
-    }
-}
